1、CAN协议基础:CAN总线起源、物理层特性(差分信号)、CAN总线拓扑结构

1.1 CAN总线的起源——从一堆线束说起

说起CAN总线,我得先聊聊它的出身。上世纪80年代,汽车电子开始爆发。那时候的车里,各种传感器、控制器之间靠的是点对点连线。你想想看,一个豪华车可能有几百根线束,又重又容易出故障。

1983年,德国博世公司开始琢磨一个问题:能不能用两根线,把车上所有的电子设备串起来?1986年,他们给出了答案——CAN总线(Controller Area Network)。嗯,说白了就是「控制器局域网」。

我个人习惯把CAN总线的诞生看作一场「线束革命」。它让汽车从「各自为政」变成了「统一对话」。我记得第一次拆解老款奔驰的CAN网络时,那种简洁感让我印象深刻——两根双绞线,替代了几十公斤的线束。

1.2 物理层特性——差分信号才是灵魂

CAN总线的物理层,核心就是差分信号。为什么不用单端信号?因为车里的电磁环境太恶劣了。发动机点火、电机启停、各种开关动作,分分钟给你整出几伏的共模干扰。

差分信号怎么工作的?说白了就是两根线——CAN_H和CAN_L,它们传输的信号互为镜像。

  • 显性电平(Dominant):CAN_H比CAN_L高2V左右(标准CAN是3.5V vs 1.5V)
  • 隐性电平(Recessive):CAN_H和CAN_L都维持在2.5V左右

这里有个关键点:显性电平会「覆盖」隐性电平。也就是说,只要有一个节点发送显性位,总线就是显性状态。这就是CAN总线仲裁机制的基础。

避坑指南:我曾经在一个项目中,CAN通信老是间歇性丢帧。查了三天,最后发现是CAN_H和CAN_L线接反了。嗯,这种低级错误,新手最容易犯。记住:CAN_H接CAN_H,CAN_L接CAN_L,别搞混。

差分信号的好处很明显:

  • 抗干扰能力强:外界噪声同时耦合到两根线上,差分接收器只关心差值,共模噪声被抵消
  • 电磁辐射小:两根线上的电流方向相反,产生的磁场相互抵消
  • 故障容错:一根线断了,还能以单端模式工作(虽然可靠性下降)

1.3 CAN总线拓扑结构——一条主干,多个节点

CAN总线的拓扑结构,最典型的就是「总线型」。一条主干线,所有节点都挂在这条线上。每个节点通过一个收发器(Transceiver)连接到总线。

你想想看,这就像一条高速公路,每个节点就是一个出口。数据在总线上广播,所有节点都能收到,但只有匹配ID的节点才会处理。

参数 标准CAN(ISO 11898-2) 低速CAN(ISO 11898-3)
最大速率 1 Mbps 125 kbps
最大节点数 30(实际建议不超过16) 20
总线长度(1 Mbps时) 40米 500米
终端电阻 120Ω(两端各一个) 2.2kΩ(每个节点)

这里有个容易忽略的点:终端电阻。为什么需要它?因为CAN总线是传输线,如果不加终端电阻,信号会在末端反射,造成波形畸变。我见过不少新手,调试时忘了加120Ω电阻,结果通信时好时坏。

我的经验:实际项目中,我建议总线两端各放一个120Ω电阻。如果节点数少(比如2-3个),可以只在两端节点内部启用终端电阻。节点多了,就得用外部电阻了。

1.4 实际项目中的拓扑考量

做BMS(电池管理系统)时,CAN总线的拓扑设计尤其重要。电池包内部空间有限,线束不能太长,节点又不能太少。

我一般遵循几个原则:

  1. 星型拓扑慎用:虽然方便布线,但中心节点故障会导致全网瘫痪
  2. 分支长度控制:每个分支(stub)不要超过0.3米,否则信号反射严重
  3. 节点间距均匀:尽量让节点均匀分布在总线上,避免集中在一端

嗯,这里要特别提醒:CAN总线的物理层决定了它的可靠性,但前提是你得按规矩来。差分信号、终端电阻、拓扑结构,这三样缺一不可。

警告:千万不要在CAN总线上使用T型接头或者随意延长分支线。我曾经在一个项目中,为了省事用了T型分线器,结果总线速率只能降到50kbps才能稳定工作。后来老老实实改成总线型拓扑,速率直接拉到500kbps。

最后说一句:CAN总线看起来简单,两根线而已。但真正用好它,需要理解背后的物理原理。差分信号不是玄学,是实实在在的工程智慧。你想想看,30年前的技术,到现在还在广泛使用,本身就说明了一切。