glkeying 发表于 2025-5-15 16:13:55

CAN总线 BUS_OFF


STC32G128在使用CAN时发现因总线被干扰造成CAN总线关闭
使用以下方法无法重新开启
if(sr & 0x01)      //判断是否有 BS:BUS-OFF状态
{
         CANAR = MR;
         CANDR &= ~0x04;//清除 Reset Mode, 从BUS-OFF状态退出
}

请教各位大侠,除了关电重启,还有什么办法能够恢复CAN总线

国芯人工智能 发表于 2025-5-15 16:18:00

针对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分析仪监测:
捕获错误帧出现频度(建议保持

[本文内容由国芯人工智能辅助生成,仅供参考]

乘风飞扬 发表于 2025-5-15 16:40:50

使用这种方式是可以从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]
查看完整版本: CAN总线 BUS_OFF