尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
CAN 技术系列 06 · CAN 错误处理与错误帧
CAN总线技术系列 · 持续更新中本系列从差分电气层一路打到 Linux SocketCAN,把两根线背后的电气/协议/控制器/驱动/实战全拧成一根线。 想系统追更戳这里查看完整专栏【CAN 技术系列】 其他技术系列专栏欢迎关注、交流、共同成长【SPI 技术系列】 【I2C 技术系列】 【串口技术系列】【RISC-V 架构系列】【Linux内核系列】 【操作系统设计思想系列】 【 Android 系统全景专栏】本篇定位:CAN 协议层最强大的特性——错误处理。CAN 有 5 种错误检测、错误计数器、节点状态机(主动/被动/总线关闭)、错误帧自动破坏错帧。本篇讲清错误检测、错误帧、错误计数器、状态转移。读完你理解 CAN 为什么是汽车级可靠,以及总线关闭怎么恢复。错误处理是 CAN 汽车级可靠的根基SPI 无 ACK 无错误检测。I2C 只有 ACK/NACK。CAN 有 5 种错误检测 错误计数器 错误帧 自动重发 总线关闭——这是汽车级可靠的协议层保障。理解错误处理,才算懂 CAN。功能安全芯片,总线关闭恢复是必考。对照 [[10-SPI错误处理与恢复]] 和 [[10-I2C错误处理与恢复]] 看,CAN 的错误处理远比 SPI/I2C 完备。目录一、五种错误检测1.1 位监控错误(Bit Monitoring)1.2 位填充错误(Stuff Error)1.3 CRC 错误(CRC Error)1.4 格式错误(Form Error)1.5 ACK 错误(ACK Error)1.6 检测总结二、错误帧2.1 错误帧结构2.2 主动错误标志(Active Error Flag)2.3 被动错误标志(Passive Error Flag)2.4 错误定界符(Error Delimiter)2.5 错误帧作用三、错误计数器3.1 两个计数器3.2 计数规则3.3 计数器特性3.4 计数器读取四、节点状态机4.1 三种状态4.2 状态转移4.3 主动错误(Error Active)4.4 被动错误(Error Passive)4.5 总线关闭(Bus-Off)五、自动重发5.1 自动重发机制5.2 重发时机5.3 单次发送模式5.4 重发的问题六、总线关闭恢复6.1 总线关闭状态6.2 自动恢复6.3 软件恢复6.4 恢复策略6.5 功能安全考量七、错误中断与处理7.1 错误中断源7.2 错误处理流程7.3 错误统计八、关键问题 QAQ1:CAN 五种错误检测分别什么时候触发?Q2:错误计数器怎么涨?为什么错8 成功-1?Q3:主动错误和被动错误有什么区别?Q4:总线关闭怎么恢复?Q5:CAN 自动重发,什么时候停?Q6:错误计数器怎么看?九、实战案例案例 1:总线关闭,节点失联案例 2:错误被动,通信降级案例 3:ACK 错误,单节点自测案例 4:EMI 导致位填充错误案例 5:总线关闭无限恢复循环案例 6:高优先级帧重发,低优先级饿死案例 7:CRC 错误,采样点不一致案例 8:格式错误,EOF 被干扰十、本篇小结与速查核心要点错误检测速查状态机速查错误处理流程功能安全 CAN 错误处理清单延伸阅读参考资料一、五种错误检测CAN 有 5 种硬件错误检测,覆盖位级到帧级:1.1 位监控错误(Bit Monitoring)节点发的位,读回总线比对发显性读到隐性 / 发隐性读到显性(除仲裁区隐性读显性是输)不符 → 位错误1.2 位填充错误(Stuff Error)连续 5 同电平后必须有填充位(反向)6 个连续同电平 → 位填充错误1.3 CRC 错误(CRC Error)接收方重算 CRC,和发送方比对不符 → CRC 错误1.4 格式错误(Form Error)固定格式的位(CRC界定符/ACK界定符/EOF/IFS)应为隐性这些位出现显性 → 格式错误1.5 ACK 错误(ACK Error)发送方在 ACK 间隙发隐性读到隐性(无节点应答)→ ACK 错误1.6 检测总结错误检测方时机位监控发送方每个发位位填充接收方仲裁段CRC前CRC接收方CRC段格式接收方定界符/EOF/IFSACK发送方ACK间隙二、错误帧2.1 错误帧结构错误标志(6位) 错误定界符(8位隐性)2.2 主动错误标志(Active Error Flag)主动错误节点发:6 个连续显性位破坏当前帧(覆盖数据,所有节点检测到错误)6 个显性可能被其他错误节点叠加,变长( 12 位)2.3 被动错误标志(Passive Error Flag)被动错误节点发:6 个连续隐性位不强制破坏当前帧(隐性不覆盖)其他节点可能正常接收,被动节点自己退出2.4 错误定界符(Error Delimiter)8 个连续隐性位错误帧结束之后总线闲,可重发2.5 错误帧作用检测到错误的节点发错误帧主动错误帧破坏当前帧,所有节点丢弃发送方重发(自动)三、错误计数器3.1 两个计数器计数器含义TEC(Transmit Error Counter)发送错误计数REC(Receive Error Counter)接收错误计数3.2 计数规则发送方:发送错(ACK错/位错)→ TEC 8发送成功 → TEC -1(到 0 为止)接收方:接收错(CRC/格式/填充)→ REC 8接收成功 → REC -1(到 0 为止)主动错误标志期间:检测到显性位(其他节点也错)→ TEC/REC 1(少加,因为是别人错)3.3 计数器特性错误增 8,成功减 1(错比对影响大)设计:偶发错误快速恢复,持续错误快速降级范围:0~2553.4 计数器读取控制器寄存器(STM32 CAN_ESR 的 TEC/REC 字段)Linux:ip -s link show can0看错误统计调试必看四、节点状态机4.1 三种状态状态TEC/REC行为主动错误(Error Active) 96正常 主动错误标志(6显性)被动错误(Error Passive)96~127通信 被动错误标志(6隐性) 帧间多等总线关闭(Bus-Off)TEC ≥ 128不通信(完全隔离)4.2 状态转移TEC/REC 96 ┌─────────────────────┐ ↓ │ ┌─────────────┐ TEC/REC ≥ 96 ┌─────────────┐ │ 主动错误 │ ────────────→ │ 被动错误 │ │ (Error Active)│ │ (Error Passive)│ └─────────────┘ ←──────────── └─────────────┘ ↑ │ TEC/REC 128(恢复) │ │ └──────────────────────────┘ │ │ │ TEC ≥ 128 │ TEC ≥ 255 │ (持续错误) ↓ │ ┌─────────────┐ │ │ 总线关闭 │ │ │ (Bus-Off) │ │ └─────────────┘ │ │ │ 恢复(128×11显性)│ └──────────────────┘4.3 主动错误(Error Active)正常状态,通信正常错误时发主动错误标志(6 显性,破坏当前帧)TEC/REC 964.4 被动错误(Error Passive)通信仍进行,但降级错误时发被动错误标志(6 隐性,不破坏)帧间隔多等 8 个隐性(挂起传输,降优先级)TEC/REC 96~1274.5 总线关闭(Bus-Off)完全不通信(隔离,保护总线)TEC ≥ 128(发送)或 TEC ≥ 255需恢复(见下节)功能安全关键状态五、自动重发5.1 自动重发机制帧发送失败(ACK错/被错误帧破坏)→ 控制器自动重发软件不感知(除非配置单次发送模式)重发直到成功或总线关闭5.2 重发时机错误帧后,总线闲 IFS( 被动状态多等 8 隐性)重发参与仲裁(可能被更高优先级抢占)5.3 单次发送模式部分控制器支持(STM32 NART 位)发一次不重发,软件处理适用:实时性要求(超时丢弃)/ 测试5.4 重发的问题高优先级帧持续错 → 重发占总线 → 低优先级饿死功能安全:重发次数限制(超限进安全状态)六、总线关闭恢复6.1 总线关闭状态TEC ≥ 128 → 总线关闭节点完全不收发(隔离,避免持续错影响总线)控制器进入 Bus-Off 状态6.2 自动恢复总线关闭后,检测到128 × 11 1408 个连续隐性位(约 11 帧时间)自动回到主动错误状态(TEC/REC 清 0)条件:总线有其他正常节点通信(产生隐性位)6.3 软件恢复部分控制器需软件触发恢复(退出 Bus-Off)STM32:清 ABOM 位 → 软件请求恢复Linux:ip link set can0 up(重新启用)6.4 恢复策略策略说明自动恢复(ABOM)检测 1408 隐性自动恢复,推荐软件恢复软件检测 Bus-Off 后手动恢复不恢复锁死(功能安全降级,需人工干预)6.5 功能安全考量总线关闭 节点故障,可能安全风险恢复后要重新同步状态(应用层)AEGIX:总线关闭超阈值 → 进安全状态(不无限恢复)总线关闭恢复是 AEGIX 功能安全必考功能安全芯片 CAN 节点,总线关闭是故障状态。恢复策略:自动恢复(ABOM) 恢复次数限制 超限进安全状态。不能无限恢复(可能硬件故障,继续通信危险)。恢复后应用层重新同步状态。这是功能安全审查重点。对照 [[10-SPI错误处理与恢复]] 的端到端保护,CAN 的总线关闭是协议层保护,SPI 要软件实现。七、错误中断与处理7.1 错误中断源中断触发错误警告(EWGF)TEC/REC ≥ 96(进被动)错误被动(EPVF)TEC/REC ≥ 128 或从被动回主动总线关闭(BOFF)TEC ≥ 128(进 Bus-Off)最后错误码(LECN)上次错误类型(位/CRC/格式/ACK/填充)7.2 错误处理流程voidcan_error_isr(void){uint32_tesrCAN-ESR;if(esrBOFF){// 总线关闭log_error(CAN Bus-Off);enter_safe_state();// 功能安全// 等自动恢复或软件恢复}if(esrEPVF){// 错误被动log_warning(CAN Error Passive, TEC%d REC%d,(esr16)0xFF,(esr24)0xFF);}if(esrEWGF){// 错误警告log_warning(CAN Error Warning);}uint8_tlec(esr4)0x7;switch(lec){case1:log_error(Stuff Error);break;case2:log_error(Form Error);break;case3:log_error(Ack Error);break;case4:log_error(Bit1 Error);break;case5:log_error(Bit0 Error);break;case6:log_error(CRC Error);break;}}7.3 错误统计Linux:ip -s link show can0看 RX/TX 错误统计实时监控错误计数器(TEC/REC)错误日志记录(功能安全可追溯)八、关键问题 QAQ1:CAN 五种错误检测分别什么时候触发?A:位监控:发送方每发一位读回比对,不符(除仲裁区)位填充:接收方看到 6 连续同电平(应 5填充)CRC:接收方 CRC 不符格式:固定隐性位(CRC/ACK 界定符/EOF/IFS)出现显性ACK:发送方 ACK 间隙读到隐性(无应答)Q2:错误计数器怎么涨?为什么错8 成功-1?A:错8,成功-1。设计意图:偶发错误快速恢复(1 次成功抵 1 次错),持续错误快速降级(8 次错进被动)。这样偶发噪声不致降级,持续故障快速隔离(被动→总线关闭)。Q3:主动错误和被动错误有什么区别?A:主动错误(TEC/REC96):错误标志 6 显性,破坏当前帧(所有节点丢弃)被动错误(TEC/REC 96~127):错误标志 6 隐性,不破坏(其他节点可能正常接收),帧间多等 8 隐性(降优先级)被动错误是降级状态,减少对总线影响Q4:总线关闭怎么恢复?A:自动恢复(ABOM):检测 128×111408 连续隐性位,自动回主动错误(TEC/REC 清0)软件恢复:软件检测 Bus-Off,手动请求恢复(Linuxip link set can0 up)恢复条件:总线有其他正常节点(产生隐性位)功能安全:恢复次数限制,超限进安全状态Q5:CAN 自动重发,什么时候停?A:持续重发直到:① 成功;② 总线关闭(TEC≥128,停止)。没有重发次数限制(除非单次发送模式 NART)。高优先级帧持续错会占总线,低优先级饿死。功能安全要软件限制(超时丢弃/进安全状态)。Q6:错误计数器怎么看?A:裸机:读 CAN_ESR(STM32)的 TEC/REC 字段Linux:ip -s link show can0看 RX/TX errors调试:逻辑分析仪抓错误帧,统计频率功能安全:实时监控,超阈值告警九、实战案例案例 1:总线关闭,节点失联现象:某节点 TEC 飙到 200,总线关闭,完全不通信。分析:节点波特率配错(和全网不一致),发的帧别人采错(CRC错),ACK错,TEC 持续涨到 ≥128,总线关闭。解决:修正波特率(和全网一致),总线关闭恢复(ABOM 自动或软件重启)。案例 2:错误被动,通信降级现象:节点 TEC 100(被动错误),通信时断时续。分析:节点偶发位定时错(采样点偏),部分帧 CRC 错,TEC 涨到 96 进被动。解决:修正位定时(采样点 87.5%),TEC 降到 96 以下,回主动错误。案例 3:ACK 错误,单节点自测现象:单节点测试,发送报 ACK 错误,TEC 涨。分析:单节点无其他节点应答(ACK 间隙无显性),ACK 错,TEC 涨到总线关闭。解决:单节点测试开 Loopback 模式(自收自发 ACK),或加另一节点。案例 4:EMI 导致位填充错误现象:CAN 总线偶发位填充错误,错误帧频发。分析:EMI 让位翻转,连续同电平被破坏,位填充规则违反。解决:加共模扼流圈 TVS,远离干扰源,双绞屏蔽。案例 5:总线关闭无限恢复循环现象:节点总线关闭,自动恢复,又快速总线关闭,循环。分析:节点硬件故障(收发器坏),恢复后发的帧错,TEC 快速涨又总线关闭。解决:限制恢复次数(3 次后锁死),进安全状态,人工干预。案例 6:高优先级帧重发,低优先级饿死现象:高优先级帧(0x001)持续 ACK 错(目标节点故障),重发占总线,低优先级饿死。分析:自动重发无次数限制,高优先级持续错占总线。解决:单次发送模式(NART)或软件超时丢弃,目标节点故障进安全状态。案例 7:CRC 错误,采样点不一致现象:部分帧 CRC 错误,错误帧破坏,通信不稳。分析:某节点采样点 75%,全网 87.5%,采错数据,CRC 不符。解决:统一采样点 87.5%,CRC 错消失。案例 8:格式错误,EOF 被干扰现象:帧末格式错误(EOF 应隐性,出现显性),重发。分析:EMI 在 EOF 期间干扰,显性混入隐性区。解决:加抗扰措施(共模扼流圈/TVS/双绞),EOF 错误减少。十、本篇小结与速查核心要点CAN 五种错误检测:位监控/位填充/CRC/格式/ACK(硬件自动)错误帧:主动错误(6显性,破坏)/被动错误(6隐性) 8 隐性定界错误计数器:TEC(发送)/REC(接收),错8 成功-1节点状态:主动错误(96)/被动错误(96~127)/总线关闭(≥128)主动错误:正常通信,错误破坏当前帧;被动错误:降级,不破坏总线关闭:完全隔离(不收发),保护总线自动重发:帧错自动重发(无次数限制,除非 NART)总线关闭恢复:128×111408 隐性位自动恢复 / 软件恢复功能安全:恢复次数限制 超限进安全状态 恢复后重新同步错误中断:BOFF/EPVF/EWGF/LEC,实时监控错误检测速查错误检测方触发位监控发送方发≠读(除仲裁)位填充接收方6 连续同电平CRC接收方CRC 不符格式接收方定界符/EOF 显性ACK发送方ACK 间隙隐性状态机速查状态TEC/REC行为主动错误96正常 6显性错误标志被动错误96~127降级 6隐性错误标志总线关闭≥128隔离,不通信错误处理流程检测错误(5 种)发错误帧(主动/被动)错误计数器更新(TEC/REC)状态转移(主动→被动→总线关闭)自动重发(除非总线关闭)总线关闭恢复(1408 隐性 / 软件)功能安全:超限进安全状态功能安全 CAN 错误处理清单错误中断处理(BOFF/EPVF/EWGF)错误计数器监控总线关闭恢复策略(ABOM 次数限制)恢复超限进安全状态恢复后应用层重新同步错误日志记录(可追溯)看门狗兜底延伸阅读[[04-CAN帧格式]] —— CRC/ACK/EOF 错误源[[05-CAN仲裁与优先级]] —— 仲裁错乱触发错误[[03-CAN位定时与同步]] —— 位定时错导致 CRC 错[[10-CAN错误恢复与总线关闭]] —— 恢复深入[[14-CAN排查手册与速查表]] —— 错误速查[[10-SPI错误处理与恢复]] —— 对比 SPI 错误处理[[10-I2C错误处理与恢复]] —— 对比 I2C 错误处理参考资料Bosch CAN Specification 2.0(错误处理章节)ISO 11898-1(错误管理)STM32 RM0090(CAN ESR/错误中断)ISO 26262 功能安全(CAN 容错)[[00-CAN技术系列总目录]] · 上一篇:[[05-CAN仲裁与优先级]] ·下一篇:[[07-CAN高层协议]]✨ 感谢你的阅读 ✨技术之路漫漫分享是为了更好地交流。如果本文的内容对你有启发希望能得到你的支持 点赞|⭐ 收藏| 关注如果你在调试过程中遇到了其他问题欢迎在评论区 留言我们一起探讨。关注我一起交流底层开发的那些事儿
RELATED

相关推荐

导师退回问题清单:论文从开题到定稿,AI 工具到底该怎么选、怎么用

导师退回问题清单:论文从开题到定稿,AI 工具到底该怎么选、怎么用

每年审本科和硕士论文,我退稿最集中的其实不是“选题不够宏大”,而是三类很具体的问题: 格式不达标——目录、页眉、参考文献著录格式跟学校模板对不上,图表编号混乱;引用和数据经不起查——参考文献像编的&#xff0c…

📅 2026/10/31 22:30:03
OpenStack 计算管理:实例锁定后被普通用户解锁了?避坑实操

OpenStack 计算管理:实例锁定后被普通用户解锁了?避坑实操

给实例上了锁,转身普通用户登录就把锁解了、机删了——这不是 bug,是 policy.json 里 unlock 那条规则默认对 owner 开放。这篇把计算管理走一遍完整闭环:主机聚合与可用分区、规格的 Public/Private、密钥对与服务器组、发放实例&#xff0c…

📅 2026/10/31 22:25:02
OpenStack 镜像管理:共享镜像一直 pending 看不见?Glance 全流程实操

OpenStack 镜像管理:共享镜像一直 pending 看不见?Glance 全流程实操

镜像上传成功、状态显示正常,共享给别的项目后对方 openstack image list 里却死活找不到——十有八九是卡在成员状态 pending。这篇按一条完整链路走完镜像管理:下载验证 → 注册 → 改可见性 → 共享(pending → accept)→ 转格…

📅 2026/10/31 22:25:02
MORE NEWS

更多资讯

📰

OpenCode:TypeScript+monorepo+LLM协同编程平台解析

1. OpenCode到底是什么?别被名字骗了,它根本不是代码编辑器OpenCode这个名字,第一眼容易让人联想到“开源代码编辑器”或者“类似VS Code的轻量版”,但实际完全不是这么回事。我最早在TypeScript开发者群里看到有人发链接说“用Op…

📰

动物病理学习笔记:疾病概论与血循环障碍的机制串联

动物病理这门课,真正让人头疼的从来不是背名词,而是那些看起来彼此孤立、实际却串成一条线的机制。我当年第一次翻到"疾病概论"和"血循环障碍"这两块内容时,最大的感受就是:概论讲了一堆抽象概念,…

📰

大模型Agent开发入门:从核心原理到实战避坑指南

这些年聊大模型,大家从最早的“能聊天”逐渐过渡到了“能不能帮我干点正事”。而“让大模型自己干活”这件事,最直接的落地形态就是Agent。这个标题“大模型Agent开发入门”看起来很直白,但真正接触过的朋友都知道,从概念到能跑通…

📰

27B模型压缩至5.9GB:极端量化与长程智能体任务性能实测

1. 从54GB到5.9GB:这个压缩比到底意味着什么第一次看到“27B参数、54GB压到5.9GB”这组数字的时候,我的直觉是——这要么是标题党,要么是某种极端到会牺牲可用性的量化方案。27B这个量级的模型,如果按FP16存储,权重体积…

📰

MySQL 8.0 Windows安装与优化配置指南

1. MySQL 8.0安装前的准备工作 在Windows环境下安装MySQL 8.0之前,有几个关键准备工作需要完成。首先需要确认系统兼容性,MySQL 8.0要求Windows 10、Windows 11或Windows Server 2016及以上版本。对于较旧的Windows系统,可能需要考虑安装MyS…

📰

AI早报:模型记忆、多模型协作与端侧算力如何重构AI工作流

早上翻完一圈信息流,今天这组新闻有点意思。Claude 记忆打通 Cowork,GPT-5.6 登陆 Kiro,Apple 发布 2nm 芯片——三条消息看着不搭界,放在一起其实是一盘棋:模型层的持久记忆、应用层的多模型协作、硬件层的端侧算力&a…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