3、CAN总线高级特性:CAN FD协议、CAN XL协议、CAN网络管理与诊断

CAN总线发展到今天,已经远不止我们传统认知中的2.0版本了。我个人习惯把CAN FD和CAN XL看作是「老树开新花」——底层物理层还是差分双绞线,但上层协议和速率已经脱胎换骨。这一节,我们重点聊聊这三个高级话题。

3.1 CAN FD:灵活数据速率

CAN FD(Flexible Data Rate)是2012年由Bosch推出的扩展协议。说白了,它解决了传统CAN的两个痛点:带宽不够和数据场太小。

对比项 传统CAN 2.0 CAN FD
最大数据场 8字节 64字节
标称位速率 最高1 Mbps 最高1 Mbps(仲裁段)
数据段位速率 同标称速率 最高8 Mbps(实际常用2~5 Mbps)
CRC校验 15位 17位(数据场≤16字节)/ 21位(数据场>16字节)
兼容性 — 与CAN 2.0兼容(同物理层)

我在项目中遇到过最典型的场景:某OEM要求OTA升级包通过CAN总线刷写,传统CAN每帧只能带8字节,一个几百KB的固件要拆成几万帧,效率低得让人抓狂。换成CAN FD后,每帧64字节,帧数直接降到原来的1/8,刷写时间从40分钟缩短到6分钟。嗯,这就是FD的价值。

核心机制:CAN FD在仲裁阶段使用标准位速率(保证总线仲裁的可靠性),进入数据场后切换到高速率。这个切换由FDF(FD Format)标志位控制,接收节点通过BRS(Bit Rate Switch)位感知速率变化。

3.1.1 位定时与采样点

CAN FD的位定时比传统CAN更敏感。为什么?因为数据段速率高了,采样点的位置偏差容忍度就小了。我建议你在设计时重点关注两个参数:

  • 采样点位置:推荐设置在75%~85%之间。速率越高,采样点越靠后。
  • SJW(同步跳转宽度):CAN FD的SJW通常设为1~2个Tq,太大容易导致同步错误。

我的经验:如果你在CAN FD网络中遇到偶发性错误帧,先别急着怀疑硬件。检查一下网络中所有节点的采样点是否一致。我曾经排查过一个项目,两个ECU的采样点差了3%,结果在2 Mbps数据段下频繁出现位填充错误。把采样点对齐后,问题消失。

3.2 CAN XL:迈向千兆级车载通信

CAN XL是CAN家族的最新成员,2018年由CiA(CAN in Automation)组织启动标准化。说实话,我第一次看到CAN XL的规格时,觉得这已经不像CAN了——它更像一个轻量级的以太网替代方案。

为什么这么说?你看看它的关键参数:

  • 数据场:最大2048字节(2 KB)
  • 数据段速率:最高10+ Mbps(实际可达20 Mbps)
  • 帧格式:引入了类似以太网的SDT(Service Data Type)字段
  • 兼容性:向下兼容CAN FD和CAN 2.0

注意:CAN XL虽然兼容CAN FD,但物理层需要升级。传统CAN收发器无法支持10 Mbps以上的速率。如果你计划引入CAN XL,必须更换支持SIC(Signal Improvement Capability)或CAN XL专用的收发器。

我个人觉得,CAN XL最适合的场景是域控制器之间的高速数据交换。比如自动驾驶域控需要把原始雷达数据传给中央计算平台,传统CAN FD的64字节帧要拆成几十帧,延迟和CPU开销都很大。CAN XL一帧就能搞定,而且协议开销比以太网小得多。

3.2.1 CAN XL帧结构

CAN XL的帧结构比CAN FD复杂不少。我画了一张图帮你理解:

CAN XL 帧结构示意图 SOF 仲裁场 29位ID 控制场 SDT+DL 数据场 0~2048字节 校验场 CRC+ECC ACK 2位 EOF IFS 1位 32位 16位 可变 32位 2位 7位 3位 说明: CAN XL 在控制场中引入了 SDT(服务数据类型)字段,用于标识上层协议类型(如原始数据、分段数据、安全数据等)。 速率切换示意 仲裁段 1 Mbps 数据段 10+ Mbps 校验段 1 Mbps 应答段 1 Mbps

3.3 CAN网络管理

车载网络管理(NM,Network Management)是CAN协议栈中容易被忽视但极其重要的部分。你想想看,一辆车上有几十个ECU,不可能让它们一直全功率运行吧?网络管理就是负责协调各个节点的睡眠和唤醒。

