news 2026/8/22 2:09:15

第5篇 · CAN 总线:差分、帧结构、仲裁与错误处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第5篇 · CAN 总线:差分、帧结构、仲裁与错误处理

导读

入门三篇讲完了“测什么、怎么连、分几域”,还顺手看了工具链。从这篇起正式进入协议深水区——阶段二 · CAN/LIN 总线。本篇全部依据《车载通信协议入门培训》课件整理,把 CAN 的物理层、帧结构、最精髓的“非破坏性仲裁”,以及课件里讲得很透的错误帧、错误状态机、过载帧、报文发送类型、波特率与采样点一次讲清。吃透这篇,CAN 测试就有了 root。

一、CAN 是什么,为什么非它不可

CAN(Controller Area Network)是 1986 年博世为汽车发明的串行通信协议,后来被 standardized 为ISO 11898。它的几个关键标签:

  • 多主(Multi-Master):总线上任何节点都能主动发,没有“主机”;
  • 差分(Differential):用一对双绞线传信号,抗干扰极强;
  • 广播 + 报文滤波:发的是“ID + 数据”,谁关心谁收;
  • 强错误检测与容错:有错误帧、自动重发、错误计数器与离线(Bus-Off)保护。

对比一下你熟悉的:UART 是点对点、I2C/SPI 有主从且距离短,而 CAN 专为复杂电磁环境里多节点可靠通信而生——这正是车载场景的刚需。课件里一句话点得很准:“现代汽车是一个高度集成的电子系统,发展到今天,CAN 总线依然是网络通信的基石。一辆中高端汽车通常包含多条 CAN 总线,连接超过 50 个 ECU。”

回顾:前面“五大域”里动力域、底盘域、车身域都跑 CAN/CAN FD,所以它必须第一个吃透。

二、物理层:差分信号与终端电阻(重点)

CAN 用一对双绞线CAN_H / CAN_L传输,只有两种电平状态:

状态逻辑值CAN_HCAN_L说明
隐性 Recessive1≈ 2.5 V≈ 2.5 V总线释放,靠终端电阻上拉
显性 Dominant0≈ 3.5 V≈ 1.5 V节点主动驱动,覆盖隐性

2.1 线与逻辑(Wired-AND)

这是 CAN 最反直觉也最关键的一点:显性(0)可以覆盖隐性(1)

  • 只要任意一个节点驱动总线为“显性 0”,整条总线就是 0;
  • 只有所有节点都发隐性 1时,总线才是 1。

这叫“线与”——像多个开关并联接地,一个按下就导通。靠它才能实现后面的“非破坏性仲裁”。

2.2 终端电阻的作用

课件专门强调:终端电阻的作用是“匹配阻抗,消除信号反射”。总线两端各接一个120 Ω 终端电阻,当信号到达线缆末端时,阻抗匹配让能量被吸收而不是反射回来叠加,避免波形振铃导致误采样。不接或只接一端,高速通信时反射会让眼图闭合、误码率飙升。

  • 经典 CAN 最高1 Mbps(约 40 m 内);速率越高,允许的总线距离越短;
  • 差分传输让共模干扰(如电机点火噪声)被两端相减抵消,抗干扰能力是单端信号比不了的

三、数据帧结构(重点)

CAN 有标准帧(11 位 ID)扩展帧(29 位 ID)。标准帧结构紧凑,是最基础、应用最广泛的格式;扩展帧的仲裁场含基本 ID + 扩展 ID,共 29 位,能支持海量节点与复杂报文类型,是构建大型 CAN 网络的基础。入门以标准数据帧为主:

作用
SOF 帧起始1 个显性位,标志一帧开始
仲裁段11 位 ID + RTR(远程帧标志),ID 决定优先级
控制段IDE(标准/扩展)+ DLC(数据长度 0~8 字节)
数据段0~8 字节有效数据(CAN FD 可到 64 字节)
CRC 段15 位校验 + 界定符,保证数据完整
ACK 段接收节点回确认
EOF 帧结束7 个隐性位

位填充(Bit Stuffing)

发送方在连续 5 个相同位之后,强制插入 1 个相反位。接收方收到后自动剔除。目的:保证总线上有足够的跳变沿,让所有节点能持续同步、也能检测“填充错误”。

测试视角:DLC 是否越界、实际数据字节数是否与 DBC 定义一致、CRC 是否正确、位填充是否合规——这些都是 CAN 一致性测试的高频检查点。

