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,即使我查看调试器也是如此。
(我看到 CLK 和 MOSI 在我的逻辑分析仪上是活跃的,所以我确信从电气角度来看我的字节已经消失了。)
就像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 上没有数据的主要内容,如果未能解决你的问题,请参考以下文章