4、CAN总线采样点:采样点位置计算、影响采样点的因素、如何配置采样点

大家好,我是老张。今天咱们聊聊CAN总线里一个特别关键、但又容易被忽视的参数——采样点

说实话,我见过不少工程师,CAN通信调不通,第一反应就是查硬件、查终端电阻、查波特率。折腾半天,最后发现是采样点没配好。嗯,这坑我踩过不止一次。

4.1 什么是采样点?为什么它这么重要?

简单说,采样点就是CAN控制器在接收一个数据位时,决定“读这个位是0还是1”的那个时间点。

你想想看,CAN总线上的信号不是完美的方波。它有上升沿、下降沿,有振铃,有干扰。控制器不能一上来就采样,得等信号稳定了再读。这个“稳定后读取的时刻”,就是采样点。

我个人习惯把采样点理解成“最佳观测窗口”。窗口开早了,信号还没稳定,容易误判。窗口开晚了,留给下一个位的同步时间就不够了,容易丢帧。

核心结论:采样点位置不对,轻则误码率升高,重则整个网络瘫痪。尤其是在高波特率、长距离通信时,采样点就是命门。

4.2 采样点位置怎么算?

CAN总线的一个位时间,被分成了四段:

  • 同步段(Sync_Seg):固定为1个Tq(时间量子)。用于同步总线上的各个节点。
  • 传播段(Prop_Seg):补偿物理延迟。包括总线传输延迟、收发器延迟等。
  • 相位缓冲段1(Phase_Seg1):用于补偿边沿相位误差。采样点就在它的末尾。
  • 相位缓冲段2(Phase_Seg2):采样点之后的时间段,用于重新同步。

采样点的位置,用公式表示就是:

采样点位置(%) = (Sync_Seg + Prop_Seg + Phase_Seg1) / (Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2) × 100%

说白了,就是采样点之前的时间,除以整个位时间。

举个例子。假设我们配置了:

  • Sync_Seg = 1 Tq
  • Prop_Seg = 3 Tq
  • Phase_Seg1 = 3 Tq
  • Phase_Seg2 = 3 Tq

那么总位时间 = 1 + 3 + 3 + 3 = 10 Tq。

采样点位置 = (1 + 3 + 3) / 10 = 70%。

嗯,70%是一个比较常见的配置。但具体用多少,得看你的网络情况。

4.3 影响采样点的因素有哪些?

我在项目中遇到过好几次,同样的代码,换了一批节点,通信就不稳定了。为什么?因为采样点受太多因素影响了。

主要有这么几个:

  1. 波特率:波特率越高,每个位的时间越短。Tq的数量就受限。比如1Mbps的波特率,位时间只有1微秒,你分不了几个Tq。采样点的调整空间就很小。
  2. 总线长度:总线越长,传播延迟越大。Prop_Seg就得设大一些。否则信号还没传到远端,你就采样了,读到的肯定是错的。
  3. 振荡器精度:每个节点的晶振都有误差。如果晶振不准,相位误差就会累积。Phase_Seg1和Phase_Seg2就是用来吸收这个误差的。误差越大,这两个段就得留得越宽。
  4. 收发器延迟:不同厂家的CAN收发器,延迟不一样。有些快,有些慢。这也会影响Prop_Seg的设定。

注意:我曾经在一个项目里,用了两种不同品牌的收发器。结果发现,同样的采样点配置,一种收发器跑得稳稳的,另一种却频繁报错。后来一查,是收发器的环路延迟差了将近100ns。所以,混用收发器时,采样点一定要重新算。

4.4 如何配置采样点?

配置采样点,说白了就是调整上面那四个段的比例。我一般按以下步骤来:

4.4.1 确定目标采样点位置

行业里有个不成文的规矩:

  • 低速CAN(125kbps以下):采样点建议在70% ~ 80%之间。
  • 高速CAN(250kbps以上):采样点建议在75% ~ 87.5%之间。
  • CAN FD:采样点通常推荐在80% ~ 85%

我个人习惯,对于常规的500kbps CAN,直接设到80%。稳得很。

4.4.2 计算Tq数量和段分配

假设我们要配置500kbps,晶振是8MHz,预分频器设为2。那么:

Tq = 2 × (1 / 8MHz) = 250ns
位时间 = 1 / 500kbps = 2000ns
Tq数量 = 2000ns / 250ns = 8 Tq

只有8个Tq,分配起来就比较紧张。我可能会这样分:

  • Sync_Seg = 1 Tq
  • Prop_Seg = 2 Tq
  • Phase_Seg1 = 3 Tq
  • Phase_Seg2 = 2 Tq

采样点 = (1+2+3)/8 = 75%。嗯,勉强可以。

4.4.3 用工具验证

别光靠手算。我建议用CAN配置工具(比如STM32CubeMX、TI的CCS、或者Vector的CANoe)来模拟。这些工具能直接算出采样点百分比,还能帮你检查有没有违反CAN协议的限制。

小技巧:如果你用的是SJA1000这类经典控制器,它的寄存器配置比较死板。我建议先算出理想的Tq数量和段分配,再反推寄存器值。别直接填寄存器,容易算错。

4.4.4 实际测试

配置完了,别急着量产。先跑一跑压力测试。我常用的方法:

  • 发大量数据帧,看有没有错误帧。
  • 用CAN示波器抓波形,看采样点是不是落在信号稳定区。
  • 故意把总线拉长一点,或者加一些干扰,看系统能不能扛住。

嗯,这里要注意。采样点不是一成不变的。如果你的网络环境变了(比如加了新节点、换了线缆),最好重新评估一下采样点配置。

4.5 总结一下

采样点这东西,说难不难,说简单也不简单。它不像波特率那样直观,但它的影响是实实在在的。

我个人的经验是:采样点配置,宁可偏后,不要偏前。偏后了,顶多是同步裕量小一点。偏前了,信号没稳定就读,误码率直接飙升。

好了,这一章就到这里。下一章咱们聊聊CAN总线的错误处理机制,那个也挺有意思的。