四、非破坏性仲裁(核心)

多主同时想发怎么办?CAN 用非破坏性仲裁优雅解决:

  1. 所有节点同时发,仲裁段从 ID 最高位开始比;
  2. 发“隐性 1”却读到“显性 0”的节点,立刻知道自己优先级低,主动退出发送(不发送剩余位);
  3. 最高优先级(ID 最小)的节点无损赢得总线,帧不被破坏;
  4. 退出的节点等总线空闲后自动重发

因为靠“线与逻辑”,高优先级节点全程不知道有人在让,它的帧一个位都没被破坏——所以叫“非破坏性”。

对比以太网 CSMA/CD:冲突后双方都停、都重发,是“破坏性”的,浪费带宽。CAN 在 arbitration 阶段就分出了胜负,更高效、更确定。

测试视角:仲裁失败节点的退让行为是否合理?两个节点配了相同 ID会怎样?优先级反转(低 ID 一直霸占总线、高 ID 饿死)如何验证?——这些都是 CAN 测试工程师的看家题。

五、错误检测与错误帧(重点)

CAN 的可靠性不是靠“祈祷”,而是靠一套硬件级本能反应。课件把这部分讲得很透,这里完整梳理。

5.1 五种错误

只要节点检测到以下任意一种错误,底层 CAN 控制器就会自动且立即发送错误帧,完全由芯片状态机完成,属于硬件级“本能反应”:

错误类型触发场景(课件案例)
位错误 (Bit Error)节点发送的同时回读总线,发出与读回的电平不一致(仲裁段和 ACK 段例外,不判定位错误)
填充错误 (Stuff Error)连续 5 个相同位后未插入相反位,或错误插入了相反位
CRC 错误 (CRC Error)接收方自算 CRC 与发送方附带的 CRC 不一致
格式错误 (Form Error)帧中固定必须为隐性位的保留位被检测为显性
ACK 错误 (ACK Error)发送方在 ACK 槽没读到显性位,说明没人确认

5.2 错误帧长什么样

错误帧 =错误标志 + 错误界定符

  • 主动错误标志6 个连续的显性位“000000”
  • 被动错误标志6 个连续的隐性位“111111”
  • 之后是 8 个连续的隐性位(错误界定符),用于隔离。

注意:错误帧主体就是“6 个连续显/隐性位 + 8 个连续隐性位”,它本身会违反位填充规则——但协议规定错误帧豁免填充检查,所以不会自己触发填充错误。

5.3 双 8 位错误计数器:TEC 与 REC

CAN 用两个计数器实现“精准识别与网络防护”:

  • TEC(Transmit Error Counter)发送错误计数:记录发送侧错误(位错误、填充错误等),随发送失败累加;
  • REC(Receive Error Counter)接收错误计数:统计接收侧异常(格式错误、ACK 错误等)。

核心思想:惩罚错误,奖励正确

场景TECREC
发送节点检测到错误+8(重罚,因影响全网)
接收节点检测到错误+1(轻罚)
严重位错误+8
正常发送/接收一帧且无错−1(最小 0)若 1<REC≤127 则 −1;REC 为 0 或 >127 不变化

5.4 错误状态机:主动 → 被动 → Bus-Off

节点依据 TEC/REC 数值进入三级状态,构成分布式容错体系:

  • 主动错误状态 (Error Active):TEC < 128 且 REC < 128,健康态。检测到错误会主动发“主动错误标志”,正常参与通信。
  • 被动错误状态 (Error Passive):TEC ≥ 128REC ≥ 128,亚健态。只能发“被动错误标志”,且发送后需等待额外延时,避免干扰总线。
  • 总线关闭 (Bus-Off)TEC > 255时触发,节点被逻辑“踢出”网络,不能收发任何报文,需复位或计数器清零才能恢复。

Bus-Off 智能恢复:硬件内置机制,检测到128 次连续的 11 个隐性位后,自动清零错误计数器,恢复至主动错误状态,确保网络自愈。软件也可实施快恢复 / 延迟慢恢复策略,防止故障节点反复震荡。

测试视角:故意注入位错误 / 填充错误,观察节点是否按 TEC/REC 规则迁移状态;强制触发 Bus-Off,验证快/慢恢复策略是否符合需求——这是动力域、底盘域 CAN 测试的硬指标。

六、过载帧与报文发送类型

6.1 过载帧

