1. CAN总线基础:从起源到物理层

各位同学,咱们今天正式开讲CAN总线。说实话,每次带新人做车载项目,我第一件事就是让他们把CAN总线的底子打牢。为什么?因为你在车上看到的每一个ECU——发动机控制器、变速箱、ABS、车身域控制器——它们之间怎么聊天?靠的就是CAN总线。这玩意儿要是搞不明白,后面做诊断、做标定、做网络管理,全得翻车。

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

上世纪80年代,汽车电子开始爆发。每个功能加一个ECU,ECU之间用一堆点对点的线连着。你想想看,一辆车几十个ECU,线束比人的血管还密。重、贵、难装配,而且故障率极高。

1983年,德国Bosch公司开始琢磨:能不能搞一套总线,让所有ECU都挂在一对线上通信?1986年,CAN(Controller Area Network)协议正式发布。1993年,它成了国际标准ISO 11898。

CAN协议的核心设计目标:

  • 实时性:消息优先级仲裁,高优先级报文不等待
  • 可靠性:差分信号抗干扰,CRC校验防错
  • 低成本:两根线,所有节点共享
  • 灵活性:增减节点不用改硬件

我个人习惯:每次跟新人讲CAN起源,我都会说——你想想,如果没有CAN,一辆现代汽车里的线束重量能超过100公斤。CAN总线把线束减到十几公斤,这就是它存在的意义。

1.2 物理层特性——差分信号与总线电平

CAN总线的物理层,说白了就是一对双绞线:CAN_H和CAN_L。它用的是差分信号传输。为什么用差分?因为车上的电磁环境太恶劣了——发动机点火、电机驱动、各种开关动作,全是噪声源。差分信号能共模抑制,抗干扰能力比单端信号强得多。

1.2.1 差分信号原理

差分信号就是:信息不靠一根线对地的电压来表达,而是靠两根线之间的电压差。

  • 显性电平(Dominant):CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,差分电压 ≈ 2V。代表逻辑"0"。
  • 隐性电平(Recessive):CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,差分电压 ≈ 0V。代表逻辑"1"。

这里有个关键点:显性电平会覆盖隐性电平。也就是说,只要有一个节点拉出显性电平,总线就是显性。这就是CAN总线仲裁的物理基础——谁先发0,谁就赢。

避坑指南:我曾经在一个项目中,发现总线偶尔出现通信中断。排查了半天,最后发现是CAN_H和CAN_L线接反了。差分信号虽然抗干扰,但极性反了,接收器读到的电压差是负的,直接判成错误帧。所以,布线时一定注意双绞线的颜色标记——我习惯用CAN_H=黄色,CAN_L=绿色。

1.2.2 总线电平与逻辑关系

信号状态 CAN_H电压 CAN_L电压 差分电压 逻辑值
显性(Dominant) 3.5V 1.5V ≈ 2.0V 0
隐性(Recessive) 2.5V 2.5V ≈ 0V 1

为什么会这样设计?你想想看,总线空闲时所有节点都是隐性,这时候总线是"1"。一旦有节点要发数据,它先拉出显性"0"——这就相当于在总线上喊了一声"我要说话"。其他节点听到显性,就知道有人占线了。

1.3 CAN总线拓扑结构

CAN总线采用多主总线拓扑。什么意思?就是总线上没有"老大",每个节点都能主动发消息。谁先抢到总线,谁就发。

标准的CAN总线拓扑长这样:

CAN总线拓扑结构图 CAN总线拓扑结构 CAN_H CAN_L 120Ω 120Ω ECU 1 ECU 2 ECU 3 ECU 4 拓扑要点 • 总线两端各需一个120Ω终端电阻,用于阻抗匹配 • 节点通过支线(stub)连接到主干线,支线长度建议 < 0.3m • 节点数量受收发器驱动能力限制,典型值 ≤ 30个

这张图里,几个关键点我得强调一下:

  • 终端电阻:总线两端各一个120Ω电阻。作用是吸收信号反射,防止波形畸变。没有这两个电阻,高速通信时信号会来回弹,误码率飙升。
  • 支线长度:每个节点通过一段支线接到主干。支线越长,信号反射越严重。我建议支线控制在30厘米以内,超过这个数,高速CAN(1Mbps)就容易出问题。
  • 节点数量:理论上CAN总线可以挂110个节点,但实际受收发器驱动能力限制。我做过一个项目挂了32个节点,总线负载一高,隐性电平就被拉偏了。后来加了中继器才解决。

注意:CAN总线拓扑必须是直线型,不能搞成星型或环型。我曾经见过一个团队把CAN总线接成星型,结果终端电阻不知道放哪,通信一塌糊涂。记住——直线拓扑,两端端接,这是铁律。

1.4 物理层关键参数速查

参数 高速CAN(ISO 11898-2) 低速CAN(ISO 11898-3)
最大速率 1 Mbps 125 kbps
最大总线长度 40 m @ 1 Mbps 500 m @ 125 kbps
显性电平 CAN_H=3.5V, CAN_L=1.5V CAN_H=3.5V, CAN_L=1.5V
隐性电平 CAN_H=2.5V, CAN_L=2.5V CAN_H=2.5V, CAN_L=2.5V
终端电阻 120Ω × 2 可选
典型应用 动力总成、底盘 车身控制、舒适系统

这里有个经验值:速率和总线长度成反比。1Mbps时最多跑40米,125kbps时可以跑500米。为什么?速率越高,信号边沿越陡,反射越敏感。所以,动力总成CAN(高速)通常只在发动机舱内,车身CAN(低速)可以绕整车一圈。

1.5 小结

这一章我们聊了CAN总线的起源、物理层的差分信号原理、总线电平逻辑,以及拓扑结构。说白了,CAN总线就是一对双绞线,靠电压差传数据,所有节点挂在一根线上,谁先拉显性谁就赢。这些基础概念,后面每一章都会用到。