CAN 总线是一种基于“差分信号”和“多主竞争”的串行通信协议,具备极强的抗干扰能力和完善的错误处理机制,广泛应用于汽车电子、工业控制、医疗设备等对可靠性要求极高的场景。
高速can总线结构
can收发器:
负责把MCU输出的逻辑电平转换成总线上的差分信号,同时把总线上的差分信号转换成MCU能识别的逻辑电平。简单说,MCU内部只是逻辑(0/1),CAN收发器负责把逻辑“翻译”成物理信号(差分电压)。
物理总线:双绞线
为了抗干扰,CANH 和 CANL 这两根物理导线,在出厂时就被紧紧地像麻花一样扭在一起。外部电磁干扰会同时作用在两根线上,双绞能保证两根线受到的干扰“几乎一模一样”,这样接收器做减法时,干扰才能被完美抵消。
“共模干扰抑制”:因为双绞线靠得极近(紧紧扭在一起),所以外部电磁干扰会在两根线上产生完全相同的电压(共模信号)。接收器只提取两根线的差值,干扰就被完美地“相减消除”了
CAN 总线采用双绞线差分传输。根据 ISO 11898 标准,电平定义如下:
显性电平(Dominant):对应逻辑“0”。此时总线驱动器主动施加电流,CANH 与 CANL 之间形成约 2V 的差分电压。
隐性电平(Recessive):对应逻辑“1”。此时总线驱动器被释放(高阻态),CANH 与 CANL 之间无差分电压(0V),依靠终端电阻维持共模电平。
关键物理属性:显性电平在电气上具备主动驱动的能力,能够强制覆盖隐性电平。只要总线上任意节点输出显性“0”,该总线物理状态就必然呈现显性“0”,这种特性被称为“线与(Wired-AND)”机制。
普通串口下,两个节点同时发数据,一个发 1,一个发 0,总线上会发生“电气对拉(短路)”现象(一个芯片内部电源正极强行对地短路)。这会导致信号直接失真,严重时会导致发送器的 I/O 口烧毁,或者触发保护机制。
而在can总线下,当两个节点在同一时刻争抢 CAN 总线时,它们会经历一场毫秒级的“非破坏性逐位仲裁”。首先,双方同时发送显性电平的起始帧,随后在各自的 11 位标识符(ID)上开始“掰手腕”:由于 0 是显性、能强制覆盖隐性的 1,且每个节点都具备“边发边听”的硬件机制,发送隐性位(1)的节点若在回读时检测到总线为显性(0),便会立刻判定自己仲裁失败,并在不丢失任何数据的前提下自动退让,转为监听等待;而发送显性位(0)的节点则胜出,毫无中断地继续发送完剩余的数据帧。输掉的节点不会重传或崩溃,它只会在总线再次空闲后自动排队重试。
整个网络在电气上构成了一个从发送端到接收端无反射的完整回路。而两端的120Ω 电阻,就是防止信号跑到终点撞墙反弹的“吸收堵头”,它同时为总线空闲提供了稳定的基准电压,是 CAN 总线能够高速、长距离稳定通信的物理地基
左端接 5V/3.3V,右端接地,两个 120Ω 电阻串联,电流流过它们时,会在中间产生一个稳定的2.5V分压。这就给总线提供了一个“不说话的基准电压”。当某个节点要强行发送“0”(显性)时,它必须把 CANH 拉到 3.5V,把 CANL 拉低到 1.5V,形成 2V 压差。
数据类型
数据帧
帧起始(SOF):固定的 1 位显性(0)。告诉总线:“我要发数据了!”
仲裁场(ID):11 位(标准帧)或 29 位(扩展帧)。这是决定优先级的字段。即我们之前讲的“掰手腕”。
控制场(DLC):4 位。告诉总线:“我后面要发几个字节的数据?”(注意:CAN 数据场最长只有 8 个字节)。
数据场(Data Field):0~8 个字节(64 位)。这是真正的载荷,您可以把自己定义的数据塞进去。
CRC 校验场:15 位。计算前面的数据,防止传输中受干扰出错。
ACK 场:2 位。接收方如果收到正确的数据,会自动回一个“收到”的信号。
帧结束(EOF):7 位隐性(1)。宣告这次通信结束。
设备树
内核裁剪