CAN总线 BUS_OFF
STC32G128在使用CAN时发现因总线被干扰造成CAN总线关闭
使用以下方法无法重新开启
if(sr & 0x01) //判断是否有 BS:BUS-OFF状态
{
CANAR = MR;
CANDR &= ~0x04;//清除 Reset Mode, 从BUS-OFF状态退出
}
请教各位大侠,除了关电重启,还有什么办法能够恢复CAN总线
针对STC32G128系列MCU在CAN总线BUS-OFF状态下的恢复问题,经分析可能存在以下技术难点及解决方案:
一、BUS-OFF恢复失效的潜在原因
1. 状态机切换时序异常:
退出复位模式时未满足TSM状态机的最小等待时间(典型值128个CAN时钟周期)
模式切换未通过CANGSR寄存器的CHG位状态验证
2. 错误计数器残留:
TEC(发送错误计数器)未完全复位,仍超过127的BUS-OFF阈值
未清除CANESTAT寄存器的ERRWRN位导致错误状态锁存
3. 中断服务异常:
BOS(BUS-OFF状态)中断标志未及时清除
未正确处理ERRI中断服务流程
二、深度恢复方案
1. 增强型软件复位流程:
c
if(CANSTAT & 0x01) { //检测BUS-OFF状态
CANAR = MR;
CANDR |= 0x04; //强制进入复位模式
while(!(CANGSR & 0x80)); //等待模式切换完成
CANAR = BTR0; //重配波特率参数
CANDR = 0x01; //同步段设置
//...完整重配所有通信参数
CANAR = ACC0; //复位验收滤波器
CANDR = 0x00;
//...恢复原有滤波器配置
CANAR = MR;
CANDR &= ~0x04; //退出复位模式
while(CANGSR & 0x80);//确认模式切换
}
2. 错误计数器复位机制:
访问CANESTAT寄存器主动清零TEC/REC
启用自动恢复功能(设置CANMC的ABO位)
监控CANERR的EWRNLVL阈值设置
3. 总线同步增强处理:
发送11位连续隐性位强制同步
增加128次总线空闲检测机制
启用CANBT的SILENT模式进行静默监听
三、抗干扰增强措施
1. 硬件层防护:
增加共模扼流圈(CMC)和TVS管
优化终端电阻匹配(建议使用1%精度的120Ω电阻)
实施电源隔离(推荐使用ADM3053系列隔离收发器)
2. 软件容错机制:
实现双看门狗机制(独立WDT和窗口WDT)
增加BUS-OFF事件统计计数器
开发动态参数调整算法(自适应波特率补偿)
四、调试建议
1. 使用CAN分析仪监测:
捕获错误帧出现频度(建议保持
[本文内容由国芯人工智能辅助生成,仅供参考] 使用这种方式是可以从BUS-OFF状态退出的:
sr = CanReadReg(SR);
if(sr & 0x01) //判断是否有 BS:BUS-OFF状态
{
CANAR = MR;
CANDR &= ~0x04;//清除 Reset Mode, 从BUS-OFF状态退出
}
建议直接用32G例程包里面的CAN总线例程测试,最多修改波特率跟脚位通道,其他先不要修改,功能验证正常后再进行修改或者移植。
以下例程包里面都有CAN总线收发测试例子。
32G实验箱下载地址:https://www.stcai.com/syx
屠龙刀三下载地址:https://www.stcai.com/hxgnsyb
页:
[1]