目前主流的CAN网络管理协议有两种:

  • OSEK NM:基于令牌环机制,节点之间通过NM报文传递网络状态。每个节点在收到令牌后,决定是否让网络进入睡眠模式。
  • AUTOSAR NM:基于分布式投票机制,每个节点独立发送NM报文,通过「主动唤醒」和「被动同步」实现网络状态管理。

关键概念:NM报文是周期性发送的,通常周期为100ms~1000ms。节点通过检测NM报文的超时来判断其他节点是否「活着」。如果所有节点都同意睡眠,网络进入Bus-Sleep模式。

3.3.1 网络状态机

我建议你把CAN网络管理理解成一个三状态机:

  1. Bus-Sleep模式:网络处于低功耗状态,所有节点停止通信。只有检测到唤醒事件(如KL15上电、CAN总线活动)才会退出。
  2. Bus-Active模式:网络正常运行,节点发送应用报文和NM报文。这是ECU正常工作的状态。
  3. Bus-Pre-Sleep模式:过渡状态。节点在准备进入睡眠前,会发送「准备睡眠」的NM报文,等待其他节点确认。

避坑指南:我曾经在一个项目中遇到「网络无法进入睡眠」的问题。排查了三天,最后发现是一个ECU的NM报文周期设置成了10ms,导致总线一直处于活跃状态。记住:NM报文的周期不能太短,否则网络永远睡不了。一般建议200ms以上。

3.4 CAN诊断协议

CAN诊断,说白了就是通过CAN总线对ECU进行「体检」和「治疗」。最常用的诊断协议是UDS(Unified Diagnostic Services),基于ISO 14229标准。

UDS在CAN上的实现通常遵循ISO 15765-2(DoCAN)协议。它把UDS报文封装在CAN帧的数据场中,通过多帧传输机制支持超过8字节的诊断数据。

3.4.1 常用诊断服务

SID 服务名称 用途
0x10 诊断会话控制 切换ECU的工作模式(默认/编程/扩展)
0x22 读取数据标识符 读取ECU内部参数(如电压、温度、版本号)
0x2E 写入数据标识符 写入配置参数(如VIN码、标定值)
0x31 例程控制 启动/停止ECU内部例程(如自学习、自检)
0x34 请求下载 启动固件刷写流程
0x19 读取DTC信息 读取故障码及其状态

3.4.2 多帧传输机制

当诊断数据超过8字节(CAN FD下超过64字节)时,就需要用到多帧传输。ISO 15765-2定义了两种多帧模式:

  • 连续帧(CF):发送方连续发送数据帧,接收方通过流控制帧(FC)管理流量。
  • 分段传输(STmin):发送方在每帧之间插入最小间隔时间,防止接收方缓冲区溢出。

我的经验:在做OTA刷写时,STmin的设置很关键。设得太小,接收方来不及处理,容易丢帧;设得太大,刷写速度上不去。我一般建议STmin设为0x10(1ms),配合CAN FD的64字节数据场,刷写速度可以做到500 KB/s以上。

3.4.3 诊断报文示例

下面是一个典型的UDS诊断请求和响应示例:

// 诊断请求:读取ECU软件版本号(DID 0xF190)
// 物理寻址:请求ID 0x7DF,响应ID 0x7EF

请求帧(CAN ID: 0x7DF):
  数据:02 22 F1 90 00 00 00 00
  解释:02(数据长度) 22(读取DID服务) F190(DID)

响应帧(CAN ID: 0x7EF):
  数据:06 62 F1 90 56 31 2E 30
  解释:06(数据长度) 62(读取DID响应) F190(DID) 56 31 2E 30(ASCII码:V1.0)

注意:诊断报文的CAN ID通常使用功能寻址(0x7DF)或物理寻址(特定ECU的ID)。功能寻址可以同时唤醒所有ECU,物理寻址只针对单个ECU。在刷写场景中,建议使用物理寻址,避免误操作其他ECU。

3.5 本章小结

CAN FD解决了带宽和数据场大小的瓶颈,CAN XL则把CAN推向了千兆级通信的边界。网络管理保证了车载网络的低功耗运行,诊断协议则为ECU的维护和刷写提供了标准化的手段。这三块内容,是你在设计现代车载网络时绕不开的核心能力。

嗯,记住一点:技术选型没有银弹。CAN FD适合当前主流需求,CAN XL面向未来,网络管理和诊断则是基本功。根据你的项目实际需求,合理搭配就好。