admin管理员组文章数量:1582013
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通信断线在干扰消失后无法自动恢复。
版权声明:本文标题:STM32单片机CAN干扰后无法自动恢复问题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1727891909a1136408.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论