求助:mega32 读ADXL345 ID号一直读出 0xF2 的问题
最近在用MEGA32 读写ADXL3454线 SPI模式 读芯片ID(地址0x00)读出的都是0xf2与正常 0xe5有差异,请帮忙看下什么问题 谢谢代码
/****************************************************
CPU MEGA32L
时钟 3.6864MHz
编译 ICCAVR7.14
软件: 2010-07-25
//熔丝配置
**********************************************/
#include <iom32v.h>
#include <macros.h>
#include <eeprom.h>
#include <math.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define YES 0xff
#define NO 0x00
#define OK 0xaa
#define FAIL 0x00
#define ON 0xff
#define OFF 0x00
#define USE 0xaa
#define EMPTY 0x00
#define BTMEA_EN PORTC|=0x10 //允许电池测量PC4
#define BTMEA_DIS PORTC&=0xe7 //禁止电池测量PC4
#define LED_BLACK PORTC|=0x80 //RUN灯灭
#define LED_LIGHT PORTC&=0x7f //RUN灯亮
#define ADS_EN PORTC |= (1 << PC5) //PORTC|=0x20 //启动测量电源 PC5
#define ADS_DIS { PORTC &= ~(1 << PC5); ADCSR=0x00; }//禁止测量电源,关闭ADC
//#define LED_SET PORTD |= (1 << PD5) //位置高
//#define LED_CLR PORTD &= ~(1 << PD5) //位置低
#define TX_EN PORTC|=0x40 //串口发送使能 PC6
#define TX_DIS PORTC&=0xbf //禁止串口发送
#define FMCS_EN PORTC&=0xfb //M25P16有效
#define FMCS_DIS PORTC|=0x04 //禁止M25P16
#define CS_ON PORTB&=0XEF
#define CS_OFF PORTB|=0X10
/*---------------------------------------------------------------------*/
/*---------------------------------------------------------------------*/
//4MHz软件延时n us
voidDelayNus(uint n)
{
for(; n; n-- );
}
//4MHz软件延时0-250ms
voidDelayNms(uint m)
{
uchar i, j;
for(; m; m-- ){
for(i=0; i<192; i++){
for(j=0;j<3;j++);
}
}
}
//LED闪光,调试用
void LED(void)
{
LED_LIGHT ;
DelayNms(1);
LED_BLACK;
}
/*---------------------------------------------------------------------*/
/********************************************
串口发送1个字节
115.2Kbps传输1byte耗时0.1ms,
发送前等待串口空闲,限时0.5ms退出。
********************************************/
voidcomtx(uchar dat)
{
uint x;
UCSRB&=0xef;//禁止UART接收
for( x=2000; (UCSRA&0x20)!=0x20 && x; x-- );
UDR=dat;
for( x=2000; (UCSRA&0x20)!=0x20 && x; x-- );
UCSRB|=0x10;//允许UART接收
}
/**********************************
UART初始化
baud rate: 9600bps
**********************************/
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x02;
UCSRC = 0x86; //
UBRR =47; // 3.686M晶振 9600bps-47, 57600bps-7, 115200bps-3
UCSRB = 0x98; //接收中断
}
/**********************************
UART接收中断
**********************************/
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
uchar x, y;
uintchecksum1,checksum2; //checksum of ComReceiveData[]
x=UDR;
}
/**********************************
SPI 初始化主机模式,速率Fosc/2
**********************************/
void SPI_INIT(void)
{
FMCS_DIS;
CS_OFF;
// DDRB|=0xb0; //SCK MOSI SS 输出MISO输入
DDRB =0xbb;
//PORTB&=0xF0;
PORTB=0xFf; //SS PB4高电平,其余初始状态低电平
SPCR=0x50;
}
/**********************************
SPI 字节写
**********************************/
void SPI_Master_tx(uchar x)
{
SPDR=x;
while(!(SPSR&0x80));
}
/**********************************
SPI 字节读
**********************************/
uchar SPI_Master_re(void)
{
SPDR=0;
while(!(SPSR&0x80));
return SPDR;
}
/*------------------------------------------------------------------*/
/**************************
CPU设备初始化
**************************/
void init_devices(void)
{
uchar i;
uchar tm;
CLI();
//低功耗策略
PORTA = 0xf0; //PA0-PA3禁止上拉电阻防止影响AD627
DDRA= 0xf0; //PA0-PA3输入,其余输出
PORTB = 0xff;
DDRB= 0xbb; //PB6PB2输入,其余输出
PORTC = 0xf0;
DDRC= 0xff; //全输出
PORTD = 0xff;
DDRD= 0xe2; //PD0 PD2~PD4输入,其余输出
SPI_INIT(); //SPI 初始化
uart0_init();
}
/*------------------------------------------------------------------*/
voidmain(void)
{
uchar i;
uint m;
for(i=0;i<10;i++){//上电延迟等待电源稳定
DelayNms(100);
}
init_devices();
while(1)
{
CS_ON;
FMCS_EN;
DelayNus(100);
SPI_Master_tx(0x00);
m=SPI_Master_re();
DelayNus(100);
FMCS_DIS;
CS_OFF;
comtx(m);
DelayNms(100);
}
}
找到问题了 SPI 控制寄存器 时钟极性选错了 造成读出的数据移位 这个朋友,可以认识一下嘛~我现在adxl345始终读不出来~
页:
[1]