1. CAN网络基础:CAN总线起源、物理层特性、差分信号原理、CAN总线拓扑结构

各位同学,咱们今天聊聊CAN总线的基础。说实话,我做了十几年嵌入式,接触过的总线协议少说也有七八种,但CAN总线一直是我最放心的一个。为什么?因为它皮实、抗干扰、还自带检错机制。你想想看,在汽车这种电磁环境极其恶劣的地方,它都能稳定工作几十年,这本身就说明了很多问题。

1.1 CAN总线的起源

CAN总线,全称是Controller Area Network,控制器局域网。它诞生于1986年,由德国博世公司(Bosch)开发。当时汽车电子化刚刚起步,各种ECU(电子控制单元)越来越多,线束越来越复杂。我记得有资料说,当时一辆高端车的线束总长度已经超过2公里,重量能达到几十公斤。这显然不是长久之计。

博世的工程师们就想:能不能用两根线,把所有的ECU都串起来?于是CAN总线就诞生了。1991年,Bosch发布了CAN 2.0规范,分为A和B两个部分。后来ISO组织把它标准化为ISO 11898。嗯,这里要注意,我们现在用的绝大多数都是CAN 2.0B,它支持29位标识符,也就是扩展帧。

核心要点:CAN总线最初是为了解决汽车内部点对点连线过多的问题。它的设计目标很明确——高可靠性、实时性、低成本。

1.2 物理层特性

CAN总线的物理层,说白了就是信号怎么在线上跑。我刚开始学的时候,觉得物理层没什么好讲的,不就是两根线吗?后来在项目中吃过亏,才发现物理层的细节决定了整个系统的成败。

CAN总线使用两条线:CAN_H(高电平线)和CAN_L(低电平线)。这两条线是双绞线,绞在一起可以有效抑制共模干扰。标准CAN(ISO 11898-2)的电气特性如下:

参数 数值 说明
总线电压(显性) CAN_H ≈ 3.5V,CAN_L ≈ 1.5V 差分电压约2V
总线电压(隐性) CAN_H ≈ 2.5V,CAN_L ≈ 2.5V 差分电压约0V
最大传输速率 1 Mbps(40米以内) 距离越长,速率越低
最大节点数 理论110个,实际建议30-50个 取决于收发器驱动能力
终端电阻 120Ω(两端各一个) 用于阻抗匹配,抑制信号反射

避坑指南:我曾经在一个项目中,终端电阻只加了一端,结果总线在长距离传输时出现大量错误帧。排查了两天才发现是终端电阻的问题。记住,CAN总线两端必须各加一个120Ω电阻,不能多也不能少。

1.3 差分信号原理

为什么CAN总线要用差分信号?这个问题我问过很多刚入行的工程师。其实答案很简单——抗干扰。

你想想看,如果只用一根线传输信号,比如0V代表0,5V代表1。那么当外界有电磁干扰时,线上的电压可能会被拉高或拉低,接收端就可能误判。但差分信号就不一样了,它用两根线的电压差来表示逻辑状态。

具体来说:

  • 显性状态(Dominant):CAN_H比CAN_L高2V左右,代表逻辑0
  • 隐性状态(Recessive):CAN_H和CAN_L电压相等(约2.5V),代表逻辑1

为什么叫「显性」和「隐性」?因为当多个节点同时发送时,显性状态会覆盖隐性状态。这其实就是CAN总线仲裁机制的基础。我个人习惯把显性理解为「强势」,隐性理解为「谦让」——谁先拉低总线,谁就赢得了仲裁。

差分信号的好处很明显:

  1. 共模干扰被抵消——外界干扰同时作用在两根线上,差分电压不变
  2. 电磁辐射小——两根线的电流方向相反,磁场相互抵消
  3. 共模电压范围宽——允许地电位有偏差,这在汽车上很常见

个人经验:我在做门控系统时,遇到过CAN总线在电机启动瞬间出现大量错误。后来发现是地线太细,导致共模电压超出收发器承受范围。解决办法很简单——加粗地线,并在CAN收发器附近加共模扼流圈。嗯,这些小细节,书本上不会告诉你。

1.4 CAN总线拓扑结构

CAN总线最常用的拓扑结构是总线型,也就是一条主干线,所有节点都挂在这条线上。就像一根晾衣绳,上面挂满了衣服。每个节点通过一个短的支线(stub)连接到主干线。

拓扑结构的关键参数:

  • 主干线长度:取决于通信速率,1Mbps时不超过40米
  • 支线长度:建议不超过0.3米,最长不超过1米
  • 节点间距:没有严格限制,但建议均匀分布

为什么支线不能太长?因为支线会产生信号反射。如果支线太长,反射信号会在主干线上叠加,导致通信错误。我曾经在一个项目中,为了布线方便,把支线拉到了2米多,结果总线完全无法通信。后来把支线剪短到0.3米,问题立刻解决。

除了总线型,还有星型、环型等拓扑,但在CAN总线中很少用。我个人不建议用星型,因为中心节点的故障会导致整个网络瘫痪。环型虽然可靠性高,但实现复杂,成本也高。

设计建议:门控系统中,CAN总线建议采用总线型拓扑。主干线使用双绞屏蔽线,屏蔽层单端接地。每个门控节点通过一个短支线接入主干线,支线长度控制在0.3米以内。如果节点间距较大,可以考虑使用CAN中继器或CAN网桥。

好了,这一章的内容就到这里。CAN总线的基础知识,说白了就是这些——起源、物理层、差分信号、拓扑结构。下一章我们会深入讨论CAN总线的数据链路层,包括帧格式、仲裁机制、错误处理等。这些才是真正让你能上手做项目的核心内容。

记住我的一句话:做CAN总线设计,物理层是地基,地基不牢,上面再漂亮的代码也是白搭。