3.3 过载帧
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志(6个位的显性位)和过载界定符(8个位的隐性位)构成。过载界定符的构成与错误界定符的构成相同。过载帧的构成如下图所示。
引自[4]
对于过载帧的帧结构我们可以这样理解:接收节点达到接收极限时,就会发出过载帧到总线上,显然,过载标志的6个连续显性位会屏蔽掉总线上其它节点的发送,也就是说这个时候的接收节点通过发送过载帧的方式来破坏其它节点的发送,这样在接收节点发送过载帧期间,其它节点就不能成功发送报文,于是就相当于把其它节点的发送推迟了,也就是说接收节点在其发送过载帧的这段时间得以“休息”。
有3种情况会引起过载帧:
- 接收节点自身原因。接收节点由于某种原因需要延迟接收下一个数据帧或者遥控帧。
- 在帧间隔的间歇段的第一位和第二位检测到一个显性位(正常的间歇段都是隐性位)。帧间隔的间隔段本应是三个连续的隐性位,如果接收节点在间隔段检测到显性位,那么就意味着此时有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。
- CAN节点在错误界定符或过载界定符的第八位(最后一位)听到一个显性位0,节点会发送一个过载帧,且错误计数器不会增加。接收节点在错误界定符和过载界定符的最后一位听到显性位,也意味着有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。
3.4 帧间隔
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间隔。
引自[4]
针对上图,间隔为3个位的隐性位;总线空闲为隐性电平,无长度限制(0亦可);延迟传送为8个位的隐性位,只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。这里为什么需要延迟传送段呢?
首先,考虑主动错误状态的节点A,发送主动错误标志之后,随之就要重新发送刚刚发送失败的报文,但是为了间隔开与前面刚刚发送的错误帧,总线在错误帧之后就会插入3个隐形位的帧间隔,在这3个隐形位期间,其它的节点不足以判定总线空闲(需要连续11个隐性位才能判定),所以节点A仍然占据着总线的控制权,于是在帧间隔之后,节点A能够接着发送报文。现在节点A转入到被动错误状态了,说明它已经不是很可靠了,这个时候如果没有延迟传送段,在节点A发出被动错误标志之后,它仍然能够在3位的帧间隔之后立即重新发送报文,这是不符合我们对被动错误状态的处理要求的当然也是不符合CAN协议的,于是乎对于发送出被动错误标志的节点,总线在帧间隔中加入了8个连续隐性位的延迟传送段,这样的3+8=11个连续隐性位。就能让节点A在这个帧间隔期间失去对总线的控制权,从而优先保证其它正常(处于主动错误状态)节点能够使用总线,而不必等着一个已经不可靠的节点A占据总线。
到此CAN协议帧结构就基本介绍完了,下面综上所述来分析下具体的总线仲裁:
第4部分 总线仲裁
基于上节的仲裁段和控制段,这里主要考虑几种情况的仲裁:假设一条CAN总线上有两个节点Node_A和Node_B。在总线空闲时,总线上为隐性电平,就在这个时候Node_A 和 Node_B 这两个节点同时向总线上发送数据,如下图,其中,Tx表示发送,Rx表示接收,也就是说每个节点都有发送与接收。
当作为发送方的节点会去接收自己发送的内容进行检查,即回读机制(节点在向总线上发送报文的过程中,同时也对总线上的二进制位进行“回读”,对比该节点发出的二进制位与总线上当前的二进制位是否一致,就可节点数据是否被正确接收。)
图26 仲裁过程(引自[3])
情况1:仲裁在前11位ID就结束 ,如上图。
从D28-D18,采用线与机制,逐位进行比较,一旦某位出现不同,上图的ID25,则显性位覆盖隐性位,仲裁结束,显性位的对应节点胜出,上图的Node_A。
情况2:仲裁在前11位ID未结束,即说明前11位ID相同
在这种情况下,我们就需要回顾一下前面的一个表:
根据这个表,我们可以进一步分为4种情况:
- 标准格式的数据帧与遥控帧,看RTR位,数据帧的RTR位恒为显性,遥控帧的RTR位恒为隐性。故前11位ID号相同时,标准数据帧优先级高于标准遥控帧。
- 扩展格式的数据帧与遥控帧,在前11位ID和后18位ID全相同的情况,与上条一致。
- 数据帧的标准格式与扩展格式,比较标准格式的RTR位与扩展格式的SRR位,标准格式的RTR位恒为显性,扩展格式的SRR位恒为隐性。故前11位ID号相同时,标准数据帧优先级高于扩展数据帧。
- 遥控帧的标准格式与扩展格式,看IDE位,扩展格式的IDE位恒为隐性,标准格式的IDE位在控制段,恒为显性。故前11位ID号相同时,标准遥控帧优先级高于扩展遥控帧。
通过上述分析,我们可以知道在前11位ID号相同时,根据协议设定的RTR, SRR, IDE,就可以保证如下:
- RTR:保证数据帧优先级高于遥控帧;
- SRR :保证标准数据帧的优先级高于扩展数据帧;
- IDE :保证标准遥控帧的优先级高于扩展遥控帧。
第5部分 报文过滤
在CAN总线中没有地址的概念,CAN总线是通过报文ID来实现收发数据的。CAN节点上都会有一个验收滤波ID表,其位于CAN节点的验收滤波器中,如果总线上的报文的ID号在某个节点的验收滤波ID表中,那么这一帧报文就能通过该节点验收滤波器的验收,该节点就会接收这一帧报文。假设有设置:
可看报文过滤过程如下图示意:
图27 报文发送到接收的过程
关于报文过滤具体如何实现,后续将会写相关文章。
第6部分 数据传输同步
6.1 位速率概念
位速率(也叫做比特率)表示的是单位时间内,总线上传输的信息量,即每秒能够传输的二进制位的数量,R=1/T ,单位是bit per second。比如比特率为8bit/s,意思为一秒传输了8bit,包含了8个二进制事件的信息量。注意位速率与波特率不是同一概念。
摘自:zhuanlan.zhihu.com/p/10 实际传输中,传输速率以 每秒发送的符号(baud)数量进行计算, 即波特率。 当一个符号只包含两种可能,即一个事件两种可能,那么此时1baud=1bit。此时波特率等于比特率。一个符号也有可能包含多个可能,例2中,一个符号中包含四个电平,那么接受端的一个事件,有了abcd四种可能,那么1baud=2bit。此时波特率为比特率的两倍。
6.2 位时序
第3部分讲到帧结构,我们知道每一帧数据(即一个完整的数据帧)有很多位组成,当发送方发送一帧数据到总线时,接收方怎么准确接收到这帧数据呢?实际采用逐位逐位地接收数据。
引自[3]
具体来说,将一个位分为4段,如上图所示。这些段又由可称为Time Quantum(以下称为Tq)的最小时间单位构成。1位分为4个段,每个段又由若干个Tq构成,这称为位时序。1位由多少个Tq构成,每个段又由多少个Tq构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和Tq数如下表:
引自[4]
所谓采样点是读取总线电平,并将读到的电平作为位值的点,位置在PBS1结束处。
CAN协议的通信方法为NRZ方式,各个位的开头或者结尾都没有附加同步信号。发送单元以与位时序同步的方式开始发送数据。另外,接收单元根据总线上电平的变化进行同步并进行接收工作。但是,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆/驱动器等)相位延迟会引起同步偏差,因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。
6.3 硬同步
在总线空闲状态,接收节点检测出帧起始(SOF位)时,会调整当前位的同步段,调整宽度不限。如下图假设这时检测的时SOF位。
那么硬同步简单说就是接收节点直接与发送节点同步(真有硬的味道),如下:
引自[3]
具体解释引自[3]: 1)发送节点Node_A在发送SOF位时,SOF位的下降沿在SS段; 2)这个时候接收节点Node_B发现自己当前位的SS段和发送节点SOF位的SS段不同步。也就是说当Node_A 产生SOF位SS段时,Node_B的当前位的SS段已经在5个Tq之前产生了; 3)于是接收节点Node_B强行将自己当前位的SS段拉到与SOF位的SS段同步。
6.4 再同步
接收节点检测出除SOF位以外的其他位时,进行的同步调整。重同步会通过加长PSB1段,或缩短PBS2段来调整同步,以保证采样点的准确。
对于再同步,需一个概念SJW(同步跳转宽度),是指PSB1和PSB2再同步时允许跳转的最大宽度,其必须满足以下2个条件:
- SJW必须小于PBS1和PBS2的最小值;
- SJW最大值不能超过4。
下面看一下再同步的两种情况:
情况1:PSB1段加长(发的晚,收的早)
引自[3]
具体解释引自[3]: 1)发送节点Node_A比接收节点Node_B的时间慢了,也就是说Node_A当前位的ss段产生的时候,Node_B 当前位的ss段已经在2个Tq之前产生了; 2)所以这个时候接收节点Node_B就将PBS1延长2个Tq的时间; 3)于是这个时候Node_A当前位的采样点就和Node_B的采样点同步了。
情况2:PSB2段缩短(发的早,收的晚)
引自[3]
具体解释引自[3]: 1)发送节点Node_A当前位的SS段诞生2Tq时长之后,接收节点Node_B的当前位才产生SS段; 2)于是,接收节点Node_B当前位的PBS2段缩短, 3)这样就会导致接收节点Node_B的下一位能够提前2个Tq,从而Node_B的下一位采样点和Node_A下一位 的采样点能够同步。
6.5 调整同步的规则
硬件同步和再同步遵从如下规则。 1) 1 个位中只进行一次同步调整。 2) 只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。 3) 在总线空闲且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。 4) 在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件(1)和(2),将进行再同步。 但还要满足下面条件。 5) 发送单元观测到自身输出的显性电平有延迟时不进行再同步。 6) 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。
第7部分 位时间实例
本部分将根据Infineon的芯片手册对位时间如何计算和如何配置位时间的寄存器进行说明。
假设我们有一条需求:设置CAN通讯的波特率为500KBaud。
7.1 计算
Infineon芯片手册提供的CAN总线位时间标准格式定义如下图,后面根据该定义进行求解。
CAN总线位时间标准
设:晶振时钟周期频率为40MHz,转换为时间表示则为T=1/40MHz=25ns
NBT=16(即一个位有16个tq,time quantum),
因为要设置的波特率为500KBaud,换算时间表示则为1/500KBaud =2000ns,即传输一个位的时间要2000ns。那意味着16个tq就等于2000ns,即tq=125ns。
又因为有:
所以:tq/T=125ns/25ns=5,因为BRP只能为整数,这时取DIV8=0, BRP=4。
我们已经NBT=16,假设我们采样点取在50%处,即有:
50%=Tseg2/NBT=[(TSEG2+1)tq]/16*tq=(TSEG2+1)/16
即有:TSEG2=7。
那么Tseg1= NBT-Tseg2-Tsync=7tq,所以TSEG1=6。
再根据下式计算SJW, 这里直接假设TSJW=3*tq能保证下式两个不等式成立(不在此处展开Tprope的讨论),那么SJW=2。
综上有:DIV8=0, BRP=4,TSEG1=6,TSEG2=7,SJW=2。
7.2 寄存器配置
根据上节的计算结果进行位时间寄存器的配置,关于该寄存器的内容以及配置信息见下图。
位时间寄存器说明
经过上述配置,我们成功设置了CAN通讯的波特率为500KBaud。
7.3 补充:传输延迟时间tPTS
CAN报文在CAN总线上的传输时,物理延迟包含两个部分:
- 在CAN-BUS上传输造成的延迟
- 在节点上传输造成延迟
按照CAN通信协议的规定,补偿给传播延迟的时间长度要至少等于实际实际传播延迟时长的2倍,即:tPTS≥2×tdel=2×(tdel+tBus)
注意:在CAN总线通信系统中是以时间量子Tq来度量时间的,所以如果延迟补偿时间tPTS = 3.1Tq,那么这个时候要取:tPTS = 4Tq。