2. 车载网络演进
各位好,欢迎来到第二章。上一章我们聊了CANFD为什么会出现,以及它和传统CAN的宏观区别。这一章,咱们得钻到协议内部,看看CANFD的物理层和数据链路层到底是怎么工作的。
说白了,CANFD能跑得这么快,还能在同一个帧里变速,核心秘密就藏在位时序、采样点和速率切换机制这三个东西里。我当年刚接触CANFD时,觉得不就是改了个速率嘛,结果在第一个项目里就被采样点配置坑了一把——总线一长,全是错误帧。嗯,从那以后我再也不敢小看这些参数了。
核心要点:CANFD的物理层与传统CAN完全兼容,但数据链路层引入了可变速率和更灵活的数据场。理解位时序是配置采样点的前提,而采样点直接决定了总线通信的可靠性。
2.1 CANFD的位时序结构
先问大家一个问题:CAN总线上没有时钟线,收发器怎么知道什么时候该采样数据?答案就是位时序。每个bit被分成若干个小时间单元(Time Quantum, TQ),收发器靠这些TQ来同步和采样。
CANFD的位时序和传统CAN一样,由四段组成:
| 段名称 | 英文缩写 | 作用 | 典型长度(TQ) |
|---|---|---|---|
| 同步段 | Sync_Seg | 用于总线同步,所有节点在此段对齐边沿 | 1 TQ(固定) |
| 传播段 | Prop_Seg | 补偿物理延迟(线缆、收发器、驱动器) | 1~8 TQ |
| 相位缓冲段1 | Phase_Seg1 | 采样点前调整,用于补偿边沿相位误差 | 1~8 TQ |
| 相位缓冲段2 | Phase_Seg2 | 采样点后调整,用于补偿下一个边沿 | 1~8 TQ |
一个bit的总长度 = Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2。采样点就落在Phase_Seg1和Phase_Seg2之间。
我的经验:配置位时序时,我习惯先确定采样点位置,再反推各段长度。采样点太靠前或太靠后,都会导致采样错误。尤其是高速CANFD(2Mbps以上),采样点偏差1%都可能让总线崩溃。
2.2 采样点配置:为什么它这么重要?
采样点,就是收发器读取总线电平的那个时刻。它用百分比表示:采样点位置占整个bit的百分比。
举个例子:一个bit有20个TQ,采样点在Phase_Seg1结束后,也就是第1(Sync)+ 5(Prop)+ 7(Phase_Seg1)= 13个TQ处,采样点就是13/20 = 65%。
传统CAN推荐采样点在87.5%左右,但CANFD不一样。因为数据段速率更高,位时间更短,采样点需要适当前移。我个人建议:
- 仲裁段(1Mbps以下):采样点推荐 80%~87.5%
- 数据段(2Mbps~5Mbps):采样点推荐 70%~80%
- 数据段(5Mbps~8Mbps):采样点推荐 60%~70%
为什么会这样?你想想看,高速时信号边沿更陡,但线缆和收发器的延迟占比更大。采样点太靠后,可能已经错过了稳定的电平窗口。我在一个项目中用过8Mbps的数据段,采样点设在75%,结果总线长度超过30cm就开始出错。后来调到65%,问题就解决了。
避坑指南:我曾经遇到过一个案例,客户用CANFD连接两个ECU,距离只有1米,但总是间歇性丢帧。排查了三天,最后发现是采样点配置不一致——一个节点用80%,另一个用70%。两个节点对同一个bit的采样时刻不同,导致仲裁时出现位错误。记住:总线上所有节点的采样点必须一致,误差不超过1%。
2.3 仲裁段与数据段速率切换机制
这是CANFD最核心的特性。传统CAN整个帧都是一个速率,CANFD却能在同一个帧内切换速率。怎么做到的?
看下图就明白了:
速率切换的关键在于BRS位(Bit Rate Switch)。当BRS位为隐性(1)时,收发器知道:从下一个bit开始,我要加速了。这个切换发生在控制段和数据段之间。
切换过程其实很微妙。收发器内部有两套位时序配置:一套给仲裁段(慢速),一套给数据段(快速)。当检测到BRS位后,它会在一个bit的边界处瞬间切换配置。这个切换必须精确到TQ级别,否则就会产生位错误。
重要:速率切换不是瞬间完成的,它有一个切换延迟。不同厂家的收发器切换延迟不同,一般在10~50ns之间。设计高速CANFD时,必须把这个延迟算进传播段里。我习惯在Prop_Seg里多留2~3个TQ的余量,专门应对切换延迟。
2.4 实际配置示例
说了这么多理论,咱们来点实际的。假设我们要配置一个CANFD节点:
- 仲裁段速率:500kbps
- 数据段速率:2Mbps
- 晶振频率:40MHz
- 采样点:仲裁段85%,数据段75%
计算过程如下:
// 仲裁段配置(500kbps)
// 位时间 = 1 / 500k = 2000ns
// TQ = 1 / (40MHz / 分频系数) = 25ns(分频系数=1)
// 每个bit的TQ数 = 2000 / 25 = 80 TQ
// 采样点85% = 80 * 0.85 = 68 TQ处采样
// 各段分配:Sync=1, Prop=10, Phase_Seg1=57, Phase_Seg2=12
// 数据段配置(2Mbps)
// 位时间 = 1 / 2M = 500ns
// TQ = 25ns(分频系数不变)
// 每个bit的TQ数 = 500 / 25 = 20 TQ
// 采样点75% = 20 * 0.75 = 15 TQ处采样
// 各段分配:Sync=1, Prop=3, Phase_Seg1=11, Phase_Seg2=5
小技巧:很多MCU的CANFD外设提供了自动采样点计算功能,但我不建议完全依赖它。我习惯手动算一遍,然后用示波器抓实际波形验证。有一次自动计算出来的采样点偏差了3%,导致总线在高温下不稳定。手动调整后,问题就消失了。
2.5 常见问题与排查思路
最后,我总结几个我在项目中遇到过的CANFD物理层/数据链路层问题:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 总线一直报错帧 | 采样点配置不一致 | 检查所有节点的采样点配置,确保一致 |
| 高速时丢帧 | 切换延迟未补偿 | 增加Prop_Seg的TQ数,或降低数据段速率 |
| 特定节点无法通信 | 位时序参数超出收发器范围 | 查看收发器datasheet,确认TQ范围 |
| 温度变化后不稳定 | 晶振漂移导致采样点偏移 | 使用更高精度晶振,或增加同步跳转宽度(SJW) |