我在主模式下使用STM32F205的SPI1.并且在事务期间永远不会设置RXNE标志.这是SPI初始化的一部分:
SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_SSI | SPI_CR1_SSM | SPI_CR1_SPE;
SPI1->CR2 = 0;
Run Code Online (Sandbox Code Playgroud)
然后我试图执行传输/接收单个字节:
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;
Run Code Online (Sandbox Code Playgroud)
这段代码停留在等待RXNE标志.我试着等待繁忙的旗帜BSY = 0而不是RXNE = 1SPI开始工作.似乎RXNE从未设置过.
小智 6
我问你的SPI通信是8位吗?(uint8_t result = SPI1-> DR).在STM32F051上我有同样的问题RXNE标志在收到1个字节后没有设置.问题是STM默认在16位后触发此标志.在STM32F0中,我找到了解决方案(它在F2中可能会相同):
RXNE标志根据SPIx_CR2寄存器中的FRXTH位值进行设置:如果FRXTH置1,则RXNE变为高电平并保持高电平,直到RXFIFO电平大于或等于1/4(8位).如果FRXTH清零(默认),则RXNE变为高电平并保持高电平,直到RXFIFO电平大于或等于1/2(16位).
因此,设置此位可以使用API指令执行:SPI_RxFIFOThresholdConfig(SPIx,SPI_RxFIFOThreshold_QF);
希望它有所帮助,来自波兰的祝福