已回答假定已回答

ADXL362的SPI读取数据错误

KenHoo 在 2013-5-14 詢問的問題
最後回覆由adi_rock於2013-9-24提供

工程师们好,我在使用PIC24单片机与ADXL362使用SPI通信时出现了读取数据错误的问题,因此想请教一下。

我在读取相应寄存器的值得时候,数据总是在最后三位或者两位出错,但是又没有错得很多,比如我写入0xFA读出来是0xF8,写入0x96读出来是0x94,包括器件ID也是读取时有几位出错,我一开始不知道是写的程序出了问题还是读的,就尝试写入了软复位0x52到软复位寄存器,结果读取出来之前写过的其他寄存器的值都被置0了,我认为可能是读取的问题,但是不知道出错在哪,我尝试调整过主机的分频比,有时候调到某个值就能正确读取,但是过一段时间相同的程序又无法正确读取,而且每次错误读取的值都是一样的,并非随机的代码,不知道有哪位能够帮助一下?以下附上SPI部分的代码,新手代码写得不好请包涵:

#include <p24fj64ga006.h>
#include "XL362.h"
#include "xl362_io.h"
unsigned char RESERED[100];  /* reseve zone for ICD2 */

 

 


#define CS_SPI  _RG9

 

void delay(unsigned int del);

unsigned char b;
unsigned char a;

void SPI2Init();
unsigned char WriteSPI2Buf(unsigned char k);
unsigned char xl362_read(unsigned char addr);
void xl362_wr(unsigned char addr,unsigned char data);
void xl362_init();

int    main(void)
{
    TRISD = 0x0000; 
  TRISF = 0x0000;  
init();
SPI2Init();
xl362_init();
b=xl362_read(0x00);
a=xl362_read(0x01);
  while(1)
  {     

    display();
    delay(10);
  }
      
}


void delay(unsigned int del)
{
  unsigned int i;
  while (del --)
  {
    for (i = 0; i < 890; i++);  
  }
}
/*=====================SPI===================*/
void SPI2Init()
{
IEC2bits.SPI2IE=0;
   SPI2CON1 =0x033f;   //CKE=1 CKP =0  主控模式
SPI2CON2 = 0;
    SPI2CON1bits.SPRE=0b000; //8:1  辅助
   SPI2CON1bits.PPRE=0b10;  //4:1  主
   SPI2STAT =0x8000;     //使能
TRISGbits.TRISG9 =0;
CS_SPI = 1;

}

unsigned char WriteSPI2Buf(unsigned char k)
{
delay(1);
SPI2BUF=k;                       //写入需要发送的数据
while(!SPI2STATbits.SPIRBF);      //等待发送和接受完成
return SPI2BUF;                  //返回接收的数据
delay(1);
}

unsigned char xl362_read(unsigned char addr)
{
    uchar k;
delay(1);
    CS_SPI=0;
delay(1);
    k=WriteSPI2Buf(XL362_REG_READ);
    k=WriteSPI2Buf(addr);
    k=WriteSPI2Buf(0xff);
delay(1);
    CS_SPI=1;
delay(1);
    return k;
}

void xl362_wr(unsigned char addr,unsigned char data)
{
    uchar k;
delay(1);
    CS_SPI=0;
delay(1);
    k=WriteSPI2Buf(XL362_REG_WRITE);
    k=WriteSPI2Buf(addr);
    k=WriteSPI2Buf(data);  
    CS_SPI=1;
}

void xl362_init()
{
// xl362_wr(0x20,0xFA);
// xl362_wr(0x21,0x00);
// xl362_wr(0x23,0x96);
// xl362_wr(0x24,0x00);
// xl362_wr(0x25,0x1E);
// xl362_wr(0x27,0x3F);
// xl362_wr(0x2B,0x40);
// xl362_wr(0x2D,0x0A);
// xl362_wr(0x1f,0x52);

}

結果