4、CAN FD基础:CAN FD与CAN的区别、CAN FD帧结构、数据场长度编码(DLC)、速率切换(BRS)
好,咱们进入CAN FD的世界。
说实话,我第一次接触CAN FD时,心里想的是:“这不就是CAN吗?改了个名字?” 后来踩了几个坑才明白——它俩看着像,骨子里差别大了去了。
4.1 CAN FD与CAN的区别:不只是“快”那么简单
很多人以为CAN FD就是CAN的“加速版”。嗯,这么说也对,但不全面。
我个人的理解是:CAN FD保留了CAN的仲裁机制和物理层,但把数据链路层做了大手术。你想想看,传统CAN最高只能跑1Mbps,数据场最多8个字节。这在十年前够用,但现在呢?一个ECU刷写动辄几兆字节,8字节一包数据,得发到猴年马月去。
核心区别我列了三点:
- 速率不同:CAN FD在数据段可以切换到最高8Mbps(甚至更高),仲裁段还是原来的速率。说白了就是“该慢的时候慢,该快的时候快”。
- 数据长度不同:CAN FD一帧最多能带64字节数据。8倍于传统CAN。我在做OTA升级项目时,这个特性简直是救命稻草。
- 帧格式不同:多了几个控制位,比如BRS、ESI。后面细说。
重要提醒:CAN FD向下兼容CAN吗?答案是:部分兼容。CAN FD节点可以收CAN报文,但CAN节点收到CAN FD报文会直接报错。所以混网时要小心,我曾经在一个项目里因为没注意这个,导致整个网络疯狂报错,排查了两天。
4.2 CAN FD帧结构:多出来的那几位
咱们先看一个标准的CAN FD数据帧结构。别怕,跟CAN帧比,就多了几个“新面孔”。
帧起始(SOF) → 仲裁场(11/29位ID + RRS + IDE) → 控制场(EDL + BRS + ESI + DLC) → 数据场(0-64字节) → CRC场(含填充位计数) → ACK场 → 帧结束(EOF)
嗯,看着有点乱?我拆开讲。
控制场里的三个新角色:
- EDL(Extended Data Length):隐性位,表示这是CAN FD帧。显性就是传统CAN帧。这是区分两者的“身份证”。
- BRS(Bit Rate Switch):这个最核心。隐性位表示切换到高速率,显性位保持原速率。说白了就是“油门”开关。
- ESI(Error State Indicator):发送节点错误状态的标志。主动错误时显性,被动错误时隐性。我调试时经常看这个位来判断节点健康状态。
我的小技巧:在CANoe里抓CAN FD报文时,记得打开“CAN FD”视图。传统CAN视图里看不到BRS和ESI位,容易误判。我曾经因为这个,以为某个节点一直在发错误帧,后来才发现是视图没选对。
4.3 数据场长度编码(DLC):从8到64的跨越
DLC在传统CAN里只有0-8,对应0-8字节。但在CAN FD里,DLC编码变了。
你想想看,如果DLC还是4位二进制,最多只能表示15。但CAN FD需要表示到64字节。怎么办?用了非线性映射。
| DLC值(十进制) | 传统CAN数据长度(字节) | CAN FD数据长度(字节) |
|---|---|---|
| 0-8 | 0-8 | 0-8 |
| 9 | 8 | 12 |
| 10 | 8 | 16 |
| 11 | 8 | 20 |
| 12 | 8 | 24 |
| 13 | 8 | 32 |
| 14 | 8 | 48 |
| 15 | 8 | 64 |
看到没?DLC=9时,传统CAN还是8字节,但CAN FD已经变成12字节了。这就是为什么有些老工具解析CAN FD报文时会显示“数据长度异常”——它还在用老映射表。
避坑指南:我曾经在写CAN FD驱动时,直接用了DLC值作为数据长度。结果DLC=9时只拷贝了9个字节,实际应该拷贝12个。导致后面3个字节全是随机值,被测试同事追着骂了一周。记住:一定要查表,不要直接拿DLC当长度用。
4.4 速率切换(BRS):什么时候快,什么时候慢
BRS位是CAN FD最巧妙的设计之一。它让总线在同一个帧里跑两种速率。
具体流程是这样的:
- 帧起始到BRS位之前:用仲裁速率(比如500kbps)。所有节点都能参与仲裁。
- BRS位为隐性时:从BRS位之后到CRC分隔符之前,切换到数据速率(比如2Mbps)。
- CRC分隔符之后:切回仲裁速率,直到帧结束。
为什么会这样设计?说白了,仲裁阶段必须慢,因为要保证所有节点都能听到彼此的ID。数据阶段可以快,因为只有发送节点在说话,没有冲突风险。
我个人的经验是:数据速率不是越高越好。记得有一次我把数据速率设到8Mbps,结果线缆稍微长了一点,CRC错误率飙升。后来降到5Mbps,稳如老狗。所以,速率选择要综合考虑线缆长度、节点数量、EMC环境。
关键点:BRS位只在CAN FD帧里有效。传统CAN帧里没有BRS位,所以永远跑在仲裁速率。这也是为什么CAN FD节点能收CAN报文——它看到BRS位不存在,就知道这是个传统帧,按原速率处理就行。
4.5 实战中的一点感悟
最后说点题外话。CAN FD虽然好,但不是万能药。我见过有人为了追求“快”,把所有报文都改成64字节、8Mbps。结果呢?总线负载率是降了,但EMC测试全挂,因为高频信号辐射太强。
我的建议是:按需使用。大数据量的报文(比如刷写、日志)用CAN FD,小数据量的控制报文(比如车门锁、车窗)继续用传统CAN。混着用,才是最优解。
嗯,这一章就到这里。下一章咱们聊聊CAN FD的物理层——为什么线缆长度会影响速率?为什么终端电阻要重新算?到时候见。