1. CAN总线基础:从起源到物理层,我踩过的那些坑

大家好,我是老张。做车载电子十几年了,CAN总线算是我打交道最多的东西。今天咱们聊聊CAN总线的基础,这部分内容虽然基础,但真到了项目里,很多人还是会在物理层上栽跟头。

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

上世纪80年代,汽车里的电子设备越来越多。那时候的通信方式,说白了就是点对点连线。你想想看,一个豪华车可能有上百个ECU,每个ECU之间都要拉线,线束又重又贵,还容易出故障。

1983年,德国博世公司开始研发一种新的串行通信协议。1986年,CAN(Controller Area Network)正式诞生。它的目标很明确:用两根线搞定所有ECU之间的通信。

我个人觉得,CAN最聪明的地方在于它把「总线」的概念带进了汽车。所有节点共享同一对线,谁想说话谁就说,不用像以前那样一对一拉线。

核心特点:

  • 多主总线:任何节点都可以主动发消息
  • 实时性强:优先级高的消息优先发送
  • 可靠性高:有完善的错误检测机制
  • 成本低:只需要两根线

1.2 物理层特性——两根线里的大学问

CAN总线的物理层,说白了就是一对双绞线:CAN_H和CAN_L。但别小看这两根线,里面的门道可不少。

我记得刚入行时,有个项目总出现通信丢包。查来查去,最后发现是线缆阻抗不匹配。嗯,这里要注意:CAN总线对线缆的特性阻抗有严格要求,一般是120Ω。

参数 标准CAN(ISO 11898-2) 低速CAN(ISO 11898-3)
最大速率 1 Mbps 125 kbps
总线长度 40m @ 1Mbps 500m @ 125kbps
显性电平 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

避坑指南:我曾经在一个项目中,因为用了普通网线代替CAN专用双绞线,结果在高温测试时通信全部瘫痪。CAN线缆必须使用特性阻抗120Ω的双绞线,别图便宜。

1.3 差分信号原理——为什么CAN这么抗干扰?

你可能会问:为什么CAN要用两根线?一根线不行吗?

这就是差分信号的魅力了。CAN总线上传输的不是电压绝对值,而是CAN_H和CAN_L之间的电压差。

  • 显性状态(逻辑0):CAN_H比CAN_L高2V(3.5V - 1.5V)
  • 隐性状态(逻辑1):CAN_H和CAN_L都是2.5V,压差为0

为什么会这样设计?你想想看,如果外界有电磁干扰,它会同时作用在CAN_H和CAN_L上。两根线上的干扰信号几乎一样,一相减就抵消了。这就是共模抑制。

我做过一个实验:在CAN总线旁边放一个电钻,普通串口通信直接瘫痪,但CAN通信纹丝不动。差分信号就是这么硬核。

个人经验:在实际布线时,我习惯把CAN_H和CAN_L绞在一起,每米至少绞20圈。绞得越密,抗干扰能力越强。但别绞太紧,否则线缆容易断。

1.4 总线拓扑结构——怎么把节点连起来?

CAN总线最常用的拓扑是直线型(也叫总线型)。所有节点都挂在一对主干线上,每个节点通过短的支线连接。

这里有个关键点:主干线的两端必须各接一个120Ω的终端电阻。为什么?因为信号在总线末端会反射,如果不加终端电阻,反射信号会干扰正常通信。

// 典型的CAN总线拓扑结构
// 节点1 --- 节点2 --- 节点3 --- ... --- 节点N
//   |          |          |                  |
// 120Ω       支线       支线              120Ω
// 终端电阻    < 30cm     < 30cm           终端电阻

支线长度有讲究。我建议支线不要超过30cm,尤其是在高速CAN(1Mbps)下。支线越长,信号反射越严重。我曾经见过一个项目,支线拉了2米,结果通信速率只能降到50kbps才能工作。

拓扑设计要点:

  1. 主干线两端必须加120Ω终端电阻
  2. 支线尽量短,最好小于30cm
  3. 节点数量一般不超过30个(标准CAN)
  4. 总线长度和速率成反比:速率越高,总线越短

1.5 实际项目中的那些坑

说了这么多理论,最后分享几个我实际踩过的坑。

坑一:终端电阻位置不对。有一次,一个同事把两个120Ω电阻都放在了总线的一端。结果通信时好时坏,查了两天才发现。记住:终端电阻必须在总线的两端,不能放在同一端。

坑二:地线没接好。CAN总线虽然用差分信号,但各个节点的地电位不能差太多。我建议所有节点共地,地线用粗线,至少2.5mm²。

坑三:用了错误的收发器。5V的CAN和3.3V的CAN不能混用。我习惯用TJA1050(5V)或SN65HVD230(3.3V),选型时一定要看数据手册。

我的调试小技巧:用示波器看CAN_H和CAN_L的波形。正常通信时,显性状态CAN_H应该在3.5V左右,CAN_L在1.5V左右。如果波形变形严重,八成是终端电阻或线缆有问题。

好了,CAN总线的基础就聊到这里。下一章我们讲CAN的数据帧结构,到时候我会分享一个我当年调试CAN通信时遇到的奇葩问题——一个字节的位序搞反了,查了整整三天。