发 帖  
原厂入驻New
[问答] PIC单片机与加速度传感器SPI通信收不到数?
280 单片机
分享
跪求各位大佬帮个忙,小弟必会重谢!!!
问题: PIC16LF1454与加速度传感器ADXL345的SPI通信,传感器初始化的时候我把ADXL345_OFSY 里写了0x05;然后我读 ADXL345_OFSY  的值, 用示波器看SDO(MOSI)上可以看到ADXL345_OFSY这个寄存器的地址,SDI(MISO)可以看到返回来的值0x05!说明初始化的时候是成功把0x05写进去了,但是读SBUF的值一直是0,也就是aa一直是0!!!跳不出循环,RA5这个引脚无法拉高,这是为什么啊!!主函数是这样的:
  1. void main(void)
  2. {
  3.     delayMs(100);     //上电延时
  4.     Init_CPU();
  5.     SPI_Init();
  6.     Init_ADXL345(); //给ADXL345_OFSY寄存器写0x05
  7.     int8_t aa = 1;
  8.     while(1)
  9.     {
  10.         RA5_PIN_OUT;
  11.         RA5_PIN_LOW;
  12.         while(aa!=0x05)
  13.         {
  14.             aa = adxl345_get_register_value(ADXL345_OFSY);
  15.         }
  16.         RA5_PIN_HIGH;
  17.     }
  18. }
复制代码
往从机寄存器里写值,第一个字节发地址,第二个字节发要写的值:
  1. void adxl345_set_register_value(uint8_t register_address,uint8_t register_value)
  2. {
  3.     uint8_t data_buffer[2] = {0, 0};
  4.     data_buffer[0] = ADXL345_SPI_WRITE & register_address;                                                                                                                                                                                                                                                               
  5.     data_buffer[1] = register_value;
  6.     SPI_Write(DEVID,data_buffer,2);
  7. }
复制代码
读从机寄存器的值,第一个字节先发地址,第二个字节随便发,这里发FF,读回来第一个字节无效,第二个字节是需求的寄存器值:
  1. uint8_t adxl345_get_register_value(uint8_t register_address)
  2. {
  3.     uint8_t data_buffer[2] = {0,0};
  4.     uint8_t register_value = 0;
  5.     data_buffer[0] = (ADXL345_SPI_READ |register_address) ;
  6.     data_buffer[1] = 0xFF;
  7.     register_value = SPI_Read(DEVID,data_buffer,2);
  8.     return register_value;
  9. }
复制代码
SPI写函数:
  1. unsigned char SPI_Write(unsigned char slaveDeviceId,
  2.                                         unsigned char* data,
  3.                                         unsigned char bytesNumber)
  4. {
  5.     unsigned char byte     = 0;
  6.     unsigned char tempByte = 0;
  7.     IF(slaveDeviceId == 1)
  8.     {
  9.         SPI_CS_LOW;
  10.     }
  11.     for(byte = 0; byte < bytesNumber; byte++)
  12.     {
  13.         SSP1BUF = data[byte];
  14.         while(SSPSTATbits.BF ==0);
  15.         while(PIR1bits.SSP1IF == 0);
  16.         tempByte = SSP1BUF;
  17.         SSP1IF = 0;
  18.     }
  19.     if(slaveDeviceId == 1)
  20.     {
  21.         SPI_CS_HIGH;
  22.     }
  23.     return bytesNumber;
  24. }
复制代码
SPI读函数:
  1. unsigned char SPI_Read(unsigned char slaveDeviceId,
  2.                                         unsigned char* data,
  3.                                         unsigned char bytesNumber)
  4. {
  5.      unsigned char   byte            = 0;
  6.     unsigned char   writeBuffer[2]  = {0, 0};
  7.     unsigned char   receiveBuffer[2] = {0 ,0};
  8.     unsigned char   reg_value;

  9.     for(byte = 0; byte < bytesNumber; byte++)
  10.     {
  11.         writeBuffer[byte] = data[byte];
  12.     }
  13.     if(slaveDeviceId == 1)
  14.     {
  15.         SPI_CS_LOW;
  16.     }

  17.     for(byte = 0; byte < bytesNumber; byte++)
  18.     {
  19.         SSP1BUF = writeBuffer[byte];
  20.         while(SSPSTATbits.BF ==0);
  21.         while(PIR1bits.SSP1IF == 0);
  22.         receiveBuffer[byte] = SSP1BUF;
  23.         SSP1IF = 0;
  24.      }

  25.     reg_value = receiveBuffer[1];  //第二个字节是要的寄存器的值

  26.     if(slaveDeviceId == 1)
  27.     {
  28.         SPI_CS_HIGH;
  29.     }   

  30.     return reg_value;
  31. }
复制代码


0
奖励6积分
2020-8-2 15:46:14   评论 分享淘帖 邀请回答
2个回答
SPI的初始电平对不对呢?
2020-8-3 08:47:26 1 评论

举报

1 条评论
  • 2020-8-3 09:54

    您指的是时序吗?SPI相位和极性我都试过了,传感器手册要求CPOL=1,CPHA=1;我在pic单片机配置CKE=0,CKP=1,只有这一种配置方式能看到SDI上的正确波形。

寄存器的配置很关键,与该功能的相关的寄存器都需要配置一下,以前我就经常在这方面犯错误。
2020-8-5 11:42:34 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表