1. CAN FD 协议基础
各位做嵌入式通讯的朋友,应该都跟 CAN 总线打过交道。经典 CAN 用了这么多年,上车量越来越大,数据也越来越挤——一个报文最多 8 字节,想传个 OTA 升级包?得拆成几十帧,慢不说,还容易丢。CAN FD 就是在经典 CAN 基础上“提速扩容”的升级方案。说白了,它保留了经典 CAN 的仲裁机制和物理层,但数据段可以跑更高比特率,数据场最大 64 字节。这一章我先带你把 CAN FD 的帧结构、比特率概念和采样点这几个基础知识点理清楚。
我个人习惯,每次调采样点之前,一定先把帧结构画一遍。为什么?因为采样点的位置跟帧里哪些位是“数据段”、哪些是“仲裁段”直接相关。你连帧结构都不清楚,采样点配置就是盲调。
1.1 CAN FD 帧结构
CAN FD 的帧跟经典 CAN 帧长得非常像,但有几个关键位不一样。我直接拿一个标准 CAN FD 数据帧来说:
- SOF(起始帧)—— 1 个显性位,标记总线开始。
- 仲裁场—— 11 位 ID(标准帧)或 29 位 ID(扩展帧) + RTR(经典 CAN 专用,CAN FD 里固定为显性)+ IDE 位。
- 控制场—— 这里藏了 CAN FD 的灵魂:EDL(扩展数据长度)位,为显性表示是经典 CAN,为隐性表示是 CAN FD;BRS(比特率切换)位,为隐性时数据段切换到高速率;ESI(错误状态指示)位。另外还有 4 位的 DLC,表示数据长度(0~64 字节)。
- 数据场—— 0~64 字节,CAN FD 最大的提升就在这里。
- CRC 场—— CAN FD 使用 17 位或 21 位 CRC(取决于数据长度),覆盖范围比经典 CAN 更多。
- ACK 场—— 跟经典 CAN 一样,接收节点在 ACK 槽发送显性位确认。
- EOF(帧结束)—— 7 个隐性位。
关键点:CAN FD 帧里有一个BRS 位。当 BRS = 隐性时,从 BRS 位之后一直到 CRC 分界符(包括 CRC 和 ACK 的一部分?准确说是到 CRC 场结束)都使用数据段比特率,其余部分仍用仲裁段比特率。采样点配置要能同时适应两种比特率,这是很多新手容易忽略的坑。
我曾在某个项目里,因为没注意到 BRS 位切换后数据段比特率太高,导致采样点偏移,总线经常莫名其妙报错。后来拿示波器抓波形才找到问题。嗯,这里要注意:帧结构里每一个位的时序都必须落在采样点的窗口内,特别是切换点前后的位。
1.2 比特率概念
经典 CAN 全帧固定一个比特率,比如 500 kbps、1 Mbps。CAN FD 不一样,它允许两个比特率:
- 仲裁段比特率(Arbitration Bit Rate)—— 从 SOF 到 BRS 位之前,以及从 CRC 分界符到 EOF,使用这个比特率。通常不超过 1 Mbps,因为要保证多个节点同时发送时能正确仲裁。
- 数据段比特率(Data Bit Rate)—— 从 BRS 位之后到 CRC 场结束(包括 CRC 分界符之前),使用这个比特率。常见 2 Mbps、5 Mbps,甚至 8 Mbps。
为什么仲裁段不能跑太高?说白了,CAN 的仲裁机制依赖所有节点同时发送显性/隐性位,如果比特率太高,总线传播延迟会导致仲裁失败。我见过有人非要把仲裁段也设成 2 Mbps,结果一挂多个节点就崩。老老实实保持 500 kbps 或 1 Mbps。
| 特性 | 经典 CAN | CAN FD |
|---|---|---|
| 数据场最大长度 | 8 字节 | 64 字节 |
| 比特率 | 单一比特率 | 双比特率(仲裁段 + 数据段) |
| CRC | 15 位 CRC | 17/21 位 CRC |
| 帧格式兼容 | 经典帧 | 兼容经典帧(EDL=0 时) |
| 采样点配置 | 单个采样点 | 两个采样点(仲裁段 + 数据段) |
一个实用的建议:在设计系统时,先把仲裁段比特率定下来(通常根据总线长度和节点数量,参考 ISO 11898-2 的表格),再选数据段比特率。我个人习惯,数据段比特率不要超过仲裁段比特率的 4 倍,否则采样窗口会非常窄。
1.3 采样点定义与重要性
采样点是什么?很简单:每个位被总线上接收节点“读取”的时刻点。CAN 控制器在一个位时间内等间距采样,然后根据采样结果判断该位是显性还是隐性。采样点的位置通常用一个百分比表示,例如 70%,意味着在位的 70% 时间点采样。
你想想看,如果采样点太靠前,位的起始部分还没稳定,可能把上一个位的“残余”当成当前位;如果太靠后,位快结束了,可能已经受到后续位或噪声的影响。所以理想采样点都在位的中间偏后一点点,经典 CAN 通常推荐 70%~80%。
CAN FD 因为有双比特率,采样点配置就更讲究了。仲裁段比特率低,位时间长,采样点可以选高一些(80%)。但数据段比特率高,位时间短,振荡器时钟漂移、总线长度导致的传播延迟都会让采样点偏移。通常数据段采样点建议选在 60%~70% 之间。
我曾经踩过的一个大坑:在某项目中,我们直接把经典 CAN 的采样点配置(80%)照搬到 CAN FD 的数据段,结果 5 Mbps 下总线几乎无法通信。后来发现,因为数据段位时间只有 200 ns,80% 意味着采样点在 160 ns 处,而总线传播延迟加收发器上升时间就已经超过 100 ns,几乎踩到了位的边缘。把采样点调到 65% 后问题解决。
采样点的重要性,说白了就是直接决定误码率。采样点偏离理想位置 5%,误码率可能上升一个数量级;偏离超过 10%,基本没法稳定通信。这也是为什么我把采样点配置单独拿出来当一整章课程的核心原因。
下面这张图展示了 CAN FD 帧的基本结构,以及仲裁段和数据段各自的采样点位置。我特意把 BRS 位前后的切换区域放大了,你能看到采样点需要跨越两种比特率的边界。
图里红色标记的就是两种采样点。你可以看到,数据段采样点更靠前,这是为了保证在高比特率下有足够的相位缓冲来对抗时钟漂移。至于具体怎么算采样点偏移对错误率的影响,我们后面章节会展开。
最后提一句:采样点配置不是孤立的,它跟位时间参数(TSEG1、TSEG2、SJW)紧密相关。但本章先让你有个整体概念,记住——帧结构决定哪些位在哪段比特率下跑,而采样点决定这些位能不能被正确读出来。缺一不可。