1. CAN总线基础:从起源到物理层

各位同学好,我是老张。在车载网络这个行当摸爬滚打了十几年,今天咱们聊聊CAN总线的基础。说实话,CAN总线这东西,你看着简单,但真要在项目里把它玩明白,还是得从根上理解它。

我记得刚入行那会儿,带我的师傅就说:“搞车载网络,CAN是基本功。这玩意儿要是搞不透,后面那些诊断、刷写、网络管理,全是空中楼阁。” 嗯,这么多年下来,我越来越觉得这话在理。

1.1 CAN协议的起源:为什么会有它?

上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制、变速箱……每个模块都自己拉一堆线。你想想看,那时候一辆豪华车的线束总长能超过2公里,重量几十公斤。不仅成本高,故障率也高。

1983年,德国Bosch公司开始研发一种新的串行通信协议。1986年,正式发布了CAN(Controller Area Network)协议。说白了,就是想让车上的各个电子模块通过两根线互相聊天,省掉那些乱七八糟的线束。

核心目标: 用最少的线,实现最可靠的实时数据交换。

1993年,CAN协议被国际标准化组织采纳,成为ISO 11898标准。从此,它就成了汽车网络的事实标准。我在一个老项目中还见过那种纯硬线控制的车型,跟后来的CAN总线车型一比,简直是两个时代的产物。

1.2 物理层特性:两根线撑起一个世界

CAN总线的物理层,说白了就是一对双绞线:CAN_H(高线)和CAN_L(低线)。别小看这两根线,它们承载着车上所有关键信息的传递。

参数 高速CAN(ISO 11898-2) 低速CAN(ISO 11898-3)
最大速率 1 Mbps 125 kbps
总线长度 ≤ 40 m @ 1 Mbps ≤ 500 m @ 125 kbps
显性电平 CAN_H: 3.5V, CAN_L: 1.5V CAN_H: 3.6V, CAN_L: 1.4V
隐性电平 CAN_H: 2.5V, CAN_L: 2.5V CAN_H: 1.75V, CAN_L: 3.25V
终端电阻 120 Ω(两端各一个) 无严格要求

这里有个关键点:高速CAN用的是差分电压,低速CAN用的是单端电压。我在测试中遇到过好几次,有人把高速CAN的终端电阻装错了位置,结果总线直接瘫痪。嗯,这个坑后面咱们细说。

1.3 差分信号:抗干扰的秘密武器

为什么CAN总线能在发动机舱那种电磁环境极其恶劣的地方稳定工作?答案就是差分信号。

差分信号的工作原理很简单:

  • 发送方在CAN_H和CAN_L上输出相反的电压变化
  • 接收方只看两根线之间的电压差
  • 外部干扰同时作用在两根线上,差值不变

举个例子:假设外界有个强电磁脉冲,同时给CAN_H和CAN_L都加了1V的干扰。CAN_H从3.5V变成4.5V,CAN_L从1.5V变成2.5V。但它们的差值呢?还是2.0V。干扰被抵消了。

实战经验: 我在做EMC测试时,亲眼见过差分信号的神奇。同样的干扰强度,单端信号已经乱码了,CAN总线纹丝不动。这就是为什么汽车这种恶劣环境,必须用差分信号。

CAN总线的逻辑电平定义也很巧妙:

  • 显性(Dominant): CAN_H - CAN_L ≈ 2V,代表逻辑“0”
  • 隐性(Recessive): CAN_H - CAN_L ≈ 0V,代表逻辑“1”

显性位会覆盖隐性位。这个特性在后面讲总线仲裁时会用到,你先记住这个结论。

1.4 总线拓扑:一条线上的蚂蚱

CAN总线采用多主总线拓扑。什么意思?就是总线上所有节点地位平等,谁都可以随时发消息。

典型的拓扑结构是这样的:

CAN总线典型拓扑结构 CAN_H CAN_L 120Ω 120Ω ECU 1 发动机控制 ECU 2 ABS控制 ECU 3 仪表显示 ECU 4 网关 总线两端各有一个120Ω终端电阻,用于消除信号反射 所有节点通过短支线连接到主线上,支线长度一般不超过30cm

拓扑设计有几个要点:

  • 总线两端必须加终端电阻: 120Ω,用于匹配阻抗,防止信号反射
  • 节点通过支线连接: 支线越短越好,我见过支线超过1米的,信号质量惨不忍睹
  • 节点数有限制: 高速CAN最多30个节点,低速CAN可以到20个

避坑指南: 我曾经在一个项目中,发现总线偶尔丢帧。查了两天,最后发现是终端电阻焊在了PCB板上,但板子到总线插头的线有15厘米长。这15厘米的“尾巴”在高速通信时产生了反射,导致信号畸变。从那以后,我要求所有终端电阻必须放在总线线束的末端,而不是PCB上。

1.5 位时序与同步:时钟是怎么对齐的

CAN总线没有单独的时钟线。所有节点靠什么同步?靠总线上的信号边沿。

每个CAN位被分成4个段:

段名称 作用 典型长度
同步段(Sync_Seg) 检测信号边沿 1 Tq
传播段(Prop_Seg) 补偿物理延迟 1-8 Tq
相位缓冲段1(PS1) 采样点前调整 1-8 Tq
相位缓冲段2(PS2) 采样点后调整 1-8 Tq

采样点通常设置在PS1和PS2之间。我习惯把采样点设在87.5%的位置,也就是PS1比PS2长一点。这样能给信号传播留足余量。

个人习惯: 配置位时序时,我一般先算好Tq(Time Quantum),再分配各段长度。500kbps的速率,我常用16个Tq组成一个位:Sync=1, Prop=7, PS1=6, PS2=2。这样采样点在87.5%,实测效果很好。

1.6 小结:CAN物理层的核心要点

好了,这一章的内容就这些。总结几个关键点:

  • CAN总线用两根差分线,抗干扰能力强
  • 显性/隐性电平是总线仲裁的基础
  • 终端电阻必须装,而且要装在总线末端
  • 位时序配置直接影响通信可靠性