1、CAN总线基础:从起源到应用

大家好,我是老张。做嵌入式这行二十年了,CAN总线算是我打交道最多的协议之一。今天咱们聊聊CAN总线的基础,这部分内容虽然基础,但很多坑都埋在这里。我个人习惯,讲任何协议都得先搞清楚它从哪来、物理上怎么跑的、能用在哪。不然你后面调时序、调采样点,心里没底。

1.1 CAN协议的起源:一场汽车电子革命

上世纪80年代,汽车电子开始爆发。那时候一辆车里的ECU(电子控制单元)越来越多,每个ECU之间要通信,线束变得又重又复杂。我记得有个老工程师跟我吐槽过,说当年一辆豪华车的线束总长能超过2公里,重量几十公斤。这显然不是长久之计。

1983年,德国博世公司开始研发一种新的串行通信协议。目标很明确:

  • 减少线束数量
  • 提高可靠性
  • 支持实时通信

1986年,CAN(Controller Area Network)协议正式发布。说白了,它就是一个让多个ECU共用两根线通信的方案。你想想看,原来每个传感器都要单独拉线到控制器,现在大家挂到同一根总线上,谁有话谁说,多清爽。

关键里程碑:

  • 1986年:博世发布CAN 2.0规范
  • 1991年:CAN 2.0B发布,引入29位扩展标识符
  • 1993年:ISO 11898标准正式采纳CAN协议
  • 2003年:CAN FD(灵活数据速率)开始研发

嗯,这里要注意。CAN协议从诞生那天起,就不是为了追求高速。它的核心设计哲学是可靠、实时、低成本。我见过不少新手一上来就问"CAN能跑多快",其实问偏了。你应该问"CAN能多可靠地跑完这帧数据"。

2.2 CAN总线物理层特性:两根线的艺术

CAN总线的物理层,说白了就是两根线:CAN_H和CAN_L。但这两根线的设计,藏着不少门道。

差分信号传输

CAN用的是差分信号。什么意思?就是信号不是靠一根线对地电压来传递,而是靠两根线之间的电压差。这样做的好处很明显:抗干扰能力强。你想想,如果外界有电磁干扰,两根线上受到的干扰基本一样,差值不变,信号就保住了。

我在项目中遇到过一件事。有个客户说他们的CAN通信偶尔丢帧,查了半天发现是线束和电机电源线绑在一起走的。后来把CAN线单独走,问题就解决了。这就是差分信号的局限性——它抗共模干扰,但扛不住差模干扰。

总线电平状态

CAN总线有两种逻辑状态:

状态 CAN_H电压 CAN_L电压 电压差
显性(Dominant) 3.5V 1.5V 2.0V
隐性(Recessive) 2.5V 2.5V 0V

显性位对应逻辑0,隐性位对应逻辑1。这里有个重要特性:显性位会覆盖隐性位。这就是CAN总线仲裁的基础。多个节点同时发送时,谁先发0谁赢。我曾经调试过一个多节点系统,有个节点老是发不出数据,最后发现它的CAN收发器驱动能力不够,显性位电压差只有1.6V,其他节点根本识别不了。

避坑指南:

我曾经因为终端电阻选型吃过亏。CAN总线两端必须各接一个120Ω电阻,这是为了匹配传输线阻抗,防止信号反射。但很多人不知道,这个电阻的精度和功率也有讲究。在长距离总线(比如超过100米)上,电阻误差超过5%就会明显影响信号质量。

总线拓扑与终端

CAN总线推荐用直线拓扑,也就是一根主干线,所有节点用短支线挂上去。支线长度一般不超过0.3米,总线上节点数最多110个(实际受驱动能力限制)。

终端电阻为什么是120Ω?因为CAN总线用的双绞线特性阻抗大约是120Ω。匹配了,信号就不反射。我见过有人图省事只在一端接电阻,结果总线在高速率下波形乱七八糟。

3.3 CAN总线应用领域:不止于汽车

很多人以为CAN总线只用在汽车上。其实它的应用范围比你想的广得多。

汽车电子(传统主战场)

这是CAN的老本行。从发动机控制、变速箱控制,到ABS、安全气囊、车身控制,再到信息娱乐系统,CAN总线几乎无处不在。一辆现代汽车上可能有3-5条CAN总线,分别跑不同速率和不同安全等级的数据。

工业自动化

工业现场对可靠性的要求不比汽车低。CANopen协议就是基于CAN总线的工业通信协议,广泛应用于PLC、传感器、执行器之间的通信。我做过一个产线项目,用CANopen控制几十个伺服驱动器,跑了三年没出过问题。

医疗设备

CT机、超声诊断仪、病人监护仪,这些设备内部都有多个模块需要实时通信。CAN总线的确定性延迟和错误检测机制,非常适合医疗场景。我记得有个做呼吸机的客户,选型时在CAN和RS485之间犹豫,最后选了CAN,因为CAN的CRC校验更可靠。

航空航天与轨道交通

飞机上的飞行控制、高铁上的制动系统,这些对安全性要求极高的场合,CAN总线也有应用。不过这些领域通常会用CAN的增强版本,比如TTCAN(时间触发CAN)或者CAN FD。

个人经验:

如果你在选型时纠结用CAN还是RS485,我建议你考虑三点:

  1. 节点数量超过10个?选CAN
  2. 需要实时响应?选CAN
  3. 数据量不大但要求高可靠?选CAN

RS485的优势在于速率可以更高(最高10Mbps以上),但它的多主通信机制远不如CAN成熟。

小结

这一章我们聊了CAN总线的起源、物理层特性和应用领域。说白了,CAN总线就是为可靠而生。它的差分信号、显性隐性电平、非破坏性仲裁,每一个设计都指向同一个目标:在恶劣环境下稳定通信。

下一章我们会深入位时序和采样点调优。这部分才是真正考验功力的地方。你想想看,同样是1Mbps的速率,为什么有的系统跑得稳,有的系统跑着跑着就丢帧?答案就在位时序里。

好,今天就到这里。有什么问题欢迎交流。