当前位置: 首页 > news >正文

CAN 数据丢帧?别只加 FIFO,看看接收过载与错误处理

摘要:CAN 总线波形正常,但上位机偶尔收不到某一帧数据?或者节点突然进入“被动错误”状态?不是波特率问题,而是接收 FIFO 溢出或错误计数器触发的自我保护。本文解析 CAN 的“隐身杀手”——错误帧。


一、问题描述(现象)

**CAN 总线负载率只有 30%,理论上不会丢包;

但监控软件偶尔抓不到报文;

或者某个节点突然“失联”,示波器看总线还在跳,但它就是不回 ACK。**

很多工程师的排查方向是:

  1. FIFO 深度不够?

  2. 中断里处理太慢?

  3. 换个更强的 MCU?


二、原理分析

1. 物理模型

CAN 控制器有一套自治的错误处理机制

接收报文 -> [Acceptance Filter] -> [FIFO] -> [CPU Interrupt]

2. 核心参数

  • FIFO 深度:通常只有 3 级(STM32)。

  • Error Counter(错误计数器):TEC / REC。

  • State(节点状态):Active -> Passive -> Bus Off。

3. 反直觉真相

CAN 丢帧通常不是“没收到”,而是“被硬件丢弃了”。

  • FIFO 溢出:中断处理慢了一点点,第 4 帧进来,硬件直接丢弃,且不通知你。

  • 错误被动(Error Passive):节点发送错误过多,被禁止主动发送,只能被动接收。

  • Bus Off:节点自我隔离,彻底沉默。


三、工程级解决方案

方案 1:必须处理 FIFO 溢出(软件解法)

不要指望 FIFO 无限缓存。

// 在 CAN 中断里 if (__HAL_CAN_GET_FLAG(&hcan, CAN_FLAG_FOV0)) { __HAL_CAN_CLEAR_FLAG(&hcan, CAN_FLAG_FOV0); // 记录一次溢出错误 can_fifo_overflow_cnt++; }

最佳实践:

  • 中断里只做标记,不做复杂处理。

  • 在任务线程中处理 CAN 数据。

方案 2:监控错误计数器(救命稻草)

在调试阶段,把错误计数器读出来。

uint8_t rec = (hcan.Instance->ESR >> 24) & 0xFF; // REC uint8_t tec = (hcan.Instance->ESR >> 16) & 0xFF; // TEC

判读标准:

  • REC/TEC > 96 → 进入 Error Passive。

  • TEC > 255 → Bus Off。

方案 3:Bus Off 自动恢复(量产必加)

默认情况下,Bus Off 后需要手动复位。

自动恢复流程:

  1. 检测到 Bus Off 标志。

  2. 等待 128 次连续 11 个隐性位。

  3. 重新初始化 CAN 外设(HAL_CAN_Init)。


四、选型避坑建议

  1. 不要屏蔽错误中断:ERROR 中断是 CAN 的“黑匣子”,必须开启。

  2. 验收滤波器(Filter)

    • 列表模式(List)适合节点少、ID 固定的场景。

    • 掩码模式(Mask)适合批量 ID 过滤。

  3. 不要过度降噪:有些工程师为了“稳”把所有错误帧都屏蔽,结果总线真正出问题时你完全不知道。


五、总结 Checklist

  • [ ] 是否开启了 CAN ERROR 中断?

  • [ ] FIFO 溢出时是否有计数或日志?

  • [ ] Bus Off 后是否有自动恢复机制?

  • [ ] 验收滤波器是否配置正确(没把 ID 过滤掉)?


六、写在最后(关注我,少走弯路)

我是 gqqsherry,一个拒绝调包、专注底层逻辑的嵌入式工程师。

CAN 的错误处理机制是“最不像单片机外设”的部分,它更像一个微型操作系统。

关注我的专栏《嵌入式底层避坑指南》,我会持续更新 CAN、UART、SPI 等外设的真实调试案例量产级解决方案

👉下一篇预告:《CAN FD 跑不起来?别只怪线缆,看看采样点与位时序》


References

  • ISO 11898-1 – CAN error handling and fault confinement

  • STM32 Reference Manual – CAN error status register


如果你在项目中遇到过 CAN 节点“假死”或 Bus Off 问题,欢迎在评论区分享你的排查经验。

原创文章,转载请注明出处。

http://www.jsqmd.com/news/956771/

相关文章:

  • HashCheck如何让大文件哈希计算从“等待“变成“瞬间完成“?
  • 2026广州黄金回收真实测评|主流渠道优劣解析,普通人变现必看 - 奢侈品回收评测
  • 洛雪音乐助手:免费开源的全平台音乐播放器完整指南
  • ssm226基于jsp的快递管理系统的开发+jsp(文档+源码)_kaic
  • 2026最新:黟县除甲醛公司推荐:黟县甲醛检测、除甲醛治理、室内空气检测、CMA 检测优选指南 - 专注室内空气检测治理
  • 基于低功耗设计与混沌算法的真随机数生成硬件实践
  • 金融NLP进阶:FinBERT-tone在企业财报分析中的10个实战应用策略
  • AI 的物理觉醒:从“数字大脑”到“具身智能”
  • 2026 成都钻石回收|口碑第一 + 实力强劲,全城实体盘点 TOP 榜单,上门估价无隐形扣费 - 奢侈品回收评测
  • 电子行业付款风险解析:从账期、承兑汇票到供应链博弈的生存指南
  • 高效解决PDF文档处理难题:开源PDF补丁丁完全实战指南
  • 专业指南:在M1 Mac上高效运行Android模拟器的实战方案
  • ArcMap投影转换避坑指南:手把手教你算UTM带号,告别坐标错乱
  • 效率提升秘籍:利用快马平台与trae优化前端应用状态管理流程
  • MegSpot:3种专业级视觉分析方案解决跨平台对比难题
  • 全覆盖选购攻略:六大全自动凯氏定氮仪品牌测评+场景适配方案 - 品牌推荐大师1
  • FPGA并行计算:突破冯·诺依曼瓶颈,重塑智能硬件设计范式
  • MASA模组全家桶汉化包:打破语言壁垒,畅享Minecraft顶级工具模组
  • 2026郑州包包回收探店|华润大厦这家大牌回收店实测(LV / 古驰 / 香奈儿) - 新闻快传
  • 5个简单步骤掌握Bebas Neue字体:从免费下载到专业应用的完整指南
  • 如何永久免费使用AI编程助手:3步搞定Cursor Pro激活
  • Adobe GenP 3.0终极指南:如何免费解锁Adobe全家桶完整功能
  • 从命令行到内核:手把手拆解ipmitool raw命令如何通过ioctl与BMC通信
  • 078、自动起飞控制算法
  • TCP端口内网穿透教程
  • 视频转 GIF 优质小程序汇总,多款免费转换工具测评盘点大全 - 软件工具教程方法
  • 旧首饰闲置贬值太可惜!长沙靠谱回收渠道分享 - 奢侈品回收测评
  • Arduino智能光调节器:单按钮三档调光与PWM控制实践
  • 3分钟永久解锁IDM:免费激活脚本的终极解决方案
  • 当AI能写诗、作曲、设计logo,人类最后的护城河是什么?20年一线研发总监的终极答案(含未公开的神经可塑性训练协议)