1. 课程导入

大家好,我是你们这期课程的老朋友。今天咱们正式开篇,聊聊CAN总线。说实话,我在嵌入式这行摸爬滚打了十几年,CAN总线几乎是我每次做车载项目都绕不开的东西。它不是什么新技术,但它的地位,至今无人能撼动。

1.1 CAN协议的起源与发展

CAN,全称Controller Area Network,控制器局域网。这玩意儿是1986年由德国博世公司发明的。当时他们想解决一个很头疼的问题:汽车里的电子设备越来越多,线束又重又乱,故障率还高。

我记得最早接触CAN是在一个商用车项目上。那时候我刚入行,师傅扔给我一本数据手册,说“去把CAN调通”。我一看,这协议怎么连时钟线都没有?后来才明白,这就是它的高明之处——用两根线搞定所有通信。

CAN的发展有几个关键节点:

  • 1986年:博世提出CAN协议,最初用于乘用车
  • 1991年:发布CAN 2.0规范,分为A和B两个版本
  • 1993年:ISO 11898标准发布,CAN正式成为国际标准
  • 2003年:CAN FD(灵活数据速率)开始研发,解决带宽瓶颈
  • 2015年:CAN FD正式标准化,数据段速率可达8Mbps

你想想看,一个协议能活将近40年,还在不断演进,这本身就说明问题。现在CAN FD已经普及,但经典CAN(2.0)依然大量存在。我手头这个CMS32项目,就是基于经典CAN 2.0B做的。

1.2 CAN在汽车电子中的地位

说CAN是汽车电子的“脊梁”,一点不过分。一辆现代汽车里,CAN节点少则二三十个,多则上百个。发动机、变速箱、ABS、气囊、仪表盘、车门、车窗……几乎每个电子单元都挂在CAN总线上。

为什么会这样?因为CAN有几个杀手级特性:

特性 说明 我的体会
多主通信 任何节点都可以主动发消息 不像I2C还得等主机叫号,效率高很多
实时性高 优先级仲裁,高优先级消息不等待 刹车信号永远比车窗信号先走,这是硬保障
可靠性强 CRC校验、错误帧、自动重发 我在现场见过总线被干扰,CAN自己恢复过来了
线束少 只用两根线(CAN_H、CAN_L) 比传统点对点布线省一半以上重量

说白了,CAN就是为“车规级”通信量身定做的。它不怕干扰,不怕节点故障,甚至一根线断了还能单线工作(某些实现)。这些特性,在工业现场和医疗设备里也同样吃香。

核心认知:CAN不是最快的总线,但它是“最可靠”的总线之一。在汽车上,可靠性比速度重要得多。你总不希望刹车时因为总线延迟而出事吧?

1.3 CAN总线物理层特性

物理层,说白了就是信号怎么在线上跑。CAN的物理层很有意思,它用的是差分信号。我刚开始学的时候觉得这玩意儿玄乎,后来自己拿示波器一看,就全明白了。

1.3.1 差分信号原理

CAN总线有两根线:CAN_H(高线)和CAN_L(低线)。信号不是对地测量的,而是看两根线之间的电压差。

  • 显性电平(Dominant):CAN_H比CAN_L高,电压差约2V。逻辑上代表“0”。
  • 隐性电平(Recessive):CAN_H和CAN_L电压相等,电压差约0V。逻辑上代表“1”。

为什么用差分?抗干扰。外部噪声会同时耦合到两根线上,但它们的差值不变。我曾在电机驱动器旁边测CAN信号,单端对地噪声有3V,但差分信号纹丝不动。这就是差分的好处。

实战技巧:调试时别只测一根线对地。把示波器两个通道分别接CAN_H和CAN_L,用数学通道做减法,看差分波形。这才是CAN真正的信号。

1.3.2 总线电平与终端电阻

CAN总线的电平标准由ISO 11898定义。我整理了一个常用参数表:

参数 隐性电平 显性电平
CAN_H电压 2.5V 3.5V
CAN_L电压 2.5V 1.5V
差分电压 0V 2V

这里有个关键点:终端电阻。CAN总线两端各需要接一个120Ω电阻。为什么?

  • 匹配特性阻抗,防止信号反射
  • 提供总线回路的直流负载
  • 保证显性/隐性电平的转换斜率

我曾经在一个项目上吃过亏。总线长度不到1米,我偷懒没接终端电阻。结果通信时好时坏,波形上全是振铃。后来加上120Ω电阻,问题立刻消失。嗯,这个坑我替你们踩过了。

注意:终端电阻必须接在总线物理两端,不是任意位置。如果总线有分支(stub),分支长度不要超过0.3米。否则反射会严重干扰通信。

1.3.3 总线拓扑与节点结构

CAN总线是线性拓扑,所有节点都挂在同一条总线上。每个CAN节点内部包含:

  1. CAN控制器:处理协议层,比如CMS32内置的CAN模块
  2. CAN收发器:把控制器的逻辑电平转换成总线差分信号
  3. 终端电阻:两端节点各一个120Ω

收发器是物理层的关键。常用的有TJA1050、SN65HVD230等。选型时注意:

  • 供电电压(5V还是3.3V)
  • 速率支持(经典CAN最高1Mbps,CAN FD更高)
  • 是否支持待机/唤醒模式

我习惯在收发器的CAN_H和CAN_L引脚上各串一个小电阻(比如10Ω),再对地接TVS管。这能有效防护ESD和浪涌。别问我怎么知道的——修过几块烧坏的板子就懂了。

1.4 本章知识结构图

下面这张图把CAN总线的核心脉络串起来了。从协议起源到物理层,再到节点组成,一目了然。

CAN总线知识体系结构 CAN协议起源 1986 博世发明 1991 CAN 2.0规范 2015 CAN FD标准化 汽车电子核心总线 差分信号原理 总线电平标准 终端电阻匹配 CAN控制器 CAN收发器 终端电阻 CAN总线核心:差分信号抗干扰 + 多主仲裁实时性 + 终端匹配防反射 物理层是调试中最容易出问题的地方,务必重视

这张图把CAN总线的知识体系分成了五层:起源、发展、地位、物理层、节点组成。每一层都是下一层的基础。我个人建议你把这图存下来,后面调试遇到问题,回来看看是哪一层出了岔子。

1.5 小结

这一章我们聊了CAN的来龙去脉。从博世为了解决线束问题而发明它,到如今成为汽车电子的标配,CAN用实力证明了它的价值。物理层的差分信号和终端电阻,是保证通信可靠的基础。我在后续章节会带着大家一步步在CMS32上把CAN调通,还会分享很多实战中踩过的坑。

记住一句话:CAN不难,但细节决定成败。一根线没接对,一个电阻没焊,都可能让你调一整天。咱们下章见。