xcljlong 发表于 2012-7-24 10:53:57

求助: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);
       
    }
       
}


xcljlong 发表于 2012-7-24 15:25:53

找到问题了 SPI 控制寄存器 时钟极性选错了 造成读出的数据移位

lyreliu 发表于 2012-11-24 10:34:05

这个朋友,可以认识一下嘛~我现在adxl345始终读不出来~
页: [1]
查看完整版本: 求助:mega32 读ADXL345 ID号一直读出 0xF2 的问题