1. CAN总线基础:从起源到物理层
各位同学好,我是老周。搞汽车电子这么多年,CAN总线算是我打交道最多的东西了。今天咱们就从根上聊聊——CAN总线到底是怎么来的,它的物理层有什么门道。
1.1 CAN协议的起源
上世纪80年代,汽车里的电子模块越来越多。我记得那时候一辆高档车就有几十个ECU,线束又重又乱,故障率还高。德国Bosch公司看不下去了,1983年开始研发一种新的串行通信协议,1986年正式发布——这就是CAN(Controller Area Network)。
说白了,CAN总线诞生的初衷就两个:减少线束、提高可靠性。你想想看,原来每个传感器都要单独拉线到ECU,现在一根双绞线就能挂一堆节点,多省事。
CAN协议的核心设计目标:
- 多主总线——任何节点都能主动发消息
- 实时性——优先级高的报文不耽误
- 错误检测与容错——坏了的节点自动离线
- 低成本——两根线搞定
1993年,CAN正式成为国际标准ISO 11898。到今天,几乎每辆车上都有CAN总线,从发动机到车窗,从ABS到信息娱乐系统,全在跑CAN。
1.2 物理层特性
CAN总线的物理层,我习惯把它分成两类:高速CAN(ISO 11898-2)和低速容错CAN(ISO 11898-3)。咱们做故障排查,大部分时候遇到的是高速CAN。
| 参数 | 高速CAN | 低速容错CAN |
|---|---|---|
| 最大速率 | 1 Mbps | 125 kbps |
| 总线长度(@最高速率) | 40 m | 500 m |
| 显性电平 | CAN_H ≈ 3.5V, CAN_L ≈ 1.5V | CAN_H ≈ 3.6V, CAN_L ≈ 1.4V |
| 隐性电平 | CAN_H ≈ 2.5V, CAN_L ≈ 2.5V | CAN_H ≈ 0V, CAN_L ≈ 5V |
| 终端电阻 | 120 Ω(两端各一个) | 不固定,通常集成在收发器 |
这里有个坑,我提醒一下:终端电阻是高速CAN的命根子。没有它,信号反射能把波形搞得一塌糊涂。我曾经在项目现场排查一个间歇性通信故障,折腾了两天,最后发现是终端电阻虚焊了。
1.3 差分信号原理
CAN总线为什么抗干扰能力强?核心就在差分信号。
它用两根线——CAN_H和CAN_L——来传输一个信号。发送端让这两根线的电压朝相反方向变化,接收端只看它们的差值。
差分信号的好处:
- 共模噪声被抵消——外界干扰同时作用在两根线上,差值不变
- 电磁辐射小——两根线的电流方向相反,磁场互相抵消
- 逻辑判断简单——只看CAN_H - CAN_L的正负
具体到CAN总线,逻辑电平分两种:
- 显性(Dominant):CAN_H - CAN_L > 0.9V,对应逻辑0
- 隐性(Recessive):CAN_H - CAN_L ≈ 0V,对应逻辑1
为什么会这样设计?因为总线仲裁的时候,显性位会覆盖隐性位。多个节点同时发消息,谁先发0谁就赢。这个机制咱们后面讲数据链路层时会细说。
我遇到过不少新手,拿万用表量CAN_H和CAN_L对地电压,发现都是2.5V左右,就以为总线没信号。其实这是隐性状态,正常!你得看差分电压,或者用示波器看波形。
1.4 CAN总线拓扑结构
标准的CAN总线拓扑是直线型(也叫总线型)。所有节点都挂在一根主干线上,每个节点通过短支线(stub)连接。
嗯,这里要注意:支线长度有严格限制。速率越高,支线就得越短。1 Mbps时,支线一般不超过30 cm。
拓扑设计常见错误:
- 星型拓扑——信号反射严重,容易丢帧
- 环形拓扑——数据会绕圈,破坏仲裁机制
- 支线过长——波形畸变,误码率飙升
- 终端电阻位置不对——应该在最远端,不是中间
下面这张图是我自己画的,把CAN总线的核心结构展示清楚:
实际项目中,我见过不少人在拓扑上栽跟头。有一次,一个供应商把CAN总线接成了星型,每个分支都加了终端电阻。结果总线负载一高就丢帧,查了三天才发现是阻抗不匹配。
我的经验法则:
- 能用直线型就别搞花样
- 终端电阻只放在最远两端
- 支线能短就短,别超过30 cm
- 节点数超过10个,建议用CAN中继器或CAN FD