第1章:CAN协议基础 — 从起源到帧结构
大家好,我是你们的老朋友。今天咱们聊聊CAN总线。
说实话,我刚入行那会儿,对CAN总线的理解也就停留在“能传数据”这个层面。直到有一次,我在一个商用车项目里,因为对帧格式理解不到位,导致ECU之间通信乱套,差点把项目搞黄。从那以后,我花了一整周时间,把CAN协议从物理层到应用层啃了个透。
嗯,今天就把这些干货分享给你。
1.1 CAN总线起源 — 为什么会有它?
CAN全称是Controller Area Network,控制器局域网。上世纪80年代,汽车里的电子设备越来越多。你想想看,每个传感器、每个执行器都要拉一堆线,车重上去了,故障率也上去了。
当时博世(Bosch)的工程师们坐不住了。他们想要一种总线——
- 能多节点通信,不用点对点拉线
- 实时性好,刹车信号不能等
- 抗干扰强,车里电磁环境太恶劣
- 有错误检测机制,数据不能错
1986年,CAN协议正式诞生。后来成了ISO 11898标准。说实话,这个协议能活到现在,说明它确实有两把刷子。
核心要点:CAN总线不是为高速大容量数据传输设计的,它的强项是——可靠、实时、低成本。记住这三点,后面很多选择就清晰了。
1.2 物理层特性 — 差分信号与总线电平
CAN的物理层,说白了就是两根线:CAN_H和CAN_L。它用的是差分信号传输。
为什么用差分?我举个例子。你在车里,发动机点火、空调压缩机启动,电磁干扰到处都是。单端信号在这种环境里,分分钟被干趴下。但差分信号不一样——两根线同时受到干扰,相减之后干扰就被抵消了。这就是CAN能在车里活得好的原因。
总线电平
CAN总线有两种状态:
- 显性(Dominant):CAN_H比CAN_L高约2V。逻辑上代表0。
- 隐性(Recessive):CAN_H和CAN_L电压接近。逻辑上代表1。
这里有个关键点:显性电平会覆盖隐性电平。也就是说,只要有一个节点发送显性,总线就是显性。这个特性,是后面仲裁机制的基础。
| 状态 | CAN_H电压 | CAN_L电压 | 逻辑值 |
|---|---|---|---|
| 显性 | 约3.5V | 约1.5V | 0 |
| 隐性 | 约2.5V | 约2.5V | 1 |
注意:不同标准(如ISO 11898-2、ISO 11898-3)的电压值略有差异。高速CAN和低速CAN的物理层不完全一样。选型时一定要确认清楚。
我曾经在一个项目中,误把高速CAN收发器用在低速CAN网络上。结果通信时好时坏,查了两天才发现是物理层不匹配。嗯,这种坑踩过一次就记住了。
1.3 CAN 2.0A/B — 标准帧与扩展帧
CAN协议有两个版本:CAN 2.0A和CAN 2.0B。它们最大的区别在于——标识符(ID)的长度。
标准帧(CAN 2.0A)
- ID长度:11位
- 最大节点数:2^11 = 2048个(实际远小于这个数)
- 帧头开销小,适合简单网络
扩展帧(CAN 2.0B)
- ID长度:29位
- 最大节点数:2^29,几乎用不完
- 帧头多出18位,带宽利用率略低
你可能会问:那我该用哪个?
我个人习惯是:能用标准帧就用标准帧。为什么?因为帧短,总线利用率高,实时性更好。只有在ID不够用,或者需要兼容某些特定协议(比如J1939)时,我才用扩展帧。
小技巧:很多CAN控制器同时支持两种帧格式。但要注意,标准帧和扩展帧的ID空间是独立的。也就是说,标准帧ID 0x123和扩展帧ID 0x123是两个不同的消息。别搞混了。
帧格式对比
| 特性 | 标准帧(2.0A) | 扩展帧(2.0B) |
|---|---|---|
| ID长度 | 11位 | 29位 |
| 帧头长度 | 47位 | 67位 |
| 最大节点数 | 2048 | 5.3亿+ |
| 典型应用 | 简单ECU网络 | J1939、大型网络 |
| 总线利用率 | 高 | 略低 |
我记得有一次,一个供应商提供的ECU只支持标准帧,而我们整车网络用的是扩展帧。结果就是那个ECU完全收不到任何消息。最后只能加一个网关做帧格式转换。嗯,选型时一定要确认清楚。
1.4 避坑指南
做CAN开发这些年,我踩过不少坑。分享几个给你:
- 终端电阻不能省:CAN总线两端必须各加一个120Ω电阻。少了它,信号反射会让你怀疑人生。
- 总线长度和速率要匹配:1Mbps时,总线最长约40米。速率越低,距离可以越长。别想着1Mbps跑500米,那是不可能的。
- ID优先级设计要合理:ID越小,优先级越高。把关键消息(如刹车、转向)放在低ID,非关键消息(如车窗、空调)放在高ID。
- 不要混用不同标准的收发器:高速CAN、低速CAN、单线CAN,物理层不一样,混用必出问题。
总结一下:CAN总线能活30多年,靠的就是简单、可靠、实时。理解物理层的差分信号原理,搞清标准帧和扩展帧的区别,你就能应对90%的CAN开发场景了。
下一章,咱们聊聊CAN的仲裁机制和错误处理。说实话,那才是CAN协议最精彩的部分。到时候见。