SPI 协议程序
SPI Protocol Procedure
嘿,我在自己的项目中使用 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);
}
他们这样做是因为这是 SPI 总线的性质,也是总线通信的完成方式。看:
数据传输
每个SPI时钟周期都是一次全双工数据传输。主机在 MOSI 引脚上发送一个位,从机读取它,而从机在 MISO 引脚上发送一个位,主机读取它。即使您只需要单向数据传输,此顺序也是正确的。
查看此图片(来自维基百科)
因此每次传输都涉及两个固定大小的移位寄存器(例如 8 位)。一个在主设备中,一个在从设备中。在每个时钟周期中,数据都会移动。如果您继续并输出足够多的脉冲(与寄存器的大小一样多),则主设备和从设备将交换寄存器值。现在您可以读取数据并继续。
当然,这还不是全部。还有
菊花链配置
在此配置中,多个从属设备连接到同一条 MISO 和 MOSI 线路链。每个从站的 MOSI 都连接到前一个从站的 MISO 等。(见下图)。使用此配置,一个完整周期的时钟脉冲现在是(设备数量)*(缓冲区大小)
有关详细信息,您还可以参阅 wikipedia。
结论
综上所述。为了让主机发送一个字节,他被迫也接收一个字节。该字节对通信没有价值。是一个虚拟字节,主机将其丢弃。为了接收一个字节,他也被迫发送一个字节。主机再次发送一个虚拟字节。通信的slave部分也是如此。
hoo2
嘿,我在自己的项目中使用 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);
}
他们这样做是因为这是 SPI 总线的性质,也是总线通信的完成方式。看:
数据传输
每个SPI时钟周期都是一次全双工数据传输。主机在 MOSI 引脚上发送一个位,从机读取它,而从机在 MISO 引脚上发送一个位,主机读取它。即使您只需要单向数据传输,此顺序也是正确的。
查看此图片(来自维基百科)
因此每次传输都涉及两个固定大小的移位寄存器(例如 8 位)。一个在主设备中,一个在从设备中。在每个时钟周期中,数据都会移动。如果您继续并输出足够多的脉冲(与寄存器的大小一样多),则主设备和从设备将交换寄存器值。现在您可以读取数据并继续。 当然,这还不是全部。还有
菊花链配置
在此配置中,多个从属设备连接到同一条 MISO 和 MOSI 线路链。每个从站的 MOSI 都连接到前一个从站的 MISO 等。(见下图)。使用此配置,一个完整周期的时钟脉冲现在是(设备数量)*(缓冲区大小)
有关详细信息,您还可以参阅 wikipedia。
结论
综上所述。为了让主机发送一个字节,他被迫也接收一个字节。该字节对通信没有价值。是一个虚拟字节,主机将其丢弃。为了接收一个字节,他也被迫发送一个字节。主机再次发送一个虚拟字节。通信的slave部分也是如此。
hoo2