第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协议最精彩的部分。到时候见。