关于ADXL355 SPI通信的问题

我用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, "%d\r\n", recieveData);
 Lpuart_PutString(sendStr, strlen((char*)sendStr));
 Uart_PutString(sendStr, strlen((char*)sendStr));
 
 return 0;
}