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节点内部包含:
- CAN控制器:处理协议层,比如CMS32内置的CAN模块
- CAN收发器:把控制器的逻辑电平转换成总线差分信号
- 终端电阻:两端节点各一个120Ω
收发器是物理层的关键。常用的有TJA1050、SN65HVD230等。选型时注意:
- 供电电压(5V还是3.3V)
- 速率支持(经典CAN最高1Mbps,CAN FD更高)
- 是否支持待机/唤醒模式
我习惯在收发器的CAN_H和CAN_L引脚上各串一个小电阻(比如10Ω),再对地接TVS管。这能有效防护ESD和浪涌。别问我怎么知道的——修过几块烧坏的板子就懂了。
1.4 本章知识结构图
下面这张图把CAN总线的核心脉络串起来了。从协议起源到物理层,再到节点组成,一目了然。
这张图把CAN总线的知识体系分成了五层:起源、发展、地位、物理层、节点组成。每一层都是下一层的基础。我个人建议你把这图存下来,后面调试遇到问题,回来看看是哪一层出了岔子。
1.5 小结
这一章我们聊了CAN的来龙去脉。从博世为了解决线束问题而发明它,到如今成为汽车电子的标配,CAN用实力证明了它的价值。物理层的差分信号和终端电阻,是保证通信可靠的基础。我在后续章节会带着大家一步步在CMS32上把CAN调通,还会分享很多实战中踩过的坑。
记住一句话:CAN不难,但细节决定成败。一根线没接对,一个电阻没焊,都可能让你调一整天。咱们下章见。