1. CAN总线基础:从起源到物理层,一次讲透

大家好,我是老周。做嵌入式这些年,打交道最多的总线就是CAN。说实话,刚入行那会儿我也觉得CAN挺玄乎的——两根线怎么就能在那么恶劣的环境下稳定传数据?后来踩的坑多了,才慢慢摸透它的脾气。

这一章,咱们就从CAN的根儿上聊起。不扯虚的,全是干货。

1.1 CAN协议是怎么来的?

上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制……每个模块都自己拉一堆线。你想想看,一辆车光线束就几十公斤,成本高、故障多。

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

  • 用最少的两根线,把车上所有电子单元连起来
  • 实时性要好,不能丢数据
  • 抗干扰要强,毕竟发动机舱里全是电磁噪声

1986年,CAN(Controller Area Network)正式发布。我记得第一次看到CAN的文档时,最让我吃惊的是它的多主站架构——任何节点都能主动发消息,不需要主机轮询。这在当时是非常前卫的设计。

核心要点: CAN不是为办公室环境设计的,它天生就是为工业、汽车这类“脏乱差”场景准备的。所以它的物理层、协议层,处处都透着“抗造”两个字。

1.2 物理层特性:为什么CAN能跑那么远?

CAN的物理层,说白了就是一对双绞线,加上差分驱动器和接收器。但这里面的门道不少。

参数 高速CAN(ISO 11898-2) 低速CAN(ISO 11898-3)
最大速率 1 Mbps 125 kbps
最大总线长度 40 m @ 1 Mbps 500 m @ 125 kbps
显性电平 CANH 3.5V / CANL 1.5V CANH 5V / CANL 0V
隐性电平 CANH 2.5V / CANL 2.5V CANH 2.5V / CANL 2.5V
终端电阻 120 Ω(两端各一个) 无强制要求

这里有个关键点:速率和距离是成反比的。我见过不少新手,上来就想跑1 Mbps、100米,结果通信一塌糊涂。为什么?因为信号在长线上有衰减,位时间太短,采样点对不准。

我的经验: 实际项目中,我一般按“速率 × 距离 ≤ 40”来估算。比如500 kbps,总线长度最好别超过80米。超过这个范围,丢包率会明显上升。

1.3 差分信号原理:两根线怎么抗干扰?

这是CAN最巧妙的地方。咱们先看个图:

CAN差分信号原理 发送节点 接收节点 CANH (3.5V / 2.5V) CANL (1.5V / 2.5V) 差分电压 = CANH - CANL 显性:2V 差 隐性:0V 差 共模干扰同时叠加在CANH和CANL上,差分电压不变 这就是CAN抗干扰能力的核心秘密

差分信号的核心思想:不依赖单根线的绝对电压,而是看两根线之间的电压差。

  • 显性(Dominant): CANH 3.5V,CANL 1.5V,差值为2V。代表逻辑“0”。
  • 隐性(Recessive): CANH 2.5V,CANL 2.5V,差值为0V。代表逻辑“1”。

为什么会这样设计?我举个例子。假设发动机点火时产生了一个强电磁脉冲,两根线上同时被感应出+5V的噪声。如果是单端信号,早就乱套了。但差分信号呢?CANH变成8.5V,CANL变成6.5V,差值还是2V——数据纹丝不动。

注意: 差分信号虽然抗共模干扰强,但对差模干扰敏感。两根线的绞距、线缆的阻抗一致性,都会影响信号质量。我曾经在一个项目中,因为用了不同批次的线缆,导致CANH和CANL的延迟不一致,通信时好时坏。排查了整整两天才找到原因。

1.4 CAN总线拓扑结构:怎么连才靠谱?

CAN总线推荐的是直线型拓扑,也叫总线型。所有节点都挂在一对主干线上,每个节点通过短的支线接入。

CAN总线直线型拓扑 120Ω 120Ω 节点 1 节点 2 节点 3 节点 4 支线长度建议 ≤ 0.3m,最长不超过 1m 终端电阻必须接在总线两端,不能接在节点内部

这里有几个硬性规则,我建议你记牢:

  1. 终端电阻必须接在总线两端。120Ω,一个都不能少。少了反射,多了衰减。
  2. 支线越短越好。我见过有人用2米长的支线接一个传感器,结果整个网络都跑不稳。支线长了,相当于在总线上加了一个“小尾巴”,信号反射得一塌糊涂。
  3. 节点数有限制。标准CAN最多支持110个节点(取决于收发器驱动能力)。实际项目中,我一般控制在30个以内,超过这个数,总线负载和信号质量都会下降。

避坑指南: 我曾经在一个项目中,客户要求把CAN节点分布在三个机柜里,机柜之间距离15米。我用了星型拓扑,结果通信完全不行。后来改成总线型,每个机柜内用短支线接入主干,问题就解决了。记住:CAN不是以太网,别用星型。

1.5 小结:CAN物理层的三个关键点

聊了这么多,其实就三件事:

  • 差分信号是CAN抗干扰的根基,理解它你就理解了CAN为什么能在工业现场活下来。
  • 终端电阻是信号质量的保障,少了它,反射会让你怀疑人生。
  • 总线拓扑是系统稳定的骨架,直线型、短支线,别搞花活。