3、CAN FD物理层与数据链路层:位时序、采样点配置与CRC校验增强
好,咱们进入CAN FD最核心的两个层面——物理层和数据链路层。说实话,很多工程师觉得CAN FD就是改了个协议,把速率提上去了。其实没那么简单。物理层的位时序、采样点配置,还有数据链路层的CRC增强,这三块要是没搞明白,你的OTA升级大概率会翻车。
我个人习惯,讲CAN FD之前,先带大家回顾一下经典CAN的痛点。你想想看,经典CAN最高1Mbps,数据场最多8字节。做OTA升级?一个几百KB的固件包,拆成无数个8字节的小包,光协议开销就够你受的。CAN FD把数据场扩展到64字节,速率最高能到8Mbps甚至更高。但速率一高,问题就来了——信号更容易受干扰,位时序稍微偏一点,整个总线就崩了。
3.1 位时序:CAN FD的“心跳”
位时序,说白了就是每个bit在总线上怎么排布、怎么采样。CAN FD的位时序结构和经典CAN基本一致,但细节上做了调整。它把一个bit时间分成四段:同步段(SS)、传播段(PTS)、相位缓冲段1(PBS1)、相位缓冲段2(PBS2)。采样点就在PBS1和PBS2之间。
嗯,这里要注意:CAN FD的仲裁段和数据段可以有不同的位时序配置。仲裁段通常用1Mbps,数据段可以切换到更高的速率。为什么?因为仲裁段需要所有节点同步,速率不能太高;数据段是单节点发送,可以跑得更快。
我在项目中遇到过一个问题:某次OTA升级,数据段速率配到了5Mbps,结果总线上时不时出现错误帧。排查了半天,发现是某个节点的晶振偏差太大,导致位时序对不上。后来我把采样点往后调了调,问题就解决了。
关键点:CAN FD的位时序配置,仲裁段和数据段是独立的。仲裁段通常用1Mbps,数据段可以配到2Mbps、5Mbps甚至8Mbps。但速率越高,对晶振精度和总线拓扑的要求也越高。
3.2 采样点配置:一个“黄金位置”
采样点,就是接收节点在bit时间内读取总线电平的那个时刻。这个位置选得好不好,直接决定了通信的可靠性。
我个人建议,采样点最好配置在bit时间的70%-80%之间。为什么?因为信号在总线上传输有延迟,加上各节点的晶振误差,采样点太靠前或太靠后,都可能采到错误的电平。
举个例子:假设bit时间为1μs,采样点设在70%的位置,那就是在700ns处采样。如果总线延迟是200ns,晶振误差累计100ns,实际采样点还在600ns左右,仍然在bit的稳定区域。但如果采样点设在50%,稍微有点延迟,就可能采到前一个bit的尾巴。
我曾经在一个项目中,把采样点配到了60%,结果总线上有3米长的线缆,加上两个中继器,延迟累计下来,采样点几乎落在了bit的跳变沿上。那段时间天天抓波形,最后发现是采样点配置的问题。调整到75%后,通信就稳了。
避坑指南:我曾经在CAN FD的采样点配置上吃过亏。建议你:
- 仲裁段采样点:75%-80%
- 数据段采样点:70%-75%(速率越高,采样点越靠后)
- 如果总线上节点数量多,采样点适当往后调
3.3 CAN FD的CRC校验增强
CRC校验,这是数据链路层的重头戏。经典CAN用的是15位CRC,对于8字节的数据场来说够用了。但CAN FD的数据场最大64字节,15位CRC的碰撞概率就有点高了。
CAN FD引入了两种CRC:CRC_17和CRC_21。数据场不超过16字节时用CRC_17,超过16字节时用CRC_21。位数多了,检错能力自然更强。
但这里有个坑:CRC的生成多项式变了。经典CAN的生成多项式是x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1。CAN FD的CRC_17生成多项式是x^17 + x^16 + x^14 + x^13 + x^11 + x^10 + x^9 + x^8 + x^7 + x^6 + x^5 + x^3 + x^2 + 1。CRC_21的就更复杂了。
你想想看,如果控制器不支持新的CRC算法,那它收到CAN FD帧时,根本算不对CRC,直接报错。这就是为什么有些老节点不能直接挂到CAN FD总线上——它们不认识新的CRC。
CRC配置速查表:
| 数据场长度 | CRC类型 | CRC位数 | 生成多项式(简写) |
|---|---|---|---|
| ≤ 16字节 | CRC_17 | 17位 | 0x3685B |
| > 16字节 | CRC_21 | 21位 | 0x302899 |
我记得有一次做OTA升级测试,数据场用了64字节,CRC_21。结果某个节点的CRC计算总是出错。查了半天,发现是那个节点的CRC计算模块有bug——它把数据场的填充位也算进去了。CAN FD的CRC计算,数据场中的填充位是不参与计算的,但有些老旧的控制器实现会搞错。
警告:CAN FD的CRC计算,数据场中的填充位(stuff bits)不参与CRC计算。这是和经典CAN的一个关键区别。如果你的控制器实现搞错了,CRC校验永远过不了。
3.4 实践中的配置建议
好,理论讲完了,咱们说说实际怎么配。我个人习惯,做OTA升级项目时,会按以下步骤来:
- 确定仲裁段速率:通常1Mbps,如果总线上有老节点,降到500kbps
- 确定数据段速率:根据总线拓扑和线缆长度来定。短距离(< 1米)可以上8Mbps,长距离(> 5米)建议2Mbps
- 配置采样点:仲裁段75%,数据段70%。如果总线上节点多,适当往后调
- 选择CRC类型:数据场超过16字节就用CRC_21,否则用CRC_17
- 验证:用示波器抓波形,看采样点是否在bit的稳定区域
嗯,这里还要提醒一点:CAN FD的位时序配置,不同厂家的控制器可能略有差异。比如NXP的S32K系列和TI的TMS570系列,它们的位时序寄存器配置方式就不太一样。但原理是一样的——都是把bit时间分成四段,然后设置采样点位置。
我曾经在一个项目中,用了两种不同厂家的控制器,结果发现它们的采样点配置公式不一样。一个是用“采样点位置 = (1 + PTS + PBS1) / (1 + PTS + PBS1 + PBS2)”,另一个是用“采样点位置 = (SS + PTS + PBS1) / (SS + PTS + PBS1 + PBS2)”。虽然SS通常为1,但如果你没注意这个细节,算出来的采样点位置可能差一个Tq。
小技巧:配置CAN FD的位时序时,建议先用厂家提供的工具(比如NXP的MCUXpresso Config Tool)生成配置参数,然后再手动微调。这样可以避免一些寄存器配置上的低级错误。
好了,这一章的内容就到这里。物理层的位时序和采样点配置,加上数据链路层的CRC增强,这三块是CAN FD通信的基石。搞懂了它们,你的OTA升级才能跑得稳、跑得快。下一章咱们聊聊CAN FD的帧结构,看看数据场怎么塞进64字节,以及怎么利用它来做高效的固件传输。