2、CAN总线基础概念:拓扑结构、节点组成、电平逻辑与终端电阻

好,咱们正式开始啃CAN总线的基础概念。这一节内容很关键,说白了就是CAN总线的“骨架”和“血液”。你把这些搞懂了,后面看协议、调bug才会心里有底。我个人习惯,讲基础概念时喜欢从“长什么样”开始,再到“怎么工作”。咱们就按这个路子来。

2.1 CAN总线拓扑结构:一条线上的蚂蚱

CAN总线最典型的拓扑结构,就是总线型。你想象一下,一根主干线,上面挂了好多节点,像晾衣绳上挂衣服一样。所有节点都并联在这根双绞线上。

为什么会这样设计?其实很简单。CAN总线最初是为汽车设计的,汽车里线束多、空间小。如果搞成星型或者环型,布线会非常痛苦。总线型结构,线最少,成本最低。

核心要点:

  • 所有节点共享同一对通信线(CAN_H和CAN_L)
  • 节点之间是“多主”关系,谁都可以发起通信
  • 总线两端必须各接一个120Ω终端电阻

我在项目中遇到过一种情况:有人为了布线方便,把CAN总线接成了“T型”分支。结果通信时好时坏,查了一整天。嗯,这里要注意——CAN总线不允许有长分支。分支长度超过0.3米,信号反射就会变得很严重。你想想看,高速信号在分支处反射回来,跟原始信号叠加,数据不就乱了吗?

所以,正规做法是:所有节点都直接挂在主干线上,或者用非常短的“stub”连接。主干线长度,根据速率不同有严格限制。比如125kbps时,最长可以到500米;但到了1Mbps,最好别超过40米。

2.2 CAN总线节点组成:一个节点里有什么?

一个典型的CAN节点,拆开来看,主要由三部分构成:

  • 微控制器(MCU):负责处理数据、运行应用逻辑。它不直接跟总线打交道。
  • CAN控制器:负责协议层的处理,比如帧的封装、仲裁、错误检测。它把MCU要发的数据变成CAN协议格式。
  • CAN收发器:负责物理层的信号转换。它把控制器输出的逻辑电平,转换成总线上的差分电平。

我刚开始学的时候,总搞不清控制器和收发器的区别。后来自己画了一块板子,才彻底明白:控制器是“大脑”,收发器是“嘴巴和耳朵”。大脑想说话,嘴巴去喊;耳朵听到声音,传给大脑去理解。

现在很多芯片把控制器和收发器集成在一起了,比如TJA1050、SN65HVD230这些。但原理是一样的。你选型时要注意:收发器的工作电压是5V还是3.3V? 这个搞错了,芯片会烧。我曾经就因为这个,一口气烧了三片,心疼啊。

2.3 CAN总线电平与逻辑:隐性位和显性位

CAN总线用的是差分信号。两根线:CAN_H和CAN_L。它们之间的电压差,决定了总线状态。

这里有个关键概念:隐性位(Recessive)显性位(Dominant)

总线状态 CAN_H电压 CAN_L电压 差分电压(CAN_H - CAN_L) 逻辑值
隐性(Recessive) 2.5V 2.5V 0V 逻辑1
显性(Dominant) 3.5V 1.5V 2V 逻辑0

说白了,隐性位就是“没人说话”的状态,显性位就是“有人抢着说话”的状态。而且显性位可以覆盖隐性位。这就是CAN总线仲裁的基础——谁先发显性位,谁就赢得总线。

你想想看,如果两个节点同时发数据,一个发隐性位(1),一个发显性位(0)。总线上的电平会被拉成显性位(0)。发隐性位的节点检测到总线跟自己想发的不一致,就知道自己输了,乖乖退出发送。这就是CAN的“非破坏性逐位仲裁”。

避坑指南: 我曾经在调试时,发现总线一直处于显性状态,所有节点都发不了数据。查了半天,原来是某个节点的收发器坏了,一直把CAN_H拉到3.5V。这就是所谓的“总线锁死”。所以,设计时一定要考虑收发器的故障保护功能。

2.4 CAN总线终端电阻:为什么必须是120Ω?

终端电阻,是CAN总线里最容易忽略但又最关键的东西。没有它,总线根本没法正常工作。

为什么需要终端电阻?两个原因:

  1. 消除信号反射:高速信号在总线末端如果遇到阻抗突变,会反射回来,干扰正常信号。终端电阻的作用就是“吸收”这些反射波。
  2. 提供隐性电平:当所有节点都不发送时,总线需要回到2.5V的隐性电平。终端电阻和收发器的内部电路配合,正好能维持这个电平。

那为什么偏偏是120Ω?

因为CAN总线的双绞线,其特征阻抗大约是120Ω。根据传输线理论,终端电阻等于特征阻抗时,反射最小。所以,标准规定:总线两端各接一个120Ω电阻。两个并联起来,就是60Ω。这就是你测量CAN_H和CAN_L之间的电阻时,正常值应该是60Ω的原因。

重要提醒:

  • 终端电阻必须接在总线的最两端,不是随便哪个节点上。
  • 如果总线上的节点少于两个,或者终端电阻没接好,通信会非常不稳定。
  • 有些节点内部已经集成了120Ω电阻(比如某些开发板),这时候外部就不用再加了。但要注意,如果多个节点都接了内部电阻,并联后的阻值会小于60Ω,信号质量会变差。

我记得有一次,客户反映说他们的设备在车上通信偶尔会丢帧。我让他们用万用表量了一下CAN_H和CAN_L之间的电阻——只有30Ω。原来他们用了三个带内部终端电阻的节点,相当于三个120Ω并联。去掉两个节点的内部电阻后,问题就解决了。

嗯,基础概念就讲到这里。这些是CAN总线的“地基”,地基不稳,后面盖什么楼都会塌。下一节,咱们开始讲CAN的帧格式,那才是真正有意思的东西。