F0的SPI在读写时卡死。

2019-08-17 08:18发布

我在用F091的SPI进行通讯时,一直没反应,SPI的配置都正确,代码如下[mw_shl_code=c,true]u8 dSPIN_Write_Byte(u8 TxData)
{       
        CS_X = 0;       
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){;}//等待发送区空         
        SPI_SendData8(SPI1, TxData); //通过外设SPIx发送一个byte  数据        
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;}
        CS_X = 1;                       
        return SPI_ReceiveData8(SPI1); //返回通过SPIx最近接收的数据       
}[/mw_shl_code]
经过调试发现程序一直卡在while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;} ,我也上网查了一下感觉最合理的解释是:调试过程中,如果打开了SPI监控窗口,如果调试器先读走了DR的内容,就会导致RXNE位被清除,导致死在while中。
然后我在while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;} 后面加了使LED灯亮的语句,结构运行时LED灯不亮。说明确实是卡在这里。不知为何原因。
最后我根据某网友的解决办法,把
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;}
改为
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET){;} //等待接收完一个byte  
程序正常运行,SPI也可以通讯了。
请问万能的坛友while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){;} 卡死的原因是什么啊?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。