SPI协议程序

时间:2016-04-08 06:10:40

标签: 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 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);
}

1 个答案:

答案 0 :(得分:3)

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

数据传输

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

查看此图片(来自维基百科) enter image description here

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

菊花链配置

在此配置中,多个从设备连接到同一条MISO和MOSI线路。每个从机的MOSI连接到先前的从机MISO等。(见下图)。使用这种配置,现在是一个完整周期的时钟脉冲(器件数量)*(缓冲器的sizo)

enter image description here

有关详细信息,您还可以查看wikipedia

<强>结论

由于上述原因。为了让主机发送一个字节,他也被迫接收一个字节。该字节没有通信值。是一个虚拟字节,主设备丢弃它。并且为了接收一个字节,他也被迫传输一个字节。主设备再次发送一个虚拟字节。通信的奴隶部分也是如此。

hoo2