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在最后被调用两次,可能假设它将返回两次相同的值。如果只调用一次,它可能会更干净。