1. CAN协议概述:从起源到物理层

各位同学,咱们今天正式开讲CAN总线。说实话,每次我带新人做嵌入式项目,第一个要问的就是——你选RS485还是CAN?很多人答不上来。这很正常,因为这两者表面看都是差分通信,但骨子里完全是两套思路。

我个人习惯把CAN比作「汽车工业的脊梁」。为什么这么说?因为从发动机到ABS,从车窗到门锁,一辆现代汽车里跑着几十条CAN总线。没有它,车就是个铁壳子。

1.1 CAN总线的起源

故事要从1980年代讲起。那时候汽车电子开始爆发,ECU越来越多,线束越来越重。我记得有个数据:一辆豪华车的线束总长能超过2公里,重量接近50公斤。这哪是造车,简直是织毛衣。

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

  • 多主通信——任何节点都能主动发数据
  • 实时性强——优先级高的报文不能等
  • 可靠性高——抗干扰、能纠错
  • 线束少——两根线搞定所有节点

1986年,CAN(Controller Area Network)正式发布。1993年成为国际标准ISO 11898。到今天,CAN已经统治汽车和工业控制领域超过30年。

核心认知:CAN不是最快的总线,但它是最「稳」的总线。在可靠性面前,速度可以妥协。

1.2 CAN vs RS485:一场硬碰硬的对比

很多工程师问我:RS485便宜又成熟,为什么还要用CAN?

嗯,这个问题我当年也纠结过。有一次做工业现场数据采集,我选了RS485,结果两个节点同时发数据,直接撞车,整个网络瘫痪。从那以后,我对CAN的「总线仲裁」能力佩服得五体投地。

咱们直接看对比表:

对比项 CAN总线 RS485
通信方式 多主,任意节点可主动发 单主,需主机轮询
冲突处理 硬件总线仲裁,无损 无仲裁,冲突即丢包
最大节点数 标准110个(实际建议40-60) 标准32个(加中继可扩展)
最高速率 1 Mbps(40米内) 10 Mbps(短距离)
最大距离 10 km(5 kbps时) 1.2 km(100 kbps时)
错误处理 5种错误检测+自动重发 无硬件错误处理
硬件成本 稍高(需CAN控制器+收发器) 低(UART+收发器)
典型应用 汽车、工业控制、医疗 工业仪表、楼宇自动化

我的建议:如果系统节点超过10个,或者对实时性有硬要求,直接上CAN。RS485在简单点对点场景下性价比更高,但别指望它做复杂网络。

1.3 CAN物理层特性:差分信号与电平

好了,咱们进入最核心的部分。CAN物理层用的是差分信号,两根线分别叫CAN_H和CAN_L。你想想看,为什么不用单端信号?

原因很简单:汽车和工厂里电磁干扰太严重了。单端信号受干扰后电平会飘,但差分信号看的是两根线的电压差,干扰同时作用在两根线上,差值不变。这就是CAN抗干扰的底气。

显性电平 vs 隐性电平

CAN总线只有两种逻辑状态:

  • 隐性电平(Recessive):CAN_H和CAN_L都是2.5V,差分电压≈0V,逻辑值为1
  • 显性电平(Dominant):CAN_H=3.5V,CAN_L=1.5V,差分电压≈2V,逻辑值为0

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

我曾经踩过的坑:有一次调试CAN总线,发现通信时断时续。查了两天,最后发现是CAN_H和CAN_L接反了。差分信号极性反了,收发器还能工作,但抗干扰能力大幅下降。记住:CAN_H接CAN_H,CAN_L接CAN_L,别搞混!

物理层关键参数

参数 ISO 11898-2标准值 说明
隐性电平CAN_H 2.5V 总线空闲或发送1时
隐性电平CAN_L 2.5V 与CAN_H等电位
显性电平CAN_H 3.5V 发送0时拉高
显性电平CAN_L 1.5V 发送0时拉低
差分电压(显性) 2.0V(典型) 接收器阈值通常1.2V
终端电阻 120Ω(两端各一个) 消除信号反射
共模电压范围 -2V ~ +7V 抗共模干扰能力

实战经验:终端电阻一定要加在总线两端,不是每个节点都加。我见过有人每个节点焊120Ω,结果总线负载太重,信号都畸变了。记住:两端各一个120Ω,中间节点不加。

1.4 CAN物理层知识结构图

下面这张图把CAN物理层的核心要素串起来了,方便你建立整体认知:

CAN物理层核心知识结构 CAN物理层 差分信号传输 显性/隐性电平 硬件组成与布线 CAN_H CAN_L 显性=0 隐性=1 CAN控制器 CAN收发器 120Ω终端电阻 核心:差分抗干扰 + 显性覆盖隐性 = 无损仲裁

1.5 为什么CAN能「无损仲裁」?

这个问题我经常被问到。说白了,就是利用了「线与」特性。

当多个节点同时发送数据时,每个节点都会监听总线电平。如果自己发的是隐性(1),但总线上是显性(0),说明有更高优先级的节点在发数据。这时候,低优先级节点自动退出发送,转为接收模式。

整个过程由硬件完成,不丢数据,不浪费带宽。这就是CAN和RS485最本质的区别。

一句话总结:CAN的物理层设计,让总线仲裁变成了「谁先拉低谁赢」的硬件游戏。优先级高的报文永远不用等。

1.6 关于终端电阻的补充

嗯,这里再啰嗦一句。终端电阻的作用是吸收信号反射,防止波形畸变。但很多人不知道:

  • 短距离低速(<1米,<50kbps):不加终端电阻也能工作,但不推荐
  • 标准应用:两端各一个120Ω
  • 长距离高速:必须精确匹配,否则信号反射会导致误码

我曾经在一个项目中偷懒没加终端电阻,结果总线长度超过10米后,通信完全乱套。加了电阻,问题立刻消失。所以,别省那两个电阻的钱。

好了,CAN协议概述就讲到这里。物理层是CAN的根基,理解差分信号和显性/隐性电平,后面讲数据链路层和仲裁机制时你会觉得豁然开朗。