位时间基本概念:位时间、Tq与时间段定义

你有没有想过,CAN总线上那串“1”和“0”,到底是怎么被准确读出来的?

说白了,每发送一个bit,总线上的电平需要稳定一段时间,接收节点在这段时间里的某个精确时刻去“咔嚓”采样一下。这个过程的每个细节,都跟位时间有关。

我刚开始学CAN FD时也觉得这些概念很绕,不就是发个数据嘛,搞这么复杂干嘛?直到调试时总线上莫名其妙出现错误帧,才意识到位时间的理解才是整个配置的基石。今天咱们就把它彻底讲清楚。

1. 位时间是什么?

一个bit在总线上占据的时长,就是位时间。CAN FD的标准数据速率可达8Mbps甚至更高,每位持续的时间非常短。位时间并不是一个单纯的“时长”,它被划分成若干段,目的是让所有节点都能在合适的时刻读到正确的电平值。

这里有个重要概念——位定时。它不是简单的时钟周期,而是为了补偿信号在总线上的传输延迟、节点的时钟偏差等因素。说白了,就是为了让整个网络步调一致。

位时间的核心理解:

  • 位时间 = 1 / 标称位速率
  • 例如:1Mbps速率下,位时间为1μs
  • 每位被离散化为整数个时间量子(Tq)

2. Tq——位时间的最小刻度

位时间再小,也不能无限细分。它是被一个个最小时间单位拼出来的,这个单位叫Tq(Time Quantum,时间量子)。我把Tq看作整个位定时的“原子钟”。

Tq是怎么来的?它来自系统时钟的分频。比如系统时钟40MHz,经过4分频,就是10MHz,对应的Tq就是100ns。嗯,这个关系一定要记清楚。

// 例:Tq计算
// 系统时钟频率 f_sys = 40MHz
// 分频因子 BRP = 4
// Tq = 2 * BRP / f_sys = 2 * 4 / 40MHz = 200ns

我个人习惯:先确定速率,再反推Tq和分频因子。这样不容易出现位时间长度和Tq个数的冲突。

每个位时间由一组整数个Tq组成。CAN FD的数据阶段速率高,就要求Tq个数尽量少,8到10个Tq是常见配置。为什么?因为Tq个数多了,单个Tq时长就短,对时钟精度要求更高,容易翻车。

我曾经在项目里为了追求极致的采样点位置,把Tq个数拉到20个,结果硬件时钟有一点抖动就出采样偏差……后来老老实实按协议推荐值配,世界清静了。

3. 位时间的四段结构

一个完整的位时间被划分为4个连续的时间段,它们各有分工。我把它比作一支接力队,每段负责不同的任务。

时间段 英文 主要作用
同步段 Sync_Seg 总线电平跳变沿检测,各节点时钟同步
传播段 Prop_Seg 补偿信号在总线上的物理延迟
相位缓冲段1 Phase_Seg1 采样前调整,补偿相位误差
相位缓冲段2 Phase_Seg2 采样后调整,预留处理时间

同步段:固定为1个Tq。为什么固定?因为这个时间段只做一件事——检测上升沿或下降沿。所有节点发现总线电平跳变,就以此为基准重新对齐自己的位时间。我的经验是,如果干扰严重,同步段越短越好,因为太长会占用其他段的资源,影响采样点位置。

传播段:就是用来“等人”的。想想看,发送节点在总线上拉电平,接收节点在另一端收到时已经有延迟。这段就是等信号完全传播到整个网络的。长度取决于总线长度和收发器延迟。我记得有次项目中用了30米线,传播段没调好,数据速率稍微一高就掉帧。

相位缓冲段1和2:这哥俩是“正负调节器”。Phase_Seg1是采样点之前的缓冲,Phase_Seg2是采样点之后的缓冲。它们长度可调,用于吸收时钟之间的微小偏差。你想想看,两个节点用各自的晶振,频率不可能完全一样,那采样时刻就靠这里的调整来实现同步。

我曾经踩过的坑:Phase_Seg2的设置有个下限,不能小于信息处理时间(IPT,每个控制器固定)。如果配小了,采样后没时间处理数据,就会丢失下一个同步窗口,导致连续错误帧。各位切记查阅芯片手册的IPT值。

4. 采样点位置

采样点是每个位时间内接收节点读取总线电平的时刻。它位于Phase_Seg1和Phase_Seg2的分界处。说白了,就是你在哪个百分比的位置按下“快门”。

采样点的计算公式很简单:

采样点位置(%) = (Sync_Seg + Prop_Seg + Phase_Seg1) / 整个位时间Tq数 × 100%

举个例子:要是位时间由10个Tq构成,同步段1Tq、传播段2Tq、相位段1是4Tq、相位段2是3Tq,那采样点就在(1+2+4)/10=70%的位置。CAN FD推荐的数据速率采样点一般在70%-80%左右。为什么?这个位置比较靠后,留给信号足够的时间稳定,但又不会过分靠近位末端,防止时钟抖动导致错位。

采样点配置口诀:

  • 同步段固定1个Tq
  • 传播段用来补偿延迟,越长越好(但别超过限额)
  • Phase_Seg1与Phase_Seg2之和决定了位时间总数
  • 采样点偏向位时间的后部更稳健

5. 同步机制对时间段的影响

大家可能已经注意到了,同步段、相位缓冲段不仅用于常规位定时,还承担着同步任务。CAN总线支持两种同步:硬同步和重同步。

  • 硬同步:在总线空闲后第一个下降沿发生,所有节点强制对齐到同步段起点。
  • 重同步:在正常通信中,发现边沿出现在相位缓冲段之外时,通过调整Phase_Seg1或Phase_Seg2的长度来补偿。

嗯,这里要注意:相位缓冲段不是无限可调的。调整范围由SJW(同步跳转宽度)参数控制。如果时钟偏差很大,SJW必须相应加大,但我个人不建议设太大,因为在调整过程中,位时间是被“压缩”或“拉伸”的,太激进反而引入误码。

下面这张图把刚才讲的知识点串起来了。你看看,一个位时间怎么切成Tq,各段放什么位置,采样点在哪,SJW怎么穿插进去。一目了然。

位时间结构图 一个位时间 = n 个 Tq Sync_Seg 1 Tq Prop_Seg 1-8 Tq Phase_Seg1 可调,含 SJW 调整部分 采样点 Phase_Seg2 IPT 约束 Tq刻度示例(10个Tq): SJW(同步跳转宽度)影响 Phase_Seg1 和 Phase_Seg2 的调节范围,最大不超过 Phase_Seg 长度 IPT(信息处理时间):采样完成后控制器处理数据所需的最小时间,通常为 2-3 Tq Phase_Seg2 配置长度必须 ≥ IPT,否则采样后来不及处理

你看,上面这张图里,从同步段到相位缓冲段2,每个Tq跑好自己的角色。采样点就在Phase_Seg1结束时被打下。我建议大家在设计时,先画一个这样的时间轴,填好每段的Tq数,再确定采样点比例,这样不容易漏掉什么。

最后总结一下:位时间是骨架,Tq是砖块,四段结构是分区,采样点是关键一步。这四个概念的相互关系理解了,后续的位定时配置就变成了一道填空题,填对数字就能跑通。但如果概念模糊,填出来的数字就会让总线出各种奇怪问题。

我在很多项目里反复验证过,花15分钟把Tq和段长算清楚,能省下后面3天的调试时间。请记住这条经验。