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

各位同学好,我是老周。今天咱们开始聊CAN总线。说实话,我最早接触CAN总线是在做汽车电子项目的时候,那时候被一堆术语搞得头大。后来做多了才发现,CAN总线其实没那么玄乎——它就是一个专门为工业现场和汽车设计的“通信老司机”。

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

上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制、变速箱……每个模块都要互相通信。传统的点对点接线方式,你想想看,一辆车光线束就得几十公斤重。这显然不是长久之计。

1986年,德国博世公司推出了CAN(Controller Area Network)协议。它的目标很明确:

  • 减少线束——一根双绞线搞定所有节点通信
  • 高可靠性——汽车环境电磁干扰大,必须抗得住
  • 实时性——刹车信号不能等,必须秒级响应

我记得第一次看CAN协议文档时,觉得它比RS485复杂不少。但实际用起来,CAN的健壮性确实让人放心。我在一个工程机械项目里,CAN总线在-40℃到85℃的环境下跑了三年没出过问题。

核心要点:CAN不是最快的总线,但它是最“稳”的总线之一。它的设计哲学是“在恶劣环境下可靠工作”,而不是“跑出最高速率”。

1.2 CAN总线物理层特性

物理层说白了就是“信号怎么在线上跑”。CAN总线物理层有几个关键参数,我列个表方便大家对照:

参数 典型值 说明
总线电平 CAN_H: 2.5V~3.5V
CAN_L: 1.5V~2.5V
差分信号,共模电压2.5V
最大速率 1 Mbps(40米内) 速率越高,总线长度越短
总线长度 40米@1Mbps
1000米@50kbps
速率和长度成反比
终端电阻 120Ω(两端各一个) 消除信号反射
节点数 最多110个(实际建议30个以内) 受驱动能力限制
总线拓扑 直线型(主干+分支) 分支长度尽量短

避坑指南:我曾经在一个项目中,为了布线方便把CAN总线接成了星型拓扑。结果通信时好时坏,查了两天才发现是信号反射导致的。CAN总线必须用直线型拓扑,分支长度不要超过30cm。这是血的教训。

1.3 CAN总线差分信号原理

差分信号是CAN总线抗干扰的核心武器。说白了,就是两根线(CAN_H和CAN_L)同时传输信号,但相位相反。

咱们来看一下信号逻辑:

  • 显性电平(Dominant):CAN_H = 3.5V,CAN_L = 1.5V,差分电压 = 2V。对应逻辑“0”。
  • 隐性电平(Recessive):CAN_H = 2.5V,CAN_L = 2.5V,差分电压 = 0V。对应逻辑“1”。

为什么会这样设计?你想想看,如果外界有电磁干扰,它会同时作用在两根线上。比如一个+1V的噪声进来,CAN_H变成4.5V,CAN_L变成2.5V。但差分电压仍然是4.5 - 2.5 = 2V。噪声被抵消了!

小技巧:用示波器看CAN总线时,别只看单根线对地。把探头接在CAN_H和CAN_L之间看差分信号,波形干净得多。我刚开始调试时老盯着单端信号看,波形乱七八糟,后来才发现是方法不对。

下面我画了一张图,把CAN总线的物理层结构、信号波形和节点连接关系都串起来了:

CAN总线物理层结构图 节点1 (ECU) 节点2 (传感器) 节点3 (执行器) 节点4 (网关) CAN_H (2.5V ~ 3.5V) CAN_L (1.5V ~ 2.5V) 120Ω 120Ω 差分信号波形示例 CAN_H CAN_L 差分=2V 差分=0V 关键说明: 1. 显性电平(逻辑0):CAN_H=3.5V,CAN_L=1.5V,差分电压=2V 2. 隐性电平(逻辑1):CAN_H=2.5V,CAN_L=2.5V,差分电压=0V 3. 总线空闲时处于隐性状态,任何节点都可以发送显性位来“抢占总线”

1.4 物理层的关键设计要点

做CAN总线硬件设计时,有几个地方我特别想提醒大家:

  1. 终端电阻必须加——不加的话,信号反射会导致通信失败。我见过有人偷懒只加一个120Ω,结果总线长度超过10米就出问题。
  2. 双绞线要用对——CAN_H和CAN_L必须绞在一起,绞距越密抗干扰越好。我习惯用AWG22或AWG24的屏蔽双绞线。
  3. 共模扼流圈——在强干扰环境(比如变频器旁边),加一个共模扼流圈能有效抑制共模干扰。
  4. 地线连接——各个节点的GND必须连通,否则共模电压会漂移。我踩过这个坑,节点间地电位差超过7V,直接把收发器烧了。

经验之谈:CAN总线物理层看似简单,但80%的通信问题都出在物理层。布线、接地、终端电阻、线缆质量——这些基础工作做扎实了,上层协议才能跑得稳。我每次做项目,第一件事就是拿示波器看总线波形,确认物理层没问题再调软件。

1.5 常见收发器芯片对比

市面上常见的CAN收发器芯片,我整理了一个对比表,方便大家选型:

型号 速率 工作电压 特点 典型应用
TJA1050 1 Mbps 4.75~5.25V 经典款,低功耗 通用汽车电子
TJA1040 1 Mbps 4.75~5.25V 待机模式,低功耗 电池供电设备
SN65HVD230 1 Mbps 3.0~3.6V 3.3V供电,适合MCU直连 嵌入式系统
ISO1050 1 Mbps 3.0~5.5V 隔离型,抗干扰强 工业现场、变频器

我个人习惯,普通项目用TJA1050,便宜又稳定。如果MCU是3.3V的,就用SN65HVD230,省掉电平转换。工业环境强烈建议用ISO1050,隔离能省很多麻烦。

注意:收发器芯片的电源去耦电容一定要靠近芯片引脚放置,我见过有人把电容放得老远,结果总线波形上全是毛刺。100nF的陶瓷电容,引脚越短越好。