原代码如下,在优化等级为默认时SPI通信正常:
static uint8_t TM16XX__WriteDate(uint8_t SendByte)
{
uint8_t retry=0;
while (RESET == SPI_I2S_Flag_Status_Get(SPI2, SPI_I2S_FLAG_TE))
{
retry++;
if (retry > 200)
return 0;
}
/* send byte through the SPI0 peripheral */
SPI_I2S_Data_Transmit(SPI2, ~SendByte);
/* wait to receive a byte */
while (RESET == SPI_I2S_Flag_Status_Get(SPI2, SPI_I2S_FLAG_RNE))
{
retry++;
if (retry > 200)
return 0;
}
return SPI_I2S_Data_Get(SPI2);
}
逻辑分析仪显示数据通信正常
当优化等级选为Os balanced时候,如图所示
逻辑分析仪显示数据通信不正常,发命令后无法收到数据
经研究发现代码更改如下,SPI通讯则又恢复正常
static uint8_t TM16XX__WriteDate(uint8_t SendByte)
{
uint8_t retry=0;
while (RESET == SPI_I2S_Flag_Status_Get(SPI2, SPI_I2S_FLAG_TE))
{
retry++;
if (retry > 200)
return 0;
}
/* send byte through the SPI0 peripheral */
SPI_I2S_Data_Transmit(SPI2, ~SendByte);
/* wait to receive a byte */
while (RESET == SPI_I2S_Flag_Status_Get(SPI2, SPI_I2S_FLAG_RNE))
{
SPI_I2S_Data_Get(SPI2);
SPI_I2S_Flag_Status_Get(SPI2, SPI_I2S_FLAG_OVER);
retry++;
if (retry > 200)
return 0;
}
return SPI_I2S_Data_Get(SPI2);
}
具体产生机理未查清楚,可能是SPI在传输过程中产生溢出,需清除OVER标志位
但单步调试又无法查到问题。其原因有一位博主提到过“RXNE标志位在使用过程中,一定不要查看SPI寄存器,特别是单步过程,因为RXNE在SPI数据寄存器读取过程中,会硬件清零。而单步过程中,如果选择了查看SPI总线寄存器,SPI数据寄存器会被KEIL读取,此时RXNE会被清零,而是的RXNE循环判断无法退出,造成死机。 ”
原文链接:https://blog.csdn.net/weixin_42094842/article/details/107364527