admin管理员组

文章数量:1582038

STM32单片机CAN干扰后无法自动恢复问题

    • 问题描述
    • 问题复现
    • 原因分析
    • 结论

问题描述

项目现场出现CAN通信失效问题,需要重启才能恢复。检查程序在CAN错误计数大于127时是会自动调用初始化,按理不需要重启就能自动恢复。

问题复现

1、使用CAN盒模拟CMU数据,以2ms为周期持续向某一个BMU发送CAN数据,持续时间超过10s后会导致BMU通信断线,且无法自动恢复;
2、使用信号发生器产生一定频率和幅值的干扰信号,将信号接入到CAN通信的CAN_H和CAN_L两根线上,CMU发送查询命令后,BMU无回复,BMU通信离线。BMU通信离线因干扰信号的幅值不同会有两种情况,一种是干扰信号幅值小于10V时,干扰信号消失后BMU通信可以自动恢复正常,另一种是干扰信号幅值大于10V时,干扰信号消失后BMU通信需要重新上电才能恢复。
针对以上问题,采用如下方案验证分析:
1、使用CAN盒模拟CMU数据增大CAN通信的负载率,对BMU程序进行在线仿真,通过BMU通信断线时的程序运行状态分析通信断线的原因;
2、使用信号发生器模拟干扰信号,对BMU程序进行在线仿真,比较不同干扰状态下CAN寄存器状态的差异,根据寄存器状态分析CAN通信异常的原因。

原因分析

1、使用CAN盒模拟CMU数据导致的通信异常情况,分析程序发现是因为CAN通信数据更新频率太大,导致程序一直处于CAN通信接收中断中,无法进行喂狗操作,导致看门狗复位,看门狗连续复位3次后BMU进入BOOTLoader状态。(在实际项目中基本不会出现通信数据更新频率太大的情况,所以排除此原因)。
2、干扰信号导致出现BMU通信中断的情况,目前可能的原因是外部干扰信号传导到CAN通信数据线上,导致通信断线,过大的外部干扰信号导致CAN模块失效,无法自动恢复正常通信状态,主要分析一下两种情况。
1)、在干扰信号小于10V的情况下,对BMU进行在线仿真,记录CAN寄存器状态,将此状态与没有干扰信号时的CAN寄存器状态相比较,分析异常寄存器的出现原因;
2)、在干扰信号大于10V的情况下,对BMU进行在线仿真,记录CAN寄存器状态,将此状态与没有干扰信号时的CAN寄存器状态以及干扰信号幅值小于10V时的寄存器状态相比较,分析异常寄存器的出现原因。

结论

1、当干扰信号较小时(幅值小于10V),CAN模块可以正常工作,错误计数器计数大于127后CAN 模块正常初始化,干扰信号消失后,CAN通信自动恢复正常;
2、当干扰信号较大时(幅值大于等于10V),会导致CAN模块硬件初始化标志置位,CAN模块进入初始化状态,如图5(CAN初始化流程)所示,正常初始化流程硬件初始化状态跟随软件初始化标志变化,标志为1时状态为1,标志为0时状态为0,初始化流程会检查标志和状态是否一致,若不一致,会导致初始化失败。当干扰信号较大时,直接导致硬件初始化状态置1,而此时软件初始化标志是0,状态和标志不一致,导致初始化失败,CAN通信错误计数器不再计数,无法再次执行初始化命令,导致BMU通信断线在干扰消失后无法自动恢复。

本文标签: 单片机干扰