STM32F0 SPI环回 - MISO上没有数据

时间:2014-03-31 18:58:45

标签: stm32 spi

我正在尝试环回STM32F0上的SPI总线(发现板, MISO 引脚连接到 MOSI 引脚)。

我正在关注教程Discovering the STM32 Microcontroller,(2014年1月18日版),练习6.1:SPILoopback

STM32配置为主设备。

为了向MOSI引脚发送一个字节,作者写道:

SPI_I2S_SendData (SPIx, *tbuf++);

其中:

  • SPIx 是我要发送数据的SPI总线
  • tbuf uint8 (换句话说, unsigned char ...)我想在公交车上发送

为了从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 引脚上......

为什么?

1 个答案:

答案 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);
  • SPI_RxFIFOThreshold_QF:如果FIFO级别大于或等于1/4,则会生成RXNE事件。
  • SPI_RxFIFOThreshold_HF:如果FIFO级别大于或等于1/2,则生成RXNE事件。 (默认值)