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