一、CAN总线基础:从起源到物理层

大家好,我是老张。做汽车电子这些年,CAN总线是我打交道最多的东西。今天咱们就从最基础的地方聊起,把CAN总线的来龙去脉说清楚。

1.1 CAN协议的起源——为什么会有CAN?

上世纪80年代,汽车里的电子设备越来越多。那时候每个模块之间都是点对点连线,你想想看,一辆车几十个ECU,线束比人的手臂还粗。不仅成本高,故障率也高。

1983年,德国博世公司开始研发一种新的串行通信协议。1986年,他们在SAE大会上正式发布了CAN(Controller Area Network)总线。说白了,就是想让车上的各个电子模块能共用两根线来通信。

我个人觉得,CAN总线最厉害的地方在于:它从一开始就考虑到了汽车环境的恶劣性。电磁干扰、温度变化、振动冲击,这些在实验室里想不到的问题,CAN都做了针对性设计。

核心特点:

  • 多主站通信——任何节点都可以主动发消息
  • 实时性强——优先级高的消息优先发送
  • 可靠性高——有完善的错误检测机制
  • 成本低——只需要两根线

1.2 物理层特性——两根线走天下

CAN总线的物理层,说白了就是一对双绞线。一根叫CAN_H(高电平线),一根叫CAN_L(低电平线)。

这里有个关键参数:CAN总线的电平标准。我刚开始做项目时,经常搞混显性电平和隐性电平的概念。咱们直接看表格:

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

嗯,这里要注意:显性电平对应逻辑0,隐性电平对应逻辑1。为什么这么设计?因为总线仲裁时,显性电平可以覆盖隐性电平。谁先发0,谁就赢得总线控制权。

1.3 差分信号原理——抗干扰的秘密武器

为什么CAN总线要用两根线?直接用一根线对地不行吗?

我遇到过这样一个案例:在某款车型的EMC测试中,单端信号线在100MHz频段辐射超标严重,而同一块板子上的CAN总线却纹丝不动。原因就在差分信号上。

差分信号的原理其实很简单:

  • 发送端:在CAN_H和CAN_L上施加相反的电压变化
  • 接收端:只关心两根线之间的电压差
  • 干扰信号:同时作用在两根线上,差分电压不变

你想想看,外界电磁干扰来了,两根线上同时被叠加了相同的噪声。但接收器只认差值,所以噪声就被抵消了。这就是CAN总线能在发动机舱这种强干扰环境下稳定工作的原因。

我的经验:在实际布线时,CAN_H和CAN_L一定要紧挨着走,最好用双绞线。绞距越密,抗共模干扰能力越强。我曾经见过一个项目,因为CAN线分开走了10厘米,结果通信误码率直接翻倍。

1.4 CAN总线拓扑结构——怎么连才靠谱?

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

咱们先看一张结构图,我手绘的:

120Ω 120Ω ECU1 ECU2 ECU3 ECU4 CAN_H CAN_L CAN总线拓扑结构(直线型)

这种直线型拓扑有几个关键要求:

  • 终端电阻:主干线两端各接一个120Ω电阻。作用是消除信号反射。我见过有人偷懒不接,结果高速通信时波形振铃严重,数据全乱套了。
  • 支线长度:一般不超过30cm。支线越长,信号反射越严重。高速CAN(1Mbps)对支线长度尤其敏感。
  • 节点数量:标准CAN最多支持110个节点,但实际项目中超过30个就要小心了。总线负载太重,实时性会下降。

避坑指南:我曾经在一个项目中,为了布线方便把CAN总线接成了星型拓扑。结果通信时好时坏,查了两天才发现是信号反射造成的。记住:CAN总线只支持直线型拓扑,不要试图搞花活。

1.5 总结一下

CAN总线的基础知识,说白了就是三件事:

  1. 起源:为了解决汽车线束过多的问题,博世在1986年推出了CAN协议
  2. 物理层:用两根差分信号线,通过电压差来传输数据,天生抗干扰
  3. 拓扑:直线型结构,两端必须接120Ω终端电阻

这些基础概念,是后面用Wireshark抓包分析的前提。你只有理解了CAN总线是怎么工作的,才能看懂抓到的数据帧到底在说什么。

嗯,今天就先聊到这儿。下一章咱们开始讲CAN的数据帧结构,到时候我会拿实际抓包的数据来演示,保证让你一看就明白。


专注资料整理