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总线拓扑结构 CAN_H CAN_L 120Ω 120Ω ECU 1 ECU 2 ECU 3 ECU 4 支线 支线 支线 支线 拓扑要点 • 主干线两端各一个120Ω终端电阻 • 支线长度:1 Mbps时 ≤ 30 cm,125 kbps时 ≤ 3 m • 节点数量:高速CAN最多30个(推荐不超过16个)

实际项目中,我见过不少人在拓扑上栽跟头。有一次,一个供应商把CAN总线接成了星型,每个分支都加了终端电阻。结果总线负载一高就丢帧,查了三天才发现是阻抗不匹配。

我的经验法则:

  • 能用直线型就别搞花样
  • 终端电阻只放在最远两端
  • 支线能短就短,别超过30 cm
  • 节点数超过10个,建议用CAN中继器或CAN FD