一、CAN总线基础:从起源到物理层

1.1 CAN协议是怎么来的?

CAN总线,全称Controller Area Network。上世纪80年代,汽车电子开始爆发。车里的ECU越来越多,线束越来越重,故障率也越来越高。

我记得有个老工程师跟我讲过,当年一辆豪华车的线束总长能超过2公里。你想想看,这得多重?多难查线?

1983年,德国Bosch公司开始研发一种新的串行通信协议。目标很明确:

  • 减少线束数量
  • 支持多主通信
  • 实时性好
  • 抗干扰能力强

1986年,CAN协议正式发布。后来ISO把它标准化为ISO 11898。说实话,这个协议的设计思路非常巧妙,30多年过去了,在工业、汽车、医疗、机器人领域依然活跃。

核心要点: CAN不是为高速大数据量设计的,它追求的是可靠、实时、简洁。

1.2 CAN vs RS485:到底差在哪?

很多初学者会问:CAN和RS485都是差分信号,能不能互换?

我的回答是:不能。虽然物理层看着像,但协议层完全是两码事。

我直接给你列个对比表,一目了然:

对比项 CAN总线 RS485
通信方式 多主,任意节点可主动发 一主多从,主机轮询
冲突处理 硬件仲裁,无损传输 无仲裁,需软件避免冲突
错误处理 5种错误检测机制,自动重发 无标准错误处理
实时性 高,优先级保证 低,依赖主机调度
最大节点数 标准110个(实际建议40以内) 标准32个(加中继可扩展)
典型速率 125kbps ~ 1Mbps 最高10Mbps(短距离)
成本 略高(需要CAN控制器) 低(UART+收发器即可)

我在项目里遇到过有人用RS485做多主通信,结果数据碰撞得一塌糊涂。后来换成CAN,硬件自动仲裁,问题直接解决。说白了,CAN的仲裁机制是它最值钱的地方。

选型建议: 如果系统节点少、主从明确、对实时性要求不高,RS485够用还便宜。但如果节点多、需要多主通信、对可靠性要求高,直接上CAN,别犹豫。

1.3 物理层特性:差分信号

CAN物理层用的是差分信号。两根线:CAN_H和CAN_L。

为什么用差分?因为抗共模干扰能力强。工业现场电机启停、变频器干扰,单端信号很容易被拉偏。差分信号看的是两根线的电压差,干扰同时作用在两根线上,差值不变。

CAN总线的电平逻辑是这样的:

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

这里有个关键点:显性电平会覆盖隐性电平。仲裁就是靠这个原理实现的——谁先发0,谁就赢得总线。

注意: 不同CAN标准(如CAN 2.0A、CAN FD)的物理层电平略有差异,但基本原理一致。设计电路时务必参考对应收发器的数据手册。

1.4 终端电阻:为什么必须加?

终端电阻是CAN总线里最容易出问题的地方。我见过太多因为终端电阻没加或者加错导致通信失败的案例。

终端电阻的作用有两个:

  1. 阻抗匹配: 防止信号反射。CAN总线特性阻抗约120Ω,终端电阻匹配后信号不会在末端反弹。
  2. 提供偏置: 保证总线在空闲时处于隐性电平(2.5V)。

标准做法:总线两端各加一个120Ω电阻。注意是两端,不是每个节点都加。

我曾经遇到一个项目,现场通信时好时坏。查了两天,最后发现有人在中间节点也加了120Ω电阻,等效电阻变成60Ω,信号反射得一塌糊涂。去掉中间那个,问题解决。

经验值: 低速CAN(125kbps以下)有时可以不加终端电阻,但高速CAN(250kbps以上)必须加。我个人的习惯是,不管速率高低,两端都加,省得后面出问题再查。

1.5 知识结构图

下面这张图帮你理清本章的核心脉络:

CAN总线基础核心知识结构 CAN总线基础核心知识结构 CAN总线基础 协议起源 与RS485对比 物理层特性 1983年Bosch研发 1986年正式发布 ISO 11898标准化 多主 vs 一主多从 硬件仲裁 vs 软件轮询 5种错误检测 vs 无标准 差分信号(CAN_H/CAN_L) 显性/隐性电平 终端电阻(120Ω×2) 核心:差分信号 → 抗干扰 终端电阻 → 防反射 + 提供偏置

1.6 避坑指南

最后分享几个我踩过的坑:

坑1:终端电阻位置不对
我曾经在一个项目中,终端电阻加在了总线中间节点上。结果信号反射严重,125kbps都跑不稳。记住:终端电阻只在总线两端。
坑2:CAN_H和CAN_L接反
这个错误很常见。接反了不会烧设备,但通信完全不通。用万用表量一下CAN_H对地电压,显性时应该是3.5V左右,如果量出来是1.5V,那就是接反了。
坑3:共地问题
CAN是差分信号,理论上可以不共地。但实际项目中,建议所有节点共地。不共地的话,节点间电位差可能超过收发器的共模范围,导致通信异常。

嗯,这一章就到这里。CAN的基础打牢了,后面讲协议帧、仲裁、错误处理的时候,你会理解得更深。