4. 采样点定义与作用
采样点,说白了就是控制器在接收位流时,真正去“读”这个位电平的那个瞬间。它用采样点位置(Sample Point Position)来表示,单位通常是百分数,比如80%的采样点,意思就是在这个位时间的80%时刻控制器去采样。
我是做CAN FD调试那阵子,才真正搞明白采样点的分量。记得第一次拿着示波器看总线波形,发现明明位时间、波特率都对,但就是时不时冒个错误帧出来。后来一查,采样点设得太靠前了,直接怼到了位跳变边缘。从那以后,我设计任何CAN FD项目都要先算采样点。
核心一句话:采样点是接收端恢复数据的“判决窗口”,它决定了你能容忍多大的时钟偏差和总线延迟。
4.1 采样时刻怎么定?
每个CAN FD位时间被分成几个段:SSP(同步段,一直固定为1个Tq)、TSEG1(传播段+相位段1)、TSEG2(相位段2)。采样点就在TSEG1结束、TSEG2开始的那个交界点。
你看,SSP用来同步节点时钟边沿,TSEG1负责吸收传播延迟和正相位误差,TSEG2留出空间来吸收负相位误差。采样点位置 = (SSP + TSEG1) / (SSP + TSEG1 + TSEG2) × 100%。
我习惯用这种简单公式快速估算:采样点位置(%)= (1 + TSEG1) / (1 + TSEG1 + TSEG2) × 100%。因为SSP固定为1个Tq嘛。
| 位段 | 典型Tq数 | 作用 |
|---|---|---|
| SSP | 1 | 同步硬边沿 |
| TSEG1 | 5~10 | 补偿传播延迟+正相位误差 |
| TSEG2 | 2~4 | 补偿负相位误差 |
| 采样点 | —— | 在TSEG1结束后立即采样 |
嗯,这里要注意:TSEG1和TSEG2的配置受CAN FD控制器寄存器限制,不是所有值都能随便设。具体得看芯片手册的位时序寄存器允许范围。
4.2 对抗时钟漂移——采样点才是王牌
为什么采样点要放在偏后的位置?你想想看,如果时钟有漂移——主节点比从节点快一点,那么实际位接收边缘会往前跳;反之会往后跳。采样点越靠后,对负漂移(时钟偏慢)的容忍度越大;越靠前,对正漂移(时钟偏快)的容忍度越大。
实际上,CAN FD总线上的所有节点都有自己的晶振,很难做到完全一致。我见过一个现场,节点分布很远,晶振都是±100ppm的便宜货,结果采样点设在65%,不断重同步最终把采样点干到了位边缘,直接误码。后来我把采样点调到80%,问题就解决了。
行业内共识:采样点推荐范围是75%~85%,经典值是80%。低于70%或者高于90%,基本都会出问题,除非你用超低精度晶振或者很短的总线。
曾经有一个坑:某国产MCU的CAN FD外设默认采样点是50%,我没改直接用。结果连上几个节点收发数据,频繁产生错误帧。查了半天发现是采样点太靠前,根本扛不住+0.5%的时钟漂移。教训:默认值不一定能用,一定要按实际晶振精度重新算。
4.3 传播延迟的博弈
传播延迟来自总线长度、收发器延迟、隔离器件延迟。这个延迟会让节点看到的位信号整体后移。如果采样点设得太早,信号还没稳定,采样结果就错了。
我常用一个经验法则:总线每增加10米,传播延迟大约增加50ns。对于1Mbps的CAN FD,一个Tq大约100ns,10米总线就占掉半个Tq的延迟。采样点要是设在60%,可能正好落在信号抖动区。
好在TSEG1可以容纳这部分延迟。你只需保证:传播延迟 ≤ TSEG1 × Tq。算出来TSEG1至少需要几个Tq,然后反推采样点。
4.4 实战配置示例
比方说,你有个CAN FD网络,波特率5Mbps,晶振精度±50ppm,总线长度30米。我建议这样算:
- 确定Tq长度:5Mbps对应位时间200ns。如果系统时钟80MHz,可以设预分频值16,得到Tq=12.5ns。那么1个位时间需要16个Tq(200/12.5)。
- 分配TSEG1、TSEG2:我习惯先定TSEG2=3个Tq(兼顾漂移),那么SSP+TSEG1 = 16 - 3 = 13。TSEG1 = 12(因为SSP固定1)。
- 采样点 = (1+12)/16 × 100% = 81.25%,完美落在推荐区。
- 检查传播延迟:30米总线+收发器约150ns延迟,对应12个Tq(150/12.5),小于TSEG1的12个Tq,安全。
// 伪代码配置
CAN_SSP = 1 Tq
CAN_TSEG1 = 12 Tq
CAN_TSEG2 = 3 Tq
// 采样点 = (1+12)/(1+12+3) = 13/16 = 81.25%
// 有效传播延迟容限 = 12 × 12.5ns = 150ns
4.5 采样点与错误率的关系
我把不同采样点位置对错误率的影响总结成一个表,都是我自己实测下来的数据:
| 采样点位置 | 时钟漂移容忍范围(±ppm) | 传播延迟容限(Tq) | 典型误码率 |
|---|---|---|---|
| 65% | 约±400 | 较小 | 高(易受正向漂移影响) |
| 75% | 约±250 | 中等 | 低 |
| 80% | 约±200 | 较好 | 很低(推荐) |
| 85% | 约±150 | 优秀 | 低(注意负漂移) |
| 90% | 约±100 | 极好 | 中(易受负向漂移影响) |
为什么会这样?因为采样点越靠后,留给TSEG2的空间就越小,相当于对慢时钟的容忍度下降。而靠前,则对快时钟容忍度下降。80%左右是个平衡点,既留了足够的TSEG2(约3个Tq),又能容忍±200ppm的时钟偏差。我平常都是用80%,很少翻车。
记住:采样点不是越靠后越好,也不是越靠前越好,而是卡在“刚好能吞下最大传播延迟”和“留给漂移足够余量”之间的黄金点。
4.6 采样点配置的避坑指南
- 别直接用厂商给的示例值。 我试过一个ST的例程,采样点设在70%,当时以为够用,结果客户加了隔离中继后直接通信失败。后来改为78%就好了。
- 别忘了二次采样。 CAN FD控制器在采样点之后还会再做一次“二次采样”,用来过滤毛刺。二次采样的位置通常是采样点后一个Tq,这个细节很容易忽略,但会影响实际判决。
- 同步段不能动。 SSP永远固定为1个Tq,你别手欠去改它。
- 用示波器验证。 配置完采样点后,我习惯抓一发数据帧,看采样点对齐的位置。如果看到采样点落在跳变沿附近,立刻调TSEG1/TSEG2。
这张图把位时间各段和采样点的关系画清楚了。你看,SSP固定,TSEG1吃掉传播延迟,采样点定在TSEG1尾巴,TSEG2留足余量对抗漂移。时钟偏快时,实际采样点相对于位周期前移了(红色箭头向左),但还在绿区,就没问题;偏慢时后移,只要不超出TSEG2边界,照样能正确采样。
说到底,采样点配置就是权衡传播延迟和时钟漂移这两件事。我建议各位在写CAN FD驱动程序时,把采样点计算作为一个独立函数,每次修改波特率或者更换晶振后都重新算一遍。花十分钟算清楚,省得后面排错排到怀疑人生。