解决KEIL5 更改优化等级由默认改为Os时SPI全双工通信异常问题

原代码如下,在优化等级为默认时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

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值