找回密码
 立即注册
查看: 124|回复: 2

CAN总线 BUS_OFF

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-05-15 16:13:55
已绑定手机

1

主题

0

回帖

9

积分

新手上路

积分
9
发表于 2025-5-15 16:13:55 | 显示全部楼层 |阅读模式

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

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

使用道具 举报 送花

3

主题

743

回帖

197

积分

等待验证会员

积分
197
发表于 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. 增强型软件复位流程:
  1. c
  2. if(CANSTAT & 0x01) {    //检测BUS-OFF状态
  3.     CANAR = MR;
  4.     CANDR |= 0x04;      //强制进入复位模式
  5.     while(!(CANGSR & 0x80)); //等待模式切换完成
  6.    
  7.     CANAR = BTR0;       //重配波特率参数
  8.     CANDR = 0x01;       //同步段设置
  9.     //...完整重配所有通信参数
  10.    
  11.     CANAR = ACC0;       //复位验收滤波器
  12.     CANDR = 0x00;
  13.     //...恢复原有滤波器配置
  14.    
  15.     CANAR = MR;
  16.     CANDR &= ~0x04;     //退出复位模式
  17.     while(CANGSR & 0x80);//确认模式切换
  18. }
复制代码

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:443
  • 最近打卡:2025-06-13 08:57:40
已绑定手机

39

主题

2053

回帖

7054

积分

论坛元老

积分
7054
发表于 2025-5-15 16:40:50 | 显示全部楼层
使用这种方式是可以从BUS-OFF状态退出的:
  1.                                 sr = CanReadReg(SR);
  2.                                 if(sr & 0x01)                //判断是否有 BS:BUS-OFF状态
  3.                                 {
  4.                                         CANAR = MR;
  5.                                         CANDR &= ~0x04;  //清除 Reset Mode, 从BUS-OFF状态退出
  6.                                 }
复制代码


建议直接用32G例程包里面的CAN总线例程测试,最多修改波特率跟脚位通道,其他先不要修改,功能验证正常后再进行修改或者移植。
以下例程包里面都有CAN总线收发测试例子。
32G实验箱下载地址:https://www.stcai.com/syx
屠龙刀三下载地址:https://www.stcai.com/hxgnsyb
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-14 05:13 , Processed in 0.112541 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表