STM32F0 SPI 环回 - MISO 上没有数据

Posted

技术标签:

【中文标题】STM32F0 SPI 环回 - MISO 上没有数据【英文标题】:STM32F0 SPI loopback - No data on MISO 【发布时间】:2014-05-11 06:50:00 【问题描述】:

我正在尝试在我的 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,即使我查看调试器也是如此。

(我看到 CLKMOSI 在我的逻辑分析仪上是活跃的,所以我确信从电气角度来看我的字节已经消失了。)

就像STM32从来没有收到过字节,即使MISO引脚连接在MOSI引脚上......

为什么?

【问题讨论】:

【参考方案1】:

这是因为在 STM32F0 上,SPI_I2S_FLAG_RXNE 标志仅在 MISO 上接收到 16 位(即 2 个字节)时默认设置销。

如果你发送了 2 个字节并且 那么while 循环,你应该很快退出循环。

参考手册说(SPI status flags部分):

根据 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 事件。 (默认值)

【讨论】:

以上是关于STM32F0 SPI 环回 - MISO 上没有数据的主要内容,如果未能解决你的问题,请参考以下文章

STM32F0 在 SPI 接收中断时从 STOP 退出

STM32F0xx HAL 库使用问题记录

笔记之STM32F0芯片SPI_DMA的使用(HAL库)

笔记之STM32F0芯片SPI_DMA的使用(HAL库)

笔记之STM32F0芯片SPI_DMA的使用(HAL库)

STM32发现F3 SPI环回RXFIFO收不到数据