我用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 configura
tion*/
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;
}