我正在尝试环回STM32F0上的SPI总线(发现板, MISO 引脚连接到 MOSI 引脚)。
我正在关注教程Discovering the STM32 Microcontroller,(2014年1月18日版),练习6.1:SPILoopback 。
STM32配置为主设备。
为了向MOSI引脚发送一个字节,作者写道:
SPI_I2S_SendData (SPIx, *tbuf++);
其中:
为了从MISO引脚接收这个字节,他写道:
while (SPI_I2S_GetFlagStatus (SPIx, SPI_I2S_FLAG_RXNE) == RESET);
if (rbuf)
{
*rbuf++ = SPI_I2S_ReceiveData(SPIx);
...
...
标志 SPI_I2S_FLAG_RXNE 应该是 SET ,因为我将数据发送到 MOSI 引脚,因为 MOSI 引脚连接到 MISO 引脚。
我永远不会从 while 循环出去( SPI_I2S_FLAG_RXNE 永远不会 SET ,即使我查看调试器。
(我看到 CLK 和 MOSI 在我的逻辑分析仪上处于活动状态,所以我确定我的字节从电气角度出发。)< / p>
就像STM32从未接收到该字节一样,即使 MISO 引脚连接在 MOSI 引脚上......
为什么?
答案 0 :(得分:1)
这是因为在 STM32F0 上,只有在 MISO 上收到16位(所以2个字节)时,才会默认设置标志 SPI_I2S_FLAG_RXNE 销。
如果您发送2个字节而然后 循环时,则应该非常快地退出循环。
参考手册表示(部分 SPI状态标志):
根据SPIx_CR2寄存器中的FRXTH位值设置RXNE标志:
如果设置了FRXTH,则RXNE变为高电平并保持高电平,直到RXFIFO电平大于或等于1/4(8位)。
如果FRXTH清零,则RXNE变为高电平并保持高电平,直到RXFIFO电平大于或等于1/2(16位)。
因此,如果您希望仅在收到1个字节时设置标志 SPI_I2S_FLAG_RXNE ,则应使用以下函数:
SPI_RxFIFOThresholdConfig (SPIx, SPI_RxFIFOThreshold_QF);