第2章:CAN总线基础回顾:CAN 2.0与CAN FD帧结构、位时序与仲裁机制、CAN网络物理层要点

好,咱们开始第二讲。在做FlexRay和CAN的网关之前,我觉得有必要把CAN总线再好好捋一遍。你可能会说:“CAN我熟啊,天天用。” 但说实话,很多工程师对CAN的理解停留在“能用就行”的层面。一旦涉及到网关路由、时序转换、帧格式适配,那些细节就全冒出来了。

我个人习惯是,不管做多复杂的系统,先把基础协议吃透。今天我们就从帧结构、仲裁机制、物理层三个角度,把CAN 2.0和CAN FD的核心差异讲清楚。

2.1 CAN 2.0帧结构:标准帧与扩展帧

CAN 2.0分两种:标准帧(11位ID)和扩展帧(29位ID)。嗯,这里要注意,它们不是简单的ID长度不同,帧格式也有差异。

先看标准帧的结构:

SOF | 11位ID | RTR | IDE | r0 | DLC | Data[0-8] | CRC | ACK | EOF

扩展帧长这样:

SOF | 11位ID | SRR | IDE | 18位扩展ID | RTR | r1 | r0 | DLC | Data[0-8] | CRC | ACK | EOF

关键区别在哪?我列个表给你看:

字段 标准帧 扩展帧
ID长度 11位 29位
IDE位 0(显性) 1(隐性)
RTR位 远程帧标识 远程帧标识
数据长度 0-8字节 0-8字节
CRC 15位 + 1位分隔符 15位 + 1位分隔符

我在项目中遇到过一个问题:两个ECU用不同帧格式发同一个信号,结果网关死活转不过去。查了半天,原来是IDE位没处理好。你想想看,IDE位在标准帧里是显性,在扩展帧里是隐性,仲裁时这个位直接决定了优先级。

重要提醒:标准帧和扩展帧的ID空间是独立的。11位ID的0x7FF和29位ID的0x000007FF不是同一个东西。网关做路由时,必须明确区分。

2.2 CAN FD帧结构:不一样在哪?

CAN FD,全称CAN with Flexible Data-Rate。说白了,就是给CAN 2.0打了两个补丁:

  • 数据场变长了:从8字节扩展到最多64字节
  • 速率可变:数据段可以跑更高的波特率

CAN FD的帧结构长这样:

SOF | 11/29位ID | SRR | IDE | FDF | BRS | ESI | DLC | Data[0-64] | CRC | ACK | EOF

注意看,多了三个新字段:

  • FDF位:CAN FD格式标识。为1表示这是CAN FD帧,为0表示传统CAN帧
  • BRS位:波特率切换标志。为1时,数据段切换到高速模式
  • ESI位:错误状态指示。发送节点处于被动错误状态时置1

我建议你记住一个关键点:CAN FD和CAN 2.0在仲裁段是兼容的。什么意思?就是它们可以在同一条总线上共存,仲裁机制完全一样。但数据段就不一样了,CAN FD的数据段可以跑8Mbps甚至更高。

实战技巧:做网关设计时,如果CAN FD节点和CAN 2.0节点需要通信,网关必须做“速率适配”和“帧格式转换”。我曾经在一个项目中,直接把CAN FD的64字节数据塞给CAN 2.0节点,结果对方直接报错。后来我加了一个分段重组逻辑,才把问题解决。

2.3 位时序与仲裁机制

仲裁机制,这是CAN总线的灵魂。为什么CAN能实现无损仲裁?因为它用了“线与”逻辑。

简单说:显性位(0)会覆盖隐性位(1)。多个节点同时发送时,谁先发隐性位谁就退出。仲裁的粒度是位,不是帧。

位时序这块,我直接给你画个图:

一个位时间 = 同步段 + 传播段 + 相位缓冲段1 + 相位缓冲段2

同步段:1个Tq,用于同步
传播段:1-8个Tq,补偿物理延迟
相位缓冲段1:1-8个Tq,采样点前调整
相位缓冲段2:1-8个Tq,采样点后调整

采样点位置很关键。我一般建议采样点设在85%左右。为什么?因为总线上的信号有传播延迟,采样点太靠前容易采到不稳定信号,太靠后又可能错过位边沿。

仲裁过程是这样的:

  1. 所有节点同时发送SOF位(显性),同步开始
  2. 从ID的最高位开始,逐位比较
  3. 如果某个节点发送了隐性位,但总线上是显性位,它就退出仲裁
  4. 胜出的节点继续发送剩余帧内容

避坑指南:我曾经遇到过一个诡异的问题:两个节点ID不同,但总是同时发送成功,没有节点退出。查到最后发现,是位时序配置不一致,导致采样点偏移,一个节点在采样时把隐性位误判成了显性位。嗯,从那以后,我每次做系统集成,第一件事就是核对所有节点的位时序参数。

2.4 CAN网络物理层要点

物理层,说白了就是信号怎么在线上跑。CAN物理层用的是差分信号,两条线:CAN_H和CAN_L。

关键参数:

  • 显性电平:CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,差分电压约2V
  • 隐性电平:CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,差分电压约0V
  • 终端电阻:每条总线两端各一个120Ω电阻

拓扑结构上,我建议用直线型总线,不要用星型或树型。为什么?因为分支会产生信号反射,影响通信质量。如果实在避免不了分支,分支长度不要超过0.3米。

波特率和总线长度的关系:

波特率 最大总线长度
1 Mbps 约40米
500 kbps 约100米
250 kbps 约250米
125 kbps 约500米

这个表不是绝对的,跟线缆质量、节点数量、环境噪声都有关系。我一般会留20%的余量。

物理层设计三原则:

  • 终端电阻必须加,不加等于没匹配
  • CAN_H和CAN_L要双绞,减少共模干扰
  • 地线要可靠,CAN收发器对地电位很敏感

好了,CAN的基础就回顾到这里。下一讲我们开始聊FlexRay,那家伙比CAN复杂多了,但功能也更强大。到时候你会明白,为什么网关设计里,FlexRay和CAN的转换是最头疼的部分。

个人经验:我建议你手边常备一个CAN分析仪,没事抓抓波形看看。理论学得再好,不如亲眼看看显性位和隐性位在示波器上长什么样。我记得我第一次看到CAN总线上的“显性覆盖隐性”现象时,才真正理解了什么叫无损仲裁。