NXP MCU CAN波特率(位时间)配置详解

8 篇文章 87 订阅

1. 概述

本文将会详细讲解如何设置NXP MCU的CAN波特率、位时间、采样点等属性。

波特率即CAN总线传输频率,位时间是波特率的倒数,例如波特率是500K,那么位时间 = 1 / 500000 = 0.000002s = 2000ns。

我们先来看一下S32K144单片机的EB中与CAN总线波特率相关的可配置参数有哪些:
在这里插入图片描述

下文会介绍每个参数的作用和如何进行配置。

本文的大多数内容都来自NXP官方应用手册《CAN Bit Timing Requirements》,下载链接

https://www.nxp.com/docs/en/application-note/AN1798.pdf

2. 一个位时间的构成

一个CAN数据位有以下四个段,采样点位于 PHASE_SEG1和 PHASE_SEG2的交界处。一个位时间(Tnbt)就等于四个段之和

在这里插入图片描述
每个段又包含若干个Tq(Time Quantum),Tq就是一个CAN外设时钟周期。如下图所示,系统时钟经过分频输入给CAN外设,分频系数可配置,每个段包含的Tq数量也可配置(同步段SYNC_SEG除外,固定为1个Tq)。
在这里插入图片描述
各个段包含的Tq数量要求如下表所示:
在这里插入图片描述
其中PHASE_SEG2段中引用了一个时间参数IPT(Information Processing Time ),通常情况下,IPT为2个Tq,但有两个特殊情况:

  • TOUCAN模块:当CAN外设始终频率等于系统时钟频率时(分频系数为1),IPT=3Tq。
  • MCAN模块:当采用3个采样点的时候,IPT=3Tq。

所以,PHASE_SEG2的Tq数量最小为2,如果PHASE_SEG1或IPT大于2,那么取二者之间的较大值。

3. 同步机制

总线上的每个节点在开始接收信号的时候都需要进行时间同步,因为不同节点间的时钟可能有少许差别。
同步方式有以下两种:

  • 硬件同步:仅发生在帧起始阶段的总线电平从隐性位向显性位转变的时刻。
  • 重同步:发生在CAN帧的后续传输过程中,如果在一个位时间段内的除了同步段的其它段上发生了隐性位到显性位的转变,节点就需要进行重同步。

硬件同步不需要过多解释,我们主要来说一下重同步的机制和作用。

理想状态下,两个节点的时钟完全同步,每个位信号应该像下图一样是对齐的:
在这里插入图片描述

但通常情况下两个节点的时钟可能出现偏差,可能出现如下图所示的状况:
在这里插入图片描述

节点B比节点A晚了4个Tq,B发送的信号位的同步段在A信号的同步段之后、采样点之前,这种情况下就可能会导致两个节点采样值不准,所以A要采取重同步来避免采样偏差,方法是增加 PHASE_SEG1 的长度,B晚了几个Tq,A的PHASE_SEG1 就增加几个Tq(在重同步限制范围内),结果如下:

在这里插入图片描述

这样就可以使得两个节点的采样点处于同一位置。

上面说的是B发的晚了的情况,还有下面这种B发的早了的情况:

在这里插入图片描述
当A的上一个位信号还没有发完的时候(采样点之后),就接到了B发送的新的位信号,这时A要进行重同步,是得两个节点的采样点尽可能接近。方法是缩短上一个位信号的PHASE_SEG2阶段,其实就是立即开始下一个位信号:
在这里插入图片描述
需要注意几点:

  • 重同步的Tq数量是有限制的,称为重同步跳变宽度(re-synchronisation jump width),记为RJWSJW。重同步跳变宽度最大不超过4,同时不能超过PHASE_SEG1的Tq数量,最小为1,在此范围内尽可能的选比较大的值。所以通常选择为4和PHASE_SEG1的Tq数量中的较小值。
  • 重同步只发生在隐性位向显性位的跳变沿。
  • CAN自带位填充策略,每出现5个连续的极性相同的位,就会填充一个极性相反的位。所以最恶劣情况下每10位会发生一次重同步(5个显性位+5个隐性位)。

4. 传播延迟

位时间中一个PROP_SEG - 传播延迟段(Propagation Delay Segment)

由于网络上的延迟(CAN收发器延迟和总线电平传输延迟),节点A发出的位信号需要经过一段时间之后才能到达节点B,反之亦然。总线上的两个节点有可能同时开始发送一帧报文,利用总线仲裁机制决定谁获取总线控制权,如下图所示:

在这里插入图片描述

T1时刻A开始发送一个位信号,经过总线延迟,在T6时刻到达B,延迟时间为Tprop(A,B);B在T2时刻开始发送一个位信号,此时因为A发送的信号还没有到达B,对于B来说总线仍处于空闲状态,所以可以发送报文。B发送的信号在T3时刻开始到达A,延迟时间为Tprop(B,A),因为节点需要在发送信号的同时回读总线电平,来判断自己是否获取总线控制权,所以要确保A回读总线信号(即采样点)时,B的信号已到达A。所以在传播延迟段不允许进行采样,这就是传播延迟段的作用。如果是单采样点,那么采样点应位于PHASE_SEG1和 PHASE_SEG2之间,如果是3个采样点,那么其余两个采样点应位于PHASE_SEG1的其它时刻。

