1. CAN总线基础:从起源到物理层,把底子打牢

大家好,我是你们的讲师。咱们这门课叫《CMS32单片机CAN总线调试与故障定位实战》,第一节课,我打算先把CAN总线的老底儿翻出来聊聊。

你可能会问:“学个调试,干嘛要扯到协议起源?” 嗯,我当年也有这想法。直到有一次,我在现场调一个多节点通信丢包的问题,折腾了两天,最后发现是有人把标准帧和扩展帧的ID掩码配错了。那一刻我才明白——基础不牢,地动山摇。咱们今天就把地基夯实。

1.1 CAN协议是怎么来的?

CAN,全称Controller Area Network,控制器局域网。这玩意儿是1986年由德国博世公司(Bosch)搞出来的。当时汽车电子化刚起步,车里一堆ECU(电子控制单元),每个ECU之间要用线连来连去,线束又重又贵,还容易出故障。

博世那帮工程师就想:能不能搞一条总线,把所有节点都挂上去,大家共用一对线通信?于是CAN总线诞生了。1987年,Intel造出了第一颗CAN控制器芯片——82526。从那以后,CAN就成了汽车和工业领域的“标配”。

核心要点: CAN总线最初是为了解决汽车内部点对点线束过多的问题,后来因为可靠性高、实时性好,被工业自动化、医疗设备、机器人等行业广泛采用。

1.2 CAN 2.0A与2.0B:标准帧 vs 扩展帧

CAN协议有两个版本,CAN 2.0A和CAN 2.0B。说白了,它们最大的区别就是——ID(标识符)的长度不一样。

  • CAN 2.0A(标准帧): ID是11位。最多能定义2^11 = 2048个不同的ID。
  • CAN 2.0B(扩展帧): ID是29位。最多能定义2^29 = 5亿多个ID。

你想想看,早期汽车里ECU不多,11位ID够用了。后来车越来越智能,一个车上几十个ECU,再加上诊断、娱乐系统,11位ID就不够分了。所以博世在1991年推出了CAN 2.0B,把ID扩展到29位。

我在项目里见过有人把标准帧和扩展帧混用,结果CAN控制器死活收不到数据。为什么?因为标准帧和扩展帧的仲裁场格式不一样,控制器如果没配对,根本认不出来。

对比项 标准帧 (CAN 2.0A) 扩展帧 (CAN 2.0B)
ID长度 11位 29位
帧起始 1位显性位 1位显性位
仲裁场 11位ID + RTR位 29位ID(分两段) + SRR + IDE + RTR
IDE位 显性(0) 隐性(1)
数据场长度 0~8字节 0~8字节
应用场景 简单系统、老设备 复杂系统、多节点

个人经验: 我建议你在新项目里统一用扩展帧。虽然11位ID在简单系统里够用,但万一后期要加功能,改ID映射表会非常痛苦。用29位ID,留足余量,省得以后踩坑。

1.3 CAN总线物理层:差分信号与终端电阻

聊完协议层,咱们看看物理层。CAN总线物理层有两个关键点:差分信号和终端电阻。

1.3.1 差分信号——抗干扰的秘诀

CAN总线用一对双绞线传输数据,这两根线分别叫CAN_H和CAN_L。信号不是用单端对地电压表示的,而是用两根线之间的电压差来表示。

  • 显性位(逻辑0): CAN_H比CAN_L高约2V(CAN_H≈3.5V,CAN_L≈1.5V,差分电压≈2V)。
  • 隐性位(逻辑1): CAN_H和CAN_L电压相等(约2.5V,差分电压≈0V)。

为什么要用差分?说白了,就是抗干扰。工业现场电磁环境恶劣,如果单端信号,地线一抖,信号就飘了。差分信号不一样——外界干扰同时作用在CAN_H和CAN_L上,差分电压基本不变。这就是CAN总线能在工厂、汽车里稳定工作的底气。

我记得有一次,客户说他们的设备在电机启动时CAN通信就断。我去现场一看,CAN线跟电机动力线绑在一起走线,而且没做屏蔽。我让他们把CAN线换成双绞屏蔽线,单独走线槽,问题就解决了。嗯,物理层的事,很多时候就是布线的事。

1.3.2 终端电阻——信号反射的克星

CAN总线要求在总线两端各接一个120Ω的终端电阻。为什么是120Ω?因为CAN双绞线的特性阻抗大约是120Ω。终端电阻的作用是吸收信号能量,防止信号在总线末端反射。

你想想看,信号在线上跑,跑到末端如果遇到开路,就会反射回来,跟后面的信号叠加,造成波形畸变。轻则误码,重则整个网络瘫痪。

避坑指南: 我曾经遇到过一个问题:一个CAN网络有5个节点,通信时好时坏。查了半天,发现有人把终端电阻接在了中间节点上,而不是两端。记住:终端电阻必须接在总线的最远两端,中间节点不能接。如果节点数少,也可以只在两端各接一个120Ω电阻。

1.4 知识结构图:CAN总线基础全景

下面这张图把咱们这一章的核心内容串起来了。你可以把它当作一个“知识地图”,以后遇到问题,先看看自己卡在哪个环节。

CAN总线基础知识结构图 CAN总线基础知识结构图 CAN总线基础 协议起源 帧格式 物理层 1986年博世公司提出 解决汽车线束过多问题 标准帧:11位ID 扩展帧:29位ID 差分信号(CAN_H / CAN_L) 终端电阻(120Ω × 2) 核心要点 CAN总线 = 协议层(帧格式) + 物理层(差分信号 + 终端电阻) 调试时先确认物理层,再查协议层

1.5 本章小结

咱们这一章把CAN总线的三个核心问题讲清楚了:

  1. 协议起源: 博世为了解决汽车线束问题搞出来的,后来成了行业标准。
  2. 帧格式: 标准帧11位ID,扩展帧29位ID,别混用。
  3. 物理层: 差分信号抗干扰,终端电阻防反射,布线要讲究。