1、CAN网络基础:CAN协议起源、CAN总线物理层特性、CAN2.0A/B标准帧与扩展帧区别

1.1 CAN协议的起源——从一根线说起

说起CAN总线,我得先聊聊它的出身。上世纪80年代,汽车里的电子设备越来越多,线束越来越重,故障率也越来越高。我记得那时候修一辆豪华车,光拆线束就得半天。德国博世公司看不下去了,于是在1986年推出了CAN协议——Controller Area Network。

说白了,CAN的初衷就一个:用两根线代替几十根线。你想想看,以前每个传感器都要单独拉线到ECU,现在大家挂到同一根总线上,谁有话就说,谁想听就听。这个思路在当时非常超前。

我个人习惯把CAN比作一个会议室。任何节点都可以发言,但得遵守规则——谁优先级高谁先说。这个机制,就是后面要讲的仲裁。

1.2 CAN总线物理层特性——两根线的大学问

CAN总线物理层,说白了就是那两根线:CAN_H和CAN_L。但别小看这两根线,里面的门道不少。

核心特性:差分信号传输

CAN总线用的是差分电压。什么意思?就是信号不是对地测量的,而是看两根线之间的电压差。

  • 显性电平(逻辑0):CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,压差约2V
  • 隐性电平(逻辑1):CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,压差约0V

我在项目中遇到过一件事:有个同事把CAN_H和CAN_L接反了,结果整个网络都不通。查了半天才发现,原来是线序搞反了。嗯,这里要注意——CAN总线必须双绞线,而且终端电阻一定要加。标准是120Ω,位置在总线两端。

避坑指南

我曾经在一个项目里发现,终端电阻只加了一端,结果总线信号反射严重,通讯时好时坏。后来用示波器一看,波形都变形了。所以记住:终端电阻必须加在两端,不能省。

CAN总线的速率和距离是成反比的。速率越高,距离越短。常见的速率有:

速率 最大距离 典型应用
1 Mbps 40 m 动力系统、底盘
500 kbps 100 m 车身控制
250 kbps 250 m 诊断、信息娱乐
125 kbps 500 m 工业控制

为什么会这样?因为信号在线上传输需要时间,速率高了,位时间就短,如果总线太长,信号还没传到另一端,下一个位就来了,冲突就产生了。

1.3 CAN2.0A/B标准帧与扩展帧区别——11位 vs 29位

CAN协议有两个版本:CAN2.0A和CAN2.0B。它们的核心区别就在ID长度上。

标准帧(CAN2.0A):11位标识符

扩展帧(CAN2.0B):29位标识符

你想想看,11位能表示多少个ID?2^11 = 2048个。对于早期的汽车来说,够用了。但现在一辆车上有几十个ECU,每个ECU又发好几条消息,2048个ID就不太够了。所以扩展帧就来了,29位ID,2^29 = 5亿多个,基本用不完。

我个人习惯这样区分:看帧格式的第1个bit。如果是IDE位(Identifier Extension bit),IDE=0表示标准帧,IDE=1表示扩展帧。这个位在仲裁场里,紧跟在RTR位后面。

下面我画个简单的帧结构对比:

标准帧(11位ID):
| SOF | 11位ID | RTR | IDE | r0 | DLC | 数据场 | CRC | ACK | EOF |

扩展帧(29位ID):
| SOF | 11位ID | SRR | IDE | 18位ID | RTR | r1 | r0 | DLC | 数据场 | CRC | ACK | EOF |

注意看,扩展帧比标准帧多了SRR位和18位扩展ID。SRR位(Substitute Remote Request)是用来替代标准帧的RTR位的。在仲裁时,如果标准帧和扩展帧同时发送,标准帧的优先级更高——因为标准帧的IDE位在扩展帧的SRR位之前出现,而IDE位是显性(0),SRR位是隐性(1)。

重要提醒

在实际项目中,标准帧和扩展帧可以共存于同一总线上,但我不建议混用。为什么呢?因为仲裁机制会导致标准帧总是优先于扩展帧,如果扩展帧的节点优先级很高,反而会被标准帧抢了先。我曾经在一个项目中看到,混用后某个扩展帧的节点老是发不出数据,查了半天才发现是ID冲突导致的。

1.4 实际项目中的选择建议

说了这么多,到底该用标准帧还是扩展帧?我个人的建议是:

  • 如果项目是全新的:直接用扩展帧。29位ID足够用,而且兼容性好。
  • 如果是老平台升级:保持原有帧格式。改帧格式意味着所有节点都要改,工作量太大。
  • 如果总线负载不高:标准帧就够了。标准帧的帧头短,总线利用率更高。

我记得有一次,一个供应商坚持要用标准帧,结果项目后期发现ID不够用了,只能重新规划ID分配,折腾了好几个星期。所以前期规划很重要,别省那点功夫。

小技巧

在CANoe或PCAN中查看报文时,注意看IDE位。如果IDE=1,那就是扩展帧。另外,扩展帧的ID在显示时通常带"x"前缀,比如0x18DAF101,而标准帧直接显示十进制或十六进制数。

好了,这一章就讲到这里。CAN协议看起来简单,但里面的细节不少。下一章我们聊聊CAN的报文类型和仲裁机制,那才是真正有意思的地方。