STM32F407 SPI在读取LIS3DSH的数据时


uint8_t SPI_Rx(uint8_t address)
{
GPIO_ResetBits(GPIOE,GPIO_Pin_3);
address    =   (0x80) | (address);

while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_TXE));     
SPI_I2S_SendData(SPI1,address);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_RXNE));
SPI_I2S_ReceiveData(SPI1);

while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_TXE));     
SPI_I2S_SendData(SPI1,0x00);
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_RXNE));
SPI_I2S_ReceiveData(SPI1);

GPIO_SetBits(GPIOE,GPIO_Pin_3);
return SPI_I2S_ReceiveData(SPI1);

嗨,您看到的是LIS3DSH传感器的SPI读取功能。首先,在我发送地址知识后,SPI RX缓冲器接收LIS3DSH传感器的数据。但是为什么它需要通过发送"LIS3DSH"来接收LIS3DSH传感器的数据呢;0x00"?简单地说,为什么我们需要在已经收到数据的情况下再次发送其他数据?提前,谢谢。

从LIS3DSH的寄存器读取数据时,整个SPI事务为两个字节长:

  • 字节1:主机向传感器发送寄存器地址(包括读/写标志(
  • 字节2:传感器向主机发送寄存器值

然而,SPI是一个全双工协议。对于每个比特和字节,主设备和从设备(传感器(都发送数据。所以真正的通信实际上看起来是这样的:

  • 字节1
    • 主机发送寄存器地址
    • 从设备发送0或任何随机值
  • 字节2
    • Master发送0
    • 从设备发送寄存器值

这就是你在代码中看到的:

while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_TXE));  // Wait for SPI bus to be ready
SPI_I2S_SendData(SPI1,address);                    // Submit byte 1 to be sent
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_RXNE)); // Wait for byte 1 from slave
SPI_I2S_ReceiveData(SPI1);                         // Retrieve byte 1 from slave and ignore it

while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_TXE));  // Wait for SPI bus to be ready
SPI_I2S_SendData(SPI1,0x00);                       // Send 0 as byte 2
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_RXNE)); // Wait for byte 2 from slave
SPI_I2S_ReceiveData(SPI1);                         // Retrieve byte 2 and ??
GPIO_SetBits(GPIOE,GPIO_Pin_3);                    // Deassert CS?
return SPI_I2S_ReceiveData(SPI1);                  // Retrieve byte 2 again and return it

最后一部分有些奇怪。CCD_ 1在最后被调用两次,可能假设它将返回两次相同的值。如果只调用一次,它可能会更干净。

最新更新