STM32F205未设置SPI RXNE标志

时间:2014-10-28 13:47:51

标签: stm32 spi

我在主模式下使用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从未设置过。

3 个答案:

答案 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;