过载帧用于处理节点“来不及处理”的过载状态。它的标志同样是连续 6 个显性位——课件特意留了个思考题:“为什么过载帧连续 6 个位的显性电平不会报错?”答案是:过载帧标志本身就被协议定义为 6 个显性位,属于豁免帧,不参与填充错误判定(和错误帧同理)。

6.2 报文发送类型

整车 CAN 报文按触发方式分为四类,测试时要分别验证:

  • 固定周期型:按固定周期发送(如车速 10 ms 一帧);
  • 事件周期型:有事件才发,但限定最大周期(事件型的上限兜底);
  • 使能周期型:需先被使能,再按周期发送;
  • 事件型:仅事件触发时发送,无周期。

七、波特率与采样点

  • 波特率:单位是比特每秒(bps),决定每位持续多长时间;仲裁段靠它竞争总线控制权。
  • 采样点:在一个比特时间内进行信号采样的位置。课件给的例子“波特率 5 Mbps、采样点 75%”含义是:数据以每秒 500 万比特传输,在每个比特时间的 75% 处采样判定该位是 0 还是 1。

实战经验:采样点通常设在比特时间的70%~80%(常见 75%)。同一总线上的节点采样点必须一致,否则一位还没采到就被下一位冲掉,会大面积丢帧、错帧。这也是为什么 CAN 一致性测试必测“采样点”。

八、CAN 应用场景

现代汽车是高度集成的电子系统,CAN 至今仍是网络基石。一辆中高端车通常包含多条 CAN 总线(动力 CAN、底盘 CAN、车身 CAN 等),连接超过 50 个 ECU。其高可靠性、实时性和多主特性,使其在动力总成、底盘控制、车身电子等对安全性和确定性要求极高的领域,依然是不可替代的通信骨干。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 2:09:06

colneGitHup速度慢的解决方式

登录gitee,在gitee上创建githup的镜像,然后通过gitee克隆到本地就可以了。 1.登录gitee 2.复制gitHub上的http3.导入gitee,右上角选择导入4.之后就在自己的仓库里面了,然后克隆到本机就可以了 然后克隆到本机就可以了

作者头像 李华
网站建设 2026/8/22 2:08:32

本地部署视觉大模型:为DeepSeek等文本模型添加多模态能力

如果你正在用 DeepSeek 写代码、分析文档&#xff0c;却苦于它无法“看懂”你截图的图表、流程图或界面设计&#xff1b;如果你羡慕 Qwen-VL 等视觉大模型的多模态能力&#xff0c;却又被其 API 调用成本或复杂的云端部署劝退——那么&#xff0c;今天这篇文章就是为你准备的。…

作者头像 李华
网站建设 2026/8/22 2:07:40

4-三菱PLC数据 转SNMP项目案例 1

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集三菱PLC数据 2 5 使用SNMP转发 5 6 其他说明 7 7 案例总结 9 案例说明 设置vfbox网关采集三菱PLC数据把采集的数据转成SNMP协议转发给其他系统。 VFBOX网关工作原理 VFBOX网关是协议转换网关&#…

作者头像 李华
网站建设 2026/8/22 2:06:55

KKCE: 在线Ping

一、引言&#xff1a;为什么本地 Ping 延迟正常&#xff0c;海外节点却 100% 丢包&#xff1f; 在 BGP 网络运维中&#xff0c;我们常以为只要本地 ping 通&#xff0c;路由宣告就一切正常。运维看到本地 ICMP 延迟 30ms、0% 丢包&#xff0c;便认为“全网可达”。但用 www.kk…

作者头像 李华
网站建设 2026/8/22 2:04:18

外科手套注册证审核看什么

采购外科手套时&#xff0c;注册证核验往往是最容易出问题的环节。审核的核心不是看有没有证&#xff0c;而是看证与实物、证与供货主体是否完全一致。以下从注册证审核要点和采购合规两个层面展开&#xff0c;便于采购、院感、设备科人员在入库前快速判断。一、先看注册证编号…

作者头像 李华
网站建设 2026/8/22 2:03:10

杰理SDK开发-TWS蓝牙耳机持续加减音量出现左右耳明显大小音问题

前言现在为止也开发了许多杰理TWS蓝牙耳机、音响项目 SDK的案子&#xff0c;在调试案子时不断的向前辈们学习到了很多关于蓝牙音响、蓝牙TWS耳机专业的知识。想在这里做一个学习汇总&#xff0c;方便各位同行和对杰理芯片SDK感兴趣的小伙伴们学习&#xff1b;相关信息项目产品&…

作者头像 李华