1. CAN协议基础:从一根线到整车网络

大家好,我是老张。做嵌入式通信这块快十五年了,今天咱们聊聊CAN总线。说实话,CAN协议是我见过最"皮实"的现场总线之一。记得我刚入行那会儿,带我的师傅就说:"搞懂CAN,你就能搞定80%的车载通信。"这话一点不夸张。

1.1 CAN总线的起源:一场车祸催生的技术

1980年代初,博世(Bosch)的工程师们遇到一个头疼的问题——汽车里的线束越来越多。那时候一辆豪华车就有几公里长的线束,重达几十公斤。更麻烦的是,线束多了故障率就高。

我听说一个真实的故事:某款车型因为一根信号线被座椅支架磨破,导致刹车灯和转向灯同时亮起。这种"串扰"问题,在传统点对点布线中几乎无解。

于是1986年,博世推出了CAN(Controller Area Network)总线。它的核心思想很简单:所有节点共享两根线,谁想发数据谁就抢。你想想看,这比给每个传感器都拉一对线,省了多少成本?

关键时间节点:

  • 1986年:博世在SAE大会上首次发布CAN协议
  • 1991年:发布CAN 2.0规范(A/B两部分)
  • 1993年:成为ISO 11898国际标准
  • 2003年:CAN FD(灵活数据速率)开始研发
  • 2012年:CAN FD正式发布

1.2 物理层特性:为什么CAN能扛住干扰?

做车载通信,最怕什么?电磁干扰。发动机点火、雨刮电机、空调压缩机……这些玩意儿一工作,产生的电磁噪声能把弱信号直接"淹死"。

CAN总线为什么能扛住?关键在于它的物理层设计。

参数 高速CAN(ISO 11898-2) 低速CAN(ISO 11898-3)
最大速率 1 Mbps 125 kbps
总线长度(@最大速率) 40 m 500 m
显性电平 CAN_H ≈ 3.5V, CAN_L ≈ 1.5V CAN_H ≈ 5V, CAN_L ≈ 0V
隐性电平 CAN_H ≈ 2.5V, CAN_L ≈ 2.5V CAN_H ≈ 2.5V, CAN_L ≈ 2.5V
终端电阻 120 Ω(两端各一个) 根据节点数动态调整

嗯,这里要注意:高速CAN的终端电阻必须接在总线两端。我曾经见过一个项目,工程师把120Ω电阻焊在了ECU内部,结果总线反射严重,通信时好时坏。排查了整整两天……后来发现是电阻位置不对。

1.3 差分信号原理:两根线比一根线强在哪?

为什么CAN要用两根线?一根线传信号不行吗?

咱们做个思想实验:假设你在一根信号线上传3.3V的方波。这时候旁边有根大电流线突然通电,电磁感应会在你的信号线上叠加一个1V的噪声。好了,3.3V变成了4.3V,接收端就懵了——这到底是高电平还是低电平?

差分信号怎么解决这个问题?

CAN总线上有两根线:CAN_H和CAN_L。发送端让它们电压变化方向相反:

  • 显性(Dominant):CAN_H拉高到3.5V,CAN_L拉低到1.5V,差分电压 = 3.5 - 1.5 = 2.0V
  • 隐性(Recessive):两根线都保持在2.5V,差分电压 = 2.5 - 2.5 = 0V

接收端只看差分电压:大于0.9V就算显性,小于0.5V就算隐性。

现在同样的电磁干扰来了——它会在两根线上同时感应出1V的噪声。CAN_H变成4.5V,CAN_L变成3.5V,差分电压呢?4.5 - 3.5 = 1.0V,还是显性!

我的经验:差分信号对共模噪声有天然的抑制能力。但要注意,两根线的绞合度很关键。我习惯用每米绞合30-40圈的双绞线,这样两根线受到的电磁干扰几乎完全一致,共模抑制效果最好。

1.4 CAN总线拓扑结构:别把总线接成菊花链

CAN总线推荐什么拓扑?直线型(总线型)。说白了就是一根主干线,所有节点都从主干线上"挂"下来。

为什么不能搞成菊花链(节点A→节点B→节点C)?

我举个例子你就明白了:假设三个节点,A在车头,B在车中间,C在车尾。如果A到B的线断了,B和C之间还能通信吗?在菊花链里,B和C的物理连接还在,但A发的信号到不了B,B发的信号也到不了A——整个网络就瘫痪了。

总线型拓扑就不一样:A到C的线断了,A和B之间只要还有连接,就能正常工作。这就是故障隔离的好处。

避坑指南:我曾经在一个项目中看到,工程师为了布线方便,把CAN总线接成了"星型"拓扑——所有节点都连到一个集线器上。结果总线反射严重,500kbps的速率下误码率高达10%。后来改成直线型,问题立刻消失。

记住:CAN总线不允许有星型、树型、环型拓扑。如果实在避不开分支,分支长度不能超过0.3米(高速CAN)。

1.5 实际项目中的物理层设计要点

说了这么多理论,咱们聊聊实际干活时要注意什么。

  1. 终端电阻必须接在总线两端,而不是在ECU内部。很多开发板把120Ω电阻焊在板子上,这在调试时没问题,但量产时一定要去掉——否则多个节点并联,等效电阻就乱了。
  2. 总线长度和速率成反比。1Mbps时最长40米,125kbps时可以到500米。我习惯留20%的余量:1Mbps时总线不超过32米。
  3. 节点数量有限制。标准CAN收发器(如TJA1050)最多支持110个节点。但实际项目中超过30个节点,总线负载就容易超过30%,这时候就要考虑用CAN FD或者增加网关。
  4. 共模扼流圈不是必须的。在实验室环境可以不加,但车载环境我建议加上。它能抑制共模干扰,保护收发器。

一句话总结:CAN总线物理层,说白了就是两根差分线加两个终端电阻。但就是这看似简单的设计,让它在汽车这种恶劣电磁环境下稳定工作了三十多年。

下一章咱们聊聊CAN的数据链路层——报文格式、仲裁机制、错误处理。这些才是CAN协议的精髓所在。