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总线采用多主总线拓扑。什么意思?就是总线上所有节点地位平等,谁都可以随时发消息。
典型的拓扑结构是这样的:
拓扑设计有几个要点:
- 总线两端必须加终端电阻: 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总线用两根差分线,抗干扰能力强
- 显性/隐性电平是总线仲裁的基础
- 终端电阻必须装,而且要装在总线末端
- 位时序配置直接影响通信可靠性