我在主模式下使用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从未设置过。
答案 0 :(得分:5)
我问你的SPI通信是8位吗? (uint8_t result = SPI1-> DR)。在STM32F051上我有同样的问题RXNE标志在收到1个字节后没有设置。问题是STM默认在16位后触发此标志。 在STM32F0中,我找到了解决方案(它在F2中可能会相同):
根据SPIx_CR2寄存器中的FRXTH位值设置RXNE标志:如果FRXTH置1,则RXNE变为高电平并保持高电平,直到RXFIFO电平大于或等于1/4(8位)。如果FRXTH清零(默认),则RXNE变为高电平并保持高电平,直到RXFIFO电平大于或等于1/2(16位)。
所以设置这个位你可以使用API指令来做到这一点: SPI_RxFIFOThresholdConfig(SPIx,SPI_RxFIFOThreshold_QF);
希望它有所帮助, 来自波兰的祝福
答案 1 :(得分:2)
仅建议:
SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_SSI | SPI_CR1_SSM | SPI_CR1_SPE;
SPI1->CR2 = 0;
在写入CR2寄存器之前,您正在使用SPI。反转上述内容或仅在写入CR2后启用SPI。
答案 2 :(得分:0)
STM32L072CZ
我遇到了同样的问题。
我的解决方案是启用SPI_CR2_SSOE
位。
我仍然没有使用SPI1从选择引脚来选择从器件,我正在使用软件GPIO引脚。
SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_BR | SPI_CR1_SSM;
SPI1->CR2 = SPI_CR2_SSOE |SPI_CR2_RXNEIE;
SPI1->CR1 |= SPI_CR1_SPE;