1. 课程导入

大家好,我是你们这趟CAN通信之旅的向导。咱们今天聊的,是整个课程的地基——CAN总线基础。别小看这第一章,我见过不少老手,在差分信号和总线电平上栽过跟头。咱们一步步来,把底子打扎实。

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

上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制、仪表盘……每个模块都靠一堆独立的线连来连去。你想想看,一辆车光线束就有几十公斤重,又贵又容易出故障。

当时德国博世(Bosch)的工程师们坐不住了。他们想要一种总线——只用两根线,就能让所有电子控制单元(ECU)互相通信。于是,1986年,CAN(Controller Area Network)协议诞生了。

核心目标就三个:

  • 可靠性高——抗干扰,能检测错误
  • 实时性好——优先级高的消息不耽误
  • 成本低——两根线搞定一切

我个人习惯把CAN比作一个“会议室”:谁想发言都可以,但只有优先级最高的人能拿到话筒。这就是CAN的“多主从”架构——没有老大,谁都能抢总线。

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

CAN总线物理层,说白了就是一对双绞线:CAN_H(高线)和CAN_L(低线)。为什么用两根?因为要传差分信号。这个咱们后面细说。

先看几个关键参数:

参数 典型值 说明
总线电平 显性:CAN_H≈3.5V,CAN_L≈1.5V
隐性:CAN_H≈2.5V,CAN_L≈2.5V
显性位覆盖隐性位
最大速率 1 Mbps(40米以内) 距离越长,速率越低
最大节点数 理论110个(实际建议≤32) 受驱动能力限制
终端电阻 120Ω(两端各一个) 消除信号反射
总线长度 1 Mbps时≤40m
125 kbps时≤500m
速率与距离成反比

避坑指南:我曾经在一个项目中,终端电阻只加了一端,结果总线信号反射得一塌糊涂,通信时好时坏。查了两天才找到原因。记住:终端电阻必须加在总线两端,且阻值要精确到120Ω。

1.3 差分信号:抗干扰的秘密武器

为什么CAN要用差分信号?因为汽车里电磁干扰太严重了。点火线圈、电机、继电器……到处都是噪声源。

差分信号的工作原理很简单:

  • 发送端:在CAN_H和CAN_L上输出一对相反的电压
  • 接收端:计算CAN_H - CAN_L的差值

举个例子:

  • 显性位(逻辑0):CAN_H=3.5V,CAN_L=1.5V,差值=2.0V
  • 隐性位(逻辑1):CAN_H=2.5V,CAN_L=2.5V,差值=0V

如果外界有个强电磁干扰,同时作用在两根线上,比如都增加了1V:

  • 显性位变成:CAN_H=4.5V,CAN_L=2.5V,差值还是2.0V
  • 接收端完全不受影响!

这就是差分信号的魅力——共模抑制。干扰是“共模”的,信号是“差模”的,一减就没了。

注意:双绞线不是随便绞的。每英寸绞合次数有讲究,绞得越密,抗干扰越好。我见过有人用普通平行线代替双绞线,结果通信距离直接缩水一半。别省这点成本。

1.4 总线电平与位仲裁

CAN总线有两种电平状态:

  • 隐性(Recessive):CAN_H=CAN_L=2.5V,差值为0V。代表逻辑1。
  • 显性(Dominant):CAN_H=3.5V,CAN_L=1.5V,差值为2.0V。代表逻辑0。

关键规则:显性位会覆盖隐性位。也就是说,只要有一个节点发送显性位,总线就是显性的。

这个特性被用来做位仲裁——当多个节点同时发送时,谁先发显性位,谁就赢。仲裁场里的ID越小,优先级越高。

举个例子:

  • 节点A发送ID=0x123(二进制:0001 0010 0011)
  • 节点B发送ID=0x456(二进制:0100 0101 0110)
  • 从最高位开始比,A的第一位是0(显性),B的第一位是1(隐性)
  • A赢了,B自动退出发送,转为接收

整个过程在几个微秒内完成,不浪费任何带宽。

我建议你在设计系统时,把最紧急的消息(比如刹车、气囊)分配最小的ID。这样它们永远能抢到总线。这是CAN协议最优雅的设计之一。

1.5 知识体系总览

下面这张图,把本章的核心知识点串起来了。你可以把它当作一个“地图”,后面每章都会在这个地图上添加新的内容。

CAN总线基础 - 知识体系 CAN总线基础 协议起源 物理层特性 差分信号 总线电平与仲裁 博世1986年提出 多主从架构 CAN_H / CAN_L 双绞线 + 120Ω终端 共模抑制 抗电磁干扰 显性(0) vs 隐性(1) 位仲裁:ID越小优先级越高 本章核心:理解CAN为什么用两根线,以及这两根线如何工作

1.6 本章小结

咱们这一章,把CAN总线的根扎下去了:

  • 起源:博世为了解决汽车线束过多的问题,1986年推出CAN协议
  • 物理层:一对双绞线,CAN_H和CAN_L,两端各加120Ω终端电阻
  • 差分信号:通过计算两根线的电压差来传输数据,天然抗共模干扰
  • 总线电平:显性(0)覆盖隐性(1),利用这个特性实现无冲突的位仲裁

嗯,到这里,CAN总线的“骨架”你已经有了。下一章咱们会深入CAN的数据帧结构,看看消息到底是怎么打包发送的。不过那是后话,先把今天的内容消化掉。

课后小练习:找一块CAN分析仪(比如PCAN或Kvaser),接上两个节点,用示波器看看CAN_H和CAN_L的波形。亲眼看到显性和隐性电平的变化,比看一百遍书都管用。我当年就是这么入门的。