1. CAN总线简介:历史、标准与物理层

各位好,欢迎来到《CAN错误帧定位与调试方法》的第一章。

很多工程师刚开始接触CAN总线时,会觉得它很复杂。实际上,CAN的设计思路非常优雅。它把多个节点挂在同一条总线上,谁有数据谁就发。关键是不需要主机仲裁,节点之间自己就能搞定冲突。

我最早接触CAN是在一个车载项目里。当时遇到掉帧问题,查了好几天。那时候我就明白,要理解错误帧,必须先搞清楚CAN到底是怎么工作的。这一章,我们就从根上理一遍。

1.1 为什么会有CAN总线?

上世纪80年代,汽车里的电子模块越来越多。ECU、ABS、气囊……每个单元都要互相传数据。

我举个例子,发动机转速既要给仪表盘显示,又要给变速箱控制。如果用传统点对点接线,一个车就得拖着几公里长的线束。又重又贵,还容易出故障。

1983年,Bosch开始研发一种新的串行总线。目标很明确:用两根线,让所有节点都能可靠地通信。这就是我们今天用的CAN。

说白了,CAN就是为了解决“车上线太多”这个问题而生的。

1.2 标准演进:从CAN 2.0到CAN FD

大家常听到的CAN 2.0A、CAN 2.0B、CAN FD,其实是不同阶段的标准。我习惯把它们分成三个台阶来讲。

标准 发布年份 ID长度 最大数据长度 速率
CAN 2.0A 1991 11位(标准帧) 8字节 最高 1 Mbps
CAN 2.0B 1991 11位 或 29位(扩展帧) 8字节 最高 1 Mbps
CAN FD 2012/2015 11位 或 29位 最多64字节 数据段可达 5-8 Mbps

CAN 2.0A vs 2.0B

最核心的区别在ID长度。2.0A用11位ID,最大可以标识2048个消息。2.0B多了29位扩展帧,能标识5亿多个——做复杂系统时很管用。

我记得有次做工程机械项目,整车控制器识别节点ID的时候,发现11位不够用。后来换成2.0B的29位扩展帧,一口气全打通了。嗯,这里要注意:2.0B的节点可以收发2.0A的消息,反过来不行。

CAN FD:当8字节不够用

传统CAN每帧最多带8字节数据。这在动力总成里够用,但现在车载摄像头、激光雷达的数据量越来越大。一次传8字节,要拆好多帧。

CAN FD的改进很直接:数据段长度从8字节拉到64字节,速率也从1Mbps拉到了5-8Mbps。而且它在仲裁段保持原速,只在数据段提速。因此兼容性不错。

我个人的建议:做新项目时,优先考虑CAN FD。就算初期跑低速,将来升级也有余量。

避坑提醒
我曾经在一个项目里,直接把CAN FD节点混接在2.0网络里。结果FD节点不停地报错,总线直接瘫痪。
混装时必须启用“CAN FD容忍模式”。否则即使不发FD帧,FD节点看到异常位定时也会主动报错。

1.3 物理层:那两根线的秘密

物理层,说白了就是那条双绞线和收发器怎么工作的。这也是我们后续定位错误帧的关键战场。

差分信号

CAN用CAN_H和CAN_L两根线传输。它的核心思想是:只认两根线的电压差,不认任意一根对地的电压。

  • 显性(Dominant): CAN_H = 3.5V,CAN_L = 1.5V,压差 = 2V,代表逻辑 0。显性电平“覆盖”隐性电平。
  • 隐性(Recessive): CAN_H = 2.5V,CAN_L = 2.5V,压差 = 0V,代表逻辑 1。

为什么用差分?因为车辆里电磁干扰很严重。你想,发动机点火、电机启停,都会产生强噪声。差分信号的抗共模干扰能力特别强。只要双绞线绞合紧密,外部噪声在两根线上的感应是等量的,压差不变。

终端电阻

这是一个经常被忽略、但又至关重要的小东西。

CAN总线需要在两端各加一个120欧姆终端电阻。作用有两个:吸收信号反射和提供隐性电平的偏置。

如果没有终端电阻,或者终端电阻值不对,信号的边沿就会变缓,甚至出现回沟。这在高速通信时直接导致位采样错误,从而产生错误帧。

常见误判
我曾经遇到一个现场问题:节点发送错误帧的频率忽高忽低。查了三天,最后发现是总线一端的120欧姆电阻脱落了。反思一下,如果当时先检查终端电阻,半小时就能搞定。
调试前,先用万用表量一下CAN_H和CAN_L之间的直流电阻:正确值约 60 欧姆(两个120并联)。

位定时与采样点

CAN总线的每个数据位被分成同步段、传播段、相位缓冲段1和相位缓冲段2。控制器会在相位缓冲段1的末尾采样。

采样点的位置很讲究。通常建议设置在75%~87.5%之间。采样点太靠前,容易错过信号稳定段;太靠后,万一节点间存在时钟偏差,就会读到错误电平。

1.4 CAN总线知识图谱

为了帮你直观理解本章的知识结构,我画了一张SVG框架图。它概括了CAN总线的三个核心分支:发展历史、标准演进、物理层基础。

CAN总线知识框架 CAN总线 发展历史 标准演进 物理层基础 Bosch研发现场总线 车载行业推广 ISO 11898标准化 CAN 2.0A/B (1991) CAN FD (2012/2015) CAN XL (未来) 差分信号传输 终端电阻 / 120Ω 位定时 & 采样点 错误帧定位之前,必须吃透这三块基础

1.5 小结与关键点

这一章内容不少,但都是基础。我帮你梳理几个核心要点:

  • CAN的诞生是为了减少线束,实现分布式控制。
  • 版本选择:新项目优先CAN FD,兼容老网络时注意ID长度和容忍模式。
  • 物理层是错误帧的重灾区:差分信号阻抗匹配、终端电阻、采样点位置,只要一个不对,错误帧就会频繁出现。
  • 调试习惯:我建议你每次排查总线问题时,第一件事就是量CAN_H到CAN_L的直流电阻。这个动作能排除一大半物理层故障。
本讲核心
搞不懂CAN的历史和物理层,错误帧的根因永远找不到。记住一句话:CAN出问题,80%都不是协议的事,而是线和电的事。