位时间基本概念:位时间、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怎么穿插进去。一目了然。
你看,上面这张图里,从同步段到相位缓冲段2,每个Tq跑好自己的角色。采样点就在Phase_Seg1结束时被打下。我建议大家在设计时,先画一个这样的时间轴,填好每段的Tq数,再确定采样点比例,这样不容易漏掉什么。
最后总结一下:位时间是骨架,Tq是砖块,四段结构是分区,采样点是关键一步。这四个概念的相互关系理解了,后续的位定时配置就变成了一道填空题,填对数字就能跑通。但如果概念模糊,填出来的数字就会让总线出各种奇怪问题。
我在很多项目里反复验证过,花15分钟把Tq和段长算清楚,能省下后面3天的调试时间。请记住这条经验。