第1章:CAN总线基础

1.1 CAN协议的起源——从一根线说起

说实话,我刚入行那会儿,对CAN总线的第一印象就是「这玩意儿真抗造」。为什么这么说?你想想看,在汽车这种电磁环境极其恶劣的地方,动不动就是发动机点火、电机启停,信号干扰大得吓人。传统的串口通信在这种环境下基本就是废的。

CAN总线是1980年代由德国博世公司开发的。初衷很简单——让车上的各个ECU能可靠地互相说话。当时汽车电子化刚刚起步,线束越来越多,重量越来越重,故障率也越来越高。博世这帮工程师就想:能不能用两根线代替几十根线?

于是CAN诞生了。全称叫Controller Area Network,控制器局域网。我个人的理解是:它本质上就是一个「多主总线」,任何节点都可以随时发消息,不需要有个老大来调度。这在汽车这种实时性要求高的场景下,太重要了。

核心要点:CAN总线不是最快的,也不是最便宜的,但它是在强干扰、高可靠性要求下,性价比最高的选择。我在做BMS项目时,见过太多因为通信不稳定导致的故障,最后都换成了CAN。

1.2 物理层特性——差分信号是怎么抗干扰的

好,咱们聊聊物理层。这是很多初学者容易忽略的地方,但恰恰是CAN最精髓的部分。

CAN总线用两根线:CAN_H和CAN_L。它不传单端信号,而是传差分信号。什么意思?就是信号不是对地测量的,而是看两根线之间的电压差。

举个例子:

  • 显性电平(逻辑0):CAN_H比CAN_L高2V左右
  • 隐性电平(逻辑1):CAN_H和CAN_L电压相等,约2.5V

为什么会这样设计?我跟你讲个真实经历。有一次我们在做整车测试,电机启动瞬间,地线上的噪声能跳到好几伏。如果用单端信号,数据早就乱套了。但CAN的差分信号,两根线受到的干扰几乎是一样的,一减就抵消了。这就是共模抑制。

小技巧:我在项目中习惯用示波器同时看CAN_H和CAN_L,然后看它们的差值。如果差值波形干净,但单端波形很脏,说明总线工作正常。如果差值波形也有毛刺,那就要查终端电阻或者线缆问题了。

1.3 总线电平——显性和隐性的博弈

CAN总线的电平逻辑其实挺有意思的。它用的是「线与」逻辑——多个节点同时发数据时,显性电平会覆盖隐性电平。

具体来说:

  • 隐性电平:CAN_H = 2.5V,CAN_L = 2.5V,差值为0V
  • 显性电平:CAN_H = 3.5V,CAN_L = 1.5V,差值为2V

你想想看,如果两个节点同时发消息,一个发显性,一个发隐性,总线上的结果是什么?答案是显性。这就是CAN总线仲裁的基础——谁发的显性位多,谁就赢。

我记得有一次调试,发现某个节点总是发不出消息。查了半天,原来是它的CAN收发器供电电压偏低,导致显性电平不够「显性」,总被其他节点覆盖。嗯,这种坑踩过一次就记住了。

信号状态 CAN_H电压 CAN_L电压 差分电压 逻辑值
隐性 2.5V 2.5V 0V 1
显性 3.5V 1.5V 2V 0

1.4 CAN总线拓扑结构——一条线串起所有节点

CAN总线的拓扑结构,说白了就是一条主干线,上面挂一堆节点。每个节点通过短的支线连到主干上。

我建议你记住几个关键参数:

  • 主干线两端必须各接一个120Ω的终端电阻
  • 支线长度一般不超过0.3米,高速CAN更严格
  • 节点数量理论上最多110个,但实际建议不超过30个

避坑指南:我曾经在一个项目中,为了省事,没在总线两端接终端电阻。结果通信时好时坏,波形反射得一塌糊涂。后来老老实实加上电阻,问题立刻消失。记住:终端电阻不是可选项,是必须项!

拓扑结构其实还有几种变体:

  1. 直线型:最常见,主干线走到底,节点挂在上面
  2. 星型:中心一个集线器,各节点辐射出去。不推荐,容易出问题
  3. 树型:主干分出多个分支。偶尔用,但要严格控制分支长度

我个人最推荐直线型。简单、可靠、好排查故障。你想想看,如果车上某个ECU出了问题,直线型拓扑下,你只要顺着主干线量过去,很快就能定位问题节点。

1.5 关于波特率的一点经验

CAN总线的波特率不是越高越好。常见的BMS系统一般用250kbps或500kbps。为什么?因为波特率越高,总线长度就得越短。

这里有个经验公式:

总线最大长度(米) ≈ 40 / 波特率(Mbps)

举个例子:

  • 500kbps时,最大长度约80米
  • 250kbps时,最大长度约160米
  • 1Mbps时,最大长度约40米

在BMS项目中,电池包内部走线一般不会太长,所以我习惯用500kbps。但如果整车总线要跨整个车身,那就得降到250kbps甚至更低。

提示:选波特率时,别忘了考虑所有节点的晶振精度。CAN协议要求每个节点的时钟误差不超过1.5%。如果晶振精度不够,高速率下很容易出同步问题。我见过有人用便宜的晶振跑1Mbps,结果丢包率高达30%。

1.6 小结

CAN总线的基础,说白了就是三件事:差分信号抗干扰、显隐性电平做仲裁、直线拓扑保可靠。这些东西看着简单,但实际项目中踩的坑往往就出在这些基础点上。

下一章我们会聊CAN的数据帧结构,以及那个让我又爱又恨的仲裁机制。到时候再跟你分享几个调试中的真实案例。