2、CAN基础回顾:CAN 2.0与CAN FD的帧结构、仲裁机制

好,咱们正式开始聊CAN。说实话,虽然现在TSN很火,但你要是连CAN都搞不明白,那混合组网根本无从谈起。我见过太多工程师一上来就啃TSN协议栈,结果连CAN总线上为啥丢帧都查不出来。所以这一章,咱们把CAN 2.0和CAN FD的老底翻一翻。

2.1 CAN 2.0的帧结构——经典但不过时

CAN 2.0分两种:标准帧(11位ID)和扩展帧(29位ID)。你想想看,一个ECU要发一条消息,它得告诉总线上所有人“我要说话了”,然后大家听。这个“说话权”就是靠ID来抢的。

标准帧的结构,我习惯把它拆成这么几块:

  • SOF(Start of Frame):1个显性位,告诉总线“我要开始发了”。
  • 仲裁场:11位ID + RTR位。RTR位决定这是数据帧还是远程帧。
  • 控制场:IDE位 + 保留位 + DLC(4位数据长度码)。
  • 数据场:0~8字节,看DLC。
  • CRC场:15位CRC + 1位CRC界定符。
  • ACK场:接收节点拉低这个位,告诉发送方“我收到了”。
  • EOF:7个隐性位,结束。

扩展帧呢?说白了就是把ID从11位扩到29位。仲裁场里先发11位基本ID,然后SRR位、IDE位(显性),再接18位扩展ID。嗯,这里要注意:扩展帧的优先级比标准帧低,因为IDE位是隐性。

我个人经验:在混合组网里,我建议把关键控制信号(比如刹车、转向)用标准帧,优先级高。非关键数据(比如诊断、配置)用扩展帧。这样即使总线负载高,关键帧也能抢到总线。

2.2 CAN FD——带宽不够?那就加码

CAN 2.0的8字节数据场,在现在的车载网络里真的不够用。你想想,一个高精地图更新包,8字节得发多少次?所以CAN FD来了。

CAN FD最大的变化就两个:

  1. 数据场可以到64字节。DLC编码变了,0~8对应0~8字节,9~15对应12、16、20、24、32、48、64字节。这个编码表我建议你背下来,调试时经常用。
  2. 可变速率。仲裁段还是原来的速率(比如500kbps),但数据段可以飙到2Mbps甚至更高。怎么实现的?BRS位(Bit Rate Switch)控制。BRS=1时,数据段切到高速模式。

CAN FD的帧结构,跟CAN 2.0比多了几个位:

  • EDL位:取代了原来的保留位。EDL=1表示这是CAN FD帧。
  • BRS位:1表示数据段切高速。
  • ESI位:错误状态指示,发送节点主动告诉别人“我状态不太好”。

避坑指南:我曾经在一个项目里,CAN FD的BRS位设置错了。仲裁段500kbps,数据段想切到2Mbps,结果因为终端电阻匹配不好,数据段全是错误帧。后来发现,数据段速率超过1Mbps时,必须用更短的线缆和更小的寄生电容。嗯,这个坑我替你们踩过了。

2.3 仲裁机制——谁ID小谁赢

CAN总线的仲裁,说白了就是“谁的数字小谁说话”。为什么?因为显性位(0)会覆盖隐性位(1)。

过程是这样的:

  1. 所有要发送的节点,同时从SOF开始往总线上发数据。
  2. 每个节点发完自己的ID位后,马上回读总线电平。
  3. 如果自己发的是隐性位(1),但读到的是显性位(0),说明有优先级更高的节点在发,自己立刻退出。
  4. 剩下的节点继续,直到只剩一个。

你想想看,这个机制有多巧妙?不需要中央调度,不需要令牌,完全靠硬件自动完成。这也是为什么CAN在实时性上这么强。

关键点:仲裁过程中,数据不会丢失。退出的节点会在总线空闲后自动重发。这也是CAN为什么叫“非破坏性仲裁”。

2.4 CAN 2.0 vs CAN FD——到底怎么选?

我经常被问到这个问题。我的建议是:

场景 推荐协议 原因
关键控制信号(刹车、转向) CAN 2.0 帧短,延迟低,可靠性经过几十年验证
大数据量传输(固件升级、日志) CAN FD 64字节一帧,效率高
混合组网(TSN+CAN) CAN FD 更容易做网关转换,数据量匹配
老旧ECU升级 CAN 2.0 兼容性第一,别给自己找麻烦

注意:CAN FD和CAN 2.0可以在同一条总线上共存,但前提是所有节点都支持CAN FD。如果有一个老节点只认CAN 2.0,它看到EDL=1的帧会直接报错。所以混合组网时,一定要确认所有节点的CAN FD兼容性。

2.5 实战中的小细节

最后分享几个我实际项目中踩过的坑:

  • 位定时配置:CAN的位时间由TSEG1、TSEG2、SJW组成。采样点建议设在87.5%左右。我曾经用默认配置,结果总线长度一超过2米就丢帧。后来手动算了一下采样点,问题解决。
  • 终端电阻:CAN总线两端各一个120Ω电阻。但CAN FD高速段,这个电阻值可能需要调整。我见过有人用60Ω,结果信号反射得一塌糊涂。
  • DLC编码:CAN FD的DLC编码跟CAN 2.0不一样。调试时别拿CAN 2.0的解析工具去读CAN FD的帧,你会看到数据长度不对。

好了,CAN的基础就回顾到这里。下一章咱们开始聊TSN,到时候你会发现,很多TSN的设计思路其实是从CAN这边借鉴过来的。嗯,先打好基础,后面才不慌。