1. CAN总线基础:从起源到物理层
大家好,我是你们的老朋友。今天咱们聊聊CAN总线的根儿——它的起源、标准、还有物理层那些事儿。
说实话,我刚入行那会儿,对CAN总线的理解也就停留在“两根线,能通信”的层面。直到有一次,我在一个项目中调试总线信号,示波器上波形乱跳,排查了半天才发现是终端电阻没焊好。从那以后,我就特别重视物理层的基础知识。你想想看,如果物理层都不稳,上层协议再花哨也是白搭。
1.1 CAN协议的起源:为什么会有CAN?
上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制、仪表盘……每个模块都独立工作,线束多得吓人。我记得有个老工程师跟我说,那时候一辆豪华车的线束总长能超过2公里,重量几十公斤。这不仅是成本问题,更是可靠性的噩梦。
1983年,德国博世公司开始研发一种新的串行通信协议。1986年,CAN(Controller Area Network)正式发布。它的目标很明确:用两根线替代复杂的点对点连线,让所有节点共享一条总线。
我个人觉得,CAN协议最聪明的地方在于它的“非破坏性仲裁”机制。多个节点同时发送数据时,优先级高的节点自动获胜,低优先级的节点乖乖退让。这个设计在实时控制系统中简直是神来之笔。
核心要点:CAN总线最初是为汽车设计的,目标是减少线束、提高可靠性、支持实时通信。它后来被广泛应用于工业自动化、医疗设备、航空航天等领域。
1.2 CAN 2.0A/B标准:两个版本的区别
CAN协议在1991年标准化为CAN 2.0,分为A和B两个部分。说白了,它们最大的区别就是——标识符的长度。
| 特性 | CAN 2.0A(标准帧) | CAN 2.0B(扩展帧) |
|---|---|---|
| 标识符长度 | 11位 | 29位 |
| 最大节点数 | 约2032个 | 约5.36亿个 |
| 帧格式 | 标准帧 | 标准帧 + 扩展帧 |
| 兼容性 | CAN 2.0B节点可接收 | CAN 2.0A节点无法接收扩展帧 |
嗯,这里要注意:CAN 2.0B的控制器可以发送和接收标准帧,也能处理扩展帧。但CAN 2.0A的控制器只能处理标准帧。我在项目中遇到过这种情况:一个老款ECU只支持CAN 2.0A,新设计的网关却用了扩展帧,结果两边死活对不上话。最后只能把网关配置成只发标准帧,才解决了问题。
我个人习惯是:如果项目没有特殊需求,优先用标准帧(11位ID)。因为它的帧开销更小,总线利用率更高。只有在节点数量超过1000个,或者需要更复杂的消息过滤时,才考虑扩展帧。
1.3 CAN总线物理层特性:两根线的大学问
CAN总线的物理层,说白了就是一对双绞线:CAN_H和CAN_L。但别小看这两根线,里面的门道可不少。
1.3.1 差分信号:为什么用两根线?
你可能会问:为什么不用单端信号?比如像UART那样,一根线发,一根线收?
原因很简单:抗干扰。汽车环境里电磁干扰特别严重,发动机点火、电机运转、继电器通断……这些都会产生强烈的电磁噪声。单端信号很容易被干扰,导致误码。
差分信号的工作原理是这样的:
- CAN_H和CAN_L上的电压是相反的
- 接收器只关心两根线的电压差
- 外部干扰同时作用在两根线上,差值基本不变
举个例子:假设CAN_H是3.5V,CAN_L是1.5V,差值是2V。如果外部干扰让两根线都升高了1V,变成4.5V和2.5V,差值还是2V。这就是差分信号的抗干扰能力。
避坑指南:我曾经在一个项目中,CAN总线走线太长,而且和电源线绑在一起。结果总线上的共模干扰特别大,导致通信频繁出错。后来我把CAN线单独走,并加了共模扼流圈,问题才解决。记住:差分信号虽然抗干扰,但共模干扰太大时也会出问题。
1.3.2 总线电平:显性位和隐性位
CAN总线有两种逻辑状态:显性(Dominant)和隐性(Recessive)。
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 | 逻辑值 |
|---|---|---|---|---|
| 隐性 | 2.5V | 2.5V | 0V | 1(逻辑高) |
| 显性 | 3.5V | 1.5V | 2V | 0(逻辑低) |
这里有个容易混淆的地方:显性位对应逻辑0,隐性位对应逻辑1。为什么这么设计?因为CAN总线的仲裁机制需要“线与”逻辑——多个节点同时发送时,显性位(0)会覆盖隐性位(1)。
你想想看,如果反过来,显性位是1,隐性位是0,那仲裁时就乱套了。所以这个设计是有深意的。
1.3.3 终端电阻:为什么必须加?
CAN总线两端必须各接一个120Ω的终端电阻。这个电阻的作用是匹配阻抗,防止信号反射。
我记得有一次,一个同事调试CAN总线,发现波形上有明显的振铃现象。他查了半天,最后发现总线一端没接终端电阻。加上电阻后,波形立刻干净了。
重要提醒:终端电阻必须接在总线的两端,而不是中间。如果接在中间,反射问题依然存在。另外,电阻值必须是120Ω,误差不超过1%。我见过有人用100Ω代替,结果信号质量明显下降。
1.4 总结:打好基础才能走得更远
好了,这一章的内容就到这里。我们聊了CAN协议的起源、2.0A/B标准的区别、差分信号的原理、总线电平的定义,还有终端电阻的重要性。
我个人觉得,CAN总线的基础知识就像盖房子的地基。地基打不牢,后面学再多高级特性也是空中楼阁。尤其是物理层,很多通信问题都出在这里。你如果能把差分信号、终端电阻、总线电平这些概念吃透,后面学CAN FD和CAN XL就会轻松很多。
下一章,我们会深入CAN的数据链路层,聊聊帧格式、仲裁机制、错误处理这些实战内容。到时候我会分享更多项目中的踩坑经验,敬请期待。
本章要点回顾:
- CAN协议起源于1986年,博世公司开发,目标是减少汽车线束
- CAN 2.0A使用11位标识符,CAN 2.0B使用29位标识符
- 差分信号通过CAN_H和CAN_L的电压差传输数据,抗干扰能力强
- 显性位(逻辑0)电压差约2V,隐性位(逻辑1)电压差0V
- 总线两端必须各接120Ω终端电阻,防止信号反射
公众号:蓝海资料掘金营,微信deep3321