我在主模式下使用 STM32F205 的 SPI1。 RXNE 标志在事务期间从不设置。这是SPI初始化的一部分:
SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_SSI | SPI_CR1_SSM | SPI_CR1_SPE;
SPI1->CR2 = 0;
然后我尝试执行单个字节的传输/接收:
while(!(SPI1->SR & SPI_FLAG_TXE)) {} // wait for compeltion of the previous Tx
SPI1->DR = 0xAB; // transmit some byte
while(!(SPI1->SR & SPI_FLAG_RXNE)) {} // wait for byte to be received
uint8_t result = SPI1->DR;
此代码停留在等待 RXNE 标志处。我试图等待忙标志
BSY = 0
而不是 RXNE = 1
SPI开始工作。似乎从未设置过 RXNE。
最佳答案
我问你的SPI通信是8位的? (uint8_t 结果 = SPI1->DR)。在 STM32F051 上,我遇到了同样的问题,接收 1 个字节后未设置 RXNE 标志。问题是STM默认在16位后触发这个标志。
在 STM32F0 中,我找到了解决方案(它可能在 F2 中是相同的):
RXNE 标志的设置取决于 SPIx_CR2 寄存器中的 FRXTH 位值: 如果 FRXTH 被设置,RXNE 变高并保持高电平,直到 RXFIFO 电平大于或等于 1/4(8 位)。如果 FRXTH 清零(默认),RXNE 变高并保持高电平,直到 RXFIFO 电平大于或等于 1/2(16 位)。
所以设置这个位,你可以使用 API 指令来做到这一点:
SPI_RxFIFOThresholdConfig(SPIx, SPI_RxFIFOThreshold_QF);
希望能帮助到你,
来自波兰的祝福
关于STM32F205 SPI RXNE 标志未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26610019/