在上图中,尽管B的采样点位于A发送的位信号的结束时间之后,但由于传播延迟,B依然可以正确回读到A发送的位信号。

传播延迟时间取决于两个节点CAN收发器的延迟和总线长度,即:

在这里插入图片描述
为了确保两个节点间通信采样正确,传播延迟段的时间应为:
在这里插入图片描述
当两个节点物理收发器电气特性相似时即为:
在这里插入图片描述
传播延迟段所包含的Tq数量PROP_SEG最小为:
在这里插入图片描述
其中 ROUND_UP()是向上取整。

5. 晶振容差(Oscillator Tolerance)

在这里插入图片描述
上面的公式中,Fn是标准频率,F是实际频率,δF是晶振容差。

在一个合格的CAN网络中,必须保证处于总线两端(距离最远)的两个节点在拥有最恶劣晶振容差的情况下能够正常通信,即每次采样都可以采到正确值。

在上述两个节点的正常通信过程中,晶振容差的需求如下列公式所示:

在这里插入图片描述
2*δF代表两个节点的晶振差别分别处于两个极端,乘10是因为最恶劣情况下是10个位信号会进行一次重同步,再乘以一个位时间(Tnbt),就可以的带最恶劣情况下两个节点位信号的时间偏差,这个偏差要小于重同步最大允许时间Trjw。

除了上面正常通信的情况,还需要考虑总线出现error时候的状况。

在CAN总线中,如果一个节点A检测到一个内部错误(以填充错误为例,即连续检测到6个相同极性位),就会向总线发送一个Error Flag,Error Flag是6个显性位,总线上其它节点如果之前也检测到了总线填充错误,则会同时向总线发送Error Flag,这种情况称为全局错误;如果其它节点之前没有检测到填充错误,那么当节点A发送了Error Flag后,其它节点会检测到这个Error Flag,并紧跟着发送一个Error Flag作为回应,这种情况称为节点A本地错误

节点A可以通过自己发送完Error Flag后,总线上是否有其它节点发送Error Flag来判断是发生了全局错误还是本地错误。因此就要求节点A在连续6个显性位(Error Flag)后依然能够正确采样接下来的至少一个位信号。而出发Error Flag的错误情况可能是之前检测到了连续6个显性位,出现填充错误,这时节点A就会有6+6个位时间不能进行重同步,而下一个位信号的采样点位于PHASE_SEG1和PHASE_SEG2之间,因此可以得到下面的公式:
在这里插入图片描述

红框中的含义是12个位时间+下一个位时间的前3个段,即13个位时间减去最后一个段PHASE_SEG2。
左侧计算得到的是第13个位信号的采样点偏差时间,该时间要小于PHASE_SEG1和PHASE_SEG2中的较小值,才能保证采样点落在其它节点发送的第13个位信号的PHASE_SEG1和PHASE_SEG2上。

6. 位时间相关参数的计算步骤

(1)计算PROP_SEG段的最小时间

依据上文传播延迟段计算公式(8),先算出传播延迟段的最小允许时间。

(2)选择CAN外设频率

根据输入给CAN外设的系统始终频率,确定分频系数,使得CAN外设始终频率满足:每个位时间包含8~25个Tq。常用的两个值是8和16.

(3)计算PROP_SEG段包含的Tq数量

根据公式(9)计算出PROP_SEG段包含的Tq数量,如果数量超过8,那么返回步骤(2),选择更大的分频系数,使得CAN外设频率降低,Tq时间增长,以降低PROP_SEG段的Tq数量。

(4)确定PHASE_SEG1和PHASE_SEG2的Tq数量

根据上面的计算,我们可以得到每个位时间包含的Tq总数量,以及PROP_SEG段的Tq数量,我们还知道同步段SYNC_SEG固定为1个Tq,所以我们可以得到剩下了多少个Tq,留给PHASE_SEG1和PHASE_SEG2两个段,据此确定两段的Tq数量就可以了。

分为以下几种情况:

  • 如果剩余Tq数量小于3,由上文(第2节)我们可以知道PHASE_SEG1最小为1,PHASE_SEG2最小为2,因此该情况下不能满足要求,需要返回步骤(2)选择更大的CAN外设频率,增加总Tq数量。
  • 如果剩余Tq数量等于3,那么PHASE_SEG1为1,PHASE_SEG2为2,此时只能采用单个采样点。
  • 如果剩余Tq数量大于3且为奇数,那么给PROP_SEG段加一,剩余的均分给PHASE_SEG1和PHASE_SEG2。
  • 如果剩余数量大于3且为偶数,直接均分给PHASE_SEG1和PHASE_SEG2.

(5)确定RJW(SJW)的Tq数量

RJW取4和PHASE_SEG1中的较小值。

(6)计算晶振容差

依据公式(10)和(11)来计算晶振容差是否满足要求。

如果PHASE_SEG1 > 4,建议重新选择一个更大的CAN时钟分频系数,缩短Tq,否则会影响晶振容差。反之亦然:如果PHASE_SEG1 < 4,建议重新选择一个更小的CAN时钟分频系数,只要确保PROP_SEG ≤ 8即可。

  • 4
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老孟的孟不是很老的孟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值