传感技术
直播中

贾埃罗

7年用户 1709经验值
私信 关注
[问答]

ADXL355 SPI通信无法读到正确的DEVID_AD值怎么解决?

我用ST的开发板与ADXL355用SPI通信,无法读到正确的DEVID_AD值。
现象是:
间隔100ms读一次DEVID_AD(SPI发送一个字节0x00,每次都一样),每次上电前五次的值分别是0x00、0xAD、0x1D、0xED、0x01,这太巧合了从0xAD开始分别为ADXL355前4个寄存器的值,我认为预期结果应该是读出全是DEVID_AD的复位值0xAD。目前不能判断ADXL355有没有正常工作和通信,并且不知道问题出在哪里,希望在这里找到答案。

我用示波器检查过SPI的MOSI、MISO、SCK,波形皆正常。

我使用的硬件如下:
1、MCU:STM32L051C8
2、ADXL355评估板 EVAL-ADXL355-PMDZ

代码如下
GPIO:MOSI、MISO、SCK都为复用推挽输出,复用功能为SPI1;NSS为推挽输出,使用软件控制,此管脚一直拉低。
SPI驱动:
void SPI1_Init(void)
{
LL_SPI_InitTypeDef SPI_InitStruct;
LL_SPI_DeInit(SPI1);
/* SPI1 parameter configuration*/
SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;                               //全双工
SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;                                               //SPI主模式
SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;                                     //数据宽度为8bit
SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;                                   //CPOL=0
SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE;                                      //CPHA=0
SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;                                                          //软件片选
SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV4;                 //时钟为APB2时钟4分频,APB2时钟为16M
SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;                                                   //先发送最高位
SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;         //关闭CRC校验
SPI_InitStruct.CRCPoly = 7;
LL_SPI_Init(SPI1,  SPI_InitStruct);
LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA);                       //使用motorola协议
//LL_SPI_EnableIT_RXNE(SPI1);
LL_SPI_Enable(SPI1);           //使能SPI
}


读取测试代码:
uint8_t ADXL355_SPI_Read(void)
{
uint8_t txData;
uint8_t ui8address = 0x00;
uint8_t recieveData = 0;
txData = (ui8address << 1)|0x01;
LL_SPI_TransmitData8(SPI1, txData);   //SPI发送一个字节
while(!LL_SPI_IsActiveFlag_TXE(SPI1));  //等待发送完成
while(!LL_SPI_IsActiveFlag_RXNE(SPI1));  //等待接收完成
recieveData = LL_SPI_ReceiveData8(SPI1); //读一个字节

uint8_t sendStr[20];
memset(sendStr, 0x00, sizeof(sendStr));
sprintf((char*)sendStr, "%drn", recieveData);
Lpuart_PutString(sendStr, strlen((char*)sendStr));
Uart_PutString(sendStr, strlen((char*)sendStr));

return 0;
}






                                                               

更多回帖

发帖
×
20
完善资料,
赚取积分