Stm32 SPI协议程序

Stm32 SPI协议程序,stm32,spi,dummy-data,Stm32,Spi,Dummy Data,嘿,我在我自己的项目中使用ADS1292,我自己对SPI协议感到困惑 我在网上找到了一些代码,我发现它一次发送和接收 例如,我想向从设备发送0xFF 然后它首先发送数据并等待接收 当接收数据时,它发送一个伪字节,然后接收 谁能解释一下他们为什么这么做 uint8_t sEE_ReadByte(void) { return (sEE_SendByte(sEE_DUMMY_BYTE)); } uint8_t sEE_SendByte(uint8_t byte) { /*!< Loop

嘿,我在我自己的项目中使用ADS1292,我自己对SPI协议感到困惑

我在网上找到了一些代码,我发现它一次发送和接收

例如,我想向从设备发送0xFF

然后它首先发送数据并等待接收

当接收数据时,它发送一个伪字节,然后接收

谁能解释一下他们为什么这么做

uint8_t sEE_ReadByte(void)
{
  return (sEE_SendByte(sEE_DUMMY_BYTE));
}

uint8_t sEE_SendByte(uint8_t byte)
{
  /*!< Loop while DR register in not empty */
  while (SPI_I2S_GetFlagStatus(sEE_SPI, SPI_I2S_FLAG_TXE) == RESET);

  /*!< Send byte through the SPI peripheral */
  SPI_SendData(sEE_SPI, byte);

  /*!< Wait to receive a byte => I do not understand this point*/
  while (SPI_I2S_GetFlagStatus(sEE_SPI, SPI_I2S_FLAG_RXNE) == RESET);

  /*!< Return the byte read from the SPI bus */
  return (uint8_t)SPI_ReceiveData(sEE_SPI);
}
uint8\u看不见ReadByte(void)
{
返回(参见发送字节(参见伪字节));
}
uint8\u t见发送字节(uint8\u t字节)
{
/*!我不明白这一点*/
而(SPI_I2S_GetFlagsStatus(请参阅SPI,SPI_I2S_FLAG_RXNE)=重置);
/*!<返回从SPI总线读取的字节*/
返回(uint8)SPI接收数据(见SPI);
}

他们这样做是因为这是SPI总线的本质,也是总线通信的方式。看:

数据传输

每个SPI时钟周期都是全双工数据传输。主设备在MOSI引脚上发送一个位,从设备读取,而从设备在MISO引脚上发送一个位,主设备读取。即使只需要单向数据传输,此序列也是正确的

查看此图像(来自维基百科)

因此,每次传输都涉及两个固定大小的移位寄存器(ex为8位)。一个在主设备中,一个在从设备中。在每个时钟周期中,数据都会四处移动。如果继续并时钟输出足够多的脉冲(与寄存器大小一样多),则主寄存器和从寄存器将交换寄存器值。现在您可以读取数据并继续。 当然,这还不是全部。还有

菊花链配置

在这种配置中,多个从设备连接到同一条MISO和MOSI线路链。每个从机的MOSI连接到前一个从机的MISO等。。(见下图)。在这种配置下,整个周期的时钟脉冲现在为(设备数量)*(缓冲区大小)

有关更多信息,请参见

结论

由于上述原因。为了让主机发送一个字节,他必须同时接收一个字节。该字节没有用于通信的值。是一个伪字节,主机将丢弃它。为了接收一个字节,他被迫同时发送一个字节。主机再次传输一个伪字节。通信的从属部分也是如此


他们这样做是因为这是SPI总线的本质,也是总线通信的方式。看:

数据传输

每个SPI时钟周期都是全双工数据传输。主设备在MOSI引脚上发送一个位,从设备读取,而从设备在MISO引脚上发送一个位,主设备读取。即使只需要单向数据传输,此序列也是正确的

查看此图像(来自维基百科)

因此,每次传输都涉及两个固定大小的移位寄存器(ex为8位)。一个在主设备中,一个在从设备中。在每个时钟周期中,数据都会四处移动。如果继续并时钟输出足够多的脉冲(与寄存器大小一样多),则主寄存器和从寄存器将交换寄存器值。现在您可以读取数据并继续。 当然,这还不是全部。还有

菊花链配置

在这种配置中,多个从设备连接到同一条MISO和MOSI线路链。每个从机的MOSI连接到前一个从机的MISO等。。(见下图)。在这种配置下,整个周期的时钟脉冲现在为(设备数量)*(缓冲区大小)

有关更多信息,请参见

结论

由于上述原因。为了让主机发送一个字节,他必须同时接收一个字节。该字节没有用于通信的值。是一个伪字节,主机将丢弃它。为了接收一个字节,他被迫同时发送一个字节。主机再次传输一个伪字节。通信的从属部分也是如此

呼2