目录
收起
0 CAN通讯回读机制
1 什么是采样点 sample point
2 什么是 Transceiver delay compensation(收发器延时补偿)
2.1 背景-通讯回环检测
2.2 CANFD高速通讯特有问题
2.3 什么是SSP (Secondary Sample Point)
3 什么是错误帧
3.1 位填充原则
3.2 错误帧的种类
3.3 节点错误状态
3.4 错误状态的转换
3.3 错误帧的发送
CAN通讯进阶- 错误帧/SSP/SJW/Tseg/Tq/Transceiver delay compensation
CAN通信中多次提到的回读机制,指的是节点在向总线上发送报文的过程中,同时也对总线上的二进制位进行“回读”。通过这种机制,节点就可以判断出本节点发出的二进制位与总线上的二进制位是否一致。
假如传输速率为2Mb/s,1s=10^9ns,2Mb=2*10^6bit,则一个bit时间Tb=500ns。
在Vector的配置工具中,定义Prop+Seg1 =?TSeg1, Seg2 =?TSeg2。
采样点:读取总线电平的时刻,并将读到的电平作为位值的点。位置在TSeg1结束处。
比如采样点为80%,意思是(同步段(1) +?TSeg1)/(同步段+Tseg1+Tseg2) = 80%。
Sync Seg(同步段):长度固定为1Tq
举个例子:
如果一个BitTime中Tq总和固定了,比如为10个Tq,即同步段(1) + TSeg1 + TSeg2 = 10,其中TSeg1=7, TSeg2 =2,则采样点为(1+7)/(1+7+2)=80%。
延长/缩短TSeg段来达到同步:Prop和TSeg1段小,而TSeg2加大时,采样点前移;Prop+TSeg1段大,而TSeg2减小时,采样点后移。
SJW (reSynchronization Jump Width):重新同步补偿宽度,即在重新同步的时候,TSeg1和TSeg2段的允许加长或缩短的时间长度,SJW加大后允许误差加大,但通信速率下降。SJW为补偿此误差的最大值(即每一次误差补偿都不能超过这个值,1~4Tq)。
CAN控制器会将收发器RX pin的数据采样接收,用于判断TX pin的数据是否被成功发送,以便实现冲裁判断和错误处理。RX的回环检测是保证CAN总线可靠性的基础技术。
但是,CAN收发器的信号转换都是有时延的,也就是说从TX出发到达CAN bus,以及从CAN bus返回RX都是延时的。不管是PCA82C251/ TJA1050这类1Mb/s的收发器还是TJA1044可达5Mb/s的型号延时参数差异都不大, tonRXD在50ns左右,toffRXD在90ns左右。按max值算最大可以到200+ns。
按200ns的延时进行考虑:也就是说TX发出的波形,RX回环接收到会延迟200ns。
按1Mb/s的情况。
一个bit时间Tb=1000ns。200ns的延时会导致RX采样的波形落后20%。 按典型的87%的采样率计算,实际上RX loop采样的位置是在67%。RX采样的裕度还是比较大的。
这也解释了为什么要选取75%~87%这样靠后的采样位置。这样TX->RX信号延时后,依然能保证控制器采样到正确的数据。
但是,CANFD数据段支持可变速率,最高可达12Mb/s。
以10Mb/s的数据段高速波特率计算,一个bit位周期Tb=100ns。
200ns的RX delay将会带来毁灭性的采样错误,由于收发器本身的延时,TX->RX收到的波形可能已经落后超过一个Tb(100ns),无论如何设置采样位置都无返挽回如此大的信号延时将TX和RX对应。
所以CANFD的标准给出了一个解决办法:Transceiver delay compensation(收发器延时补偿)。
基于以上原因,给RX定义了一个新的采样点SSP (Secondary Sample Point)。
要求控制器需要在仲裁段(<=1Mb/s)段测量下降沿的RX delay时间,然后在发送数据段对RX采样时,对RX采样点进行延时。
也就是说,在CANFD高速波特率发送的情况下,采样RX loop的采样点会推迟一段时间。具体推迟的时间通过仲裁段的下降沿delay来测量。
之后数据段RX采样的情况修可以被修复,如下:
在发送和接收报文时,总线上的节点如果检测出了错误,那么该节点就会发送错误帧,通知总线上的节点,自己出错了。
错误帧由错误标志和错误界定符两个部分组成。
主动错误标志:6个连续的显性位;
被动错误标志:6个连续的隐性位;
错误界定符:8个连续的隐性位。
可以看到在错误标志之后还有0~6位的错误标志重叠,这一段最低有0个位,最多有6个位。
在了解CAN总线中的错误检测之前,首先需要了解什么是位填充。
CAN协议中规定,当相同极性的电平持续五位时,则添加一个极性相反的位。
对于发送节点:相同极性的电平如果持续5位,那么在下一个位插入一个与之前5位反型的电平;
对于接收节点:相同极性的电平如果持续5位,那么需要删除下一位再接收。
在CAN总线通信中,一共有五种错误:位错误、ACK错误、填充错误、CRC错误、格式错误。
位错误(Bit Check Error)
节点将自己发送到总线上的电平与同时从总线上回读到的电平进行比较,如果发现二者不一致,那么这个节点就会检测出一个位错误。
实际上所谓“发出的电平与从总线上回读的电平不一致”,指的就是节点向总线发出隐性位,却从总线上回读到显性位或者节点向总线发出显性位,却从总线上回读到隐性位这两种情况。
Tips: 有三种例外情况不属于位错误:
在仲裁区,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示该节点仲裁失败;
在ACK槽,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示,该节点当前发送的这一帧报文至少被一个其它节点正确接收;
该节点发送被动错误标志,节点Node_A向总线发送连续六个隐性位(被动错误标志)却回读到显性位,不认为是位错误。因为被动错误标志是六个连续的隐性位,所以在总线上按照线与机制,有可能这六个连续隐性位被其它节点发送的显性电平“吃掉”;
ACK错误(Acknowledgment Error)
按照CAN协议的规定,在一帧报文(数据帧或者遥控帧)发出之后,如果接收节点Node_B成功接收了该帧报文,那么接收节点Node_B就要在该帧报文ACK槽对应的时间段内向总线上发送一个显性位来应答发送节点Node_A。这样发送节点Node_A就会在ACK槽时间段内从总线上回读到一个显性位。因此:
当发送节点Node_A在ACK槽时间段内没有回读到显性位,那么发送节点Node_A就会检测到一个ACK应答错误。这表示没有一个节点成功接收该帧报文。
填充错误(Fill Error)
在需要执行位填充原则的帧段(数据帧遥控帧的SOF~CRC序列),检测到连续六个同性位,则检测到一个填充错误。
CRC错误
发送节点Node_A在发送数据帧或者遥控帧时,会计算出该帧报文的CRC序列。接收节点Node_B在接收报文时也会执行相同的CRC算法,如果接收节点Node_B计算出的CRC序列值与发送节点Node_A发来的CRC序列值不一致,那么接收节点就检测到一个CRC错误。
格式错误
在一帧报文发送时,如果在必须发送预定值的区域内检测到了非法值,那么就检测到一个格式错误。
CAN报文中,有预定值的区域包括:
按照CAN协议的规定,CAN总线上的节点始终处于以下三种状态之一。
-主动错误状态
-被动错误状态
- 关闭状态
当满足一定的条件时,节点可以从一种状态转换为另外一种状态。
1)主动错误状态
节点处于主动错误状态可以正常通信;
处于主动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出主动错误标志。
2)被动错误状态
节点处于被动错误状态可以正常通信;
处于被动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出被动错误标志。
注意:这里说处于主动错误状态或被动错误状态的节点仍然可以正常通信,这里的正常通信指的是:节点仍然能够从总线上接收报文,也能够竞争总线获胜后向总线上发送报文。但是不代表接收的报文一定正确也不代表一定能正确的发送报文。
3)总线关闭状态
节点处于总线关闭状态,那么该节点不能收发报文;
处于总线关闭状态的节点,只能一直等待,在满足一定条件的时候,再次进入到主动错误状态。
处于主动错误状态的节点在检测到错误时会发送带有主动错误标志的错误帧;处于被动错误状态的节点在检测到错误时会发送带有被动错误标志的错误帧。
根据CAN协议的规定,在CAN节点内,有两个计数器:发送错误计数器(TEC)和接收错误计数器(REC)。
注意:这两个计数器计得不是收发报文的数量,也不是收发错误帧的数量。TEC和RCE计数值的变化,是根据下表的规定来进行的。
CAN节点错误状态的转换,就是基于这两个计数器来进行的。
1) 主动错误状态
最开始TCE和REC都小于127时,就处于主动错误状态。
在这一状态下,节点检测到一个错误就会发送带有主动错误标志的错误帧,因为主动错误标志是连续六个显性位,所以这个时候主动错误标志将会“覆盖”掉总线上其它节点的发送,而之前在CAN总线上传输的报文就被这“六个连续显性位”破坏掉了。
如果发出主动错误帧的节点是发送节点,这个情况下就相当于广播:“刚刚发送的那一帧报文我发错了,现在我破坏掉它(发送主动错误帧),你们不管收到什么都不算数”;
如果发出主动错误帧的节点是接收节点,这个情况就相当于广播:“刚刚我收报文的时候发现了错误,不管你们有没有发现这个错误,我现在主动站出来告诉大家这个错误,并把这一帧报文破坏掉(发送主动错误帧),刚才你们收到的东西不管对错都不算数了”;
Tips: 处于主动错误状态,说明这个节点目前是比较可靠的,出现错误的原因可能不是它本身的问题,即刚刚检测到的错误可能不仅仅只有它自己遇到,正是因为这一点,整个总线才相信它报告的错误,允许它破坏掉发送中的报文,也就是将这一次的发送作废。
2)被动错误状态
如果某个节点发送错误帧的次数较多,必将使得TCE>127 或者 REC>127,那么该节点就处于被动错误状态。
在这一状态下,节点Node_A检测到一个错误就会发送带有被动错误标志的错误帧,因为被动错误标志是连续六个隐性位,所以这个时候总线上正在传输的报文位流不会受到该被动错误帧的影响,其它的节点该发送的发送,该接收的接收,没人搭理这个发送被动错误帧的节点Node_A。
如果发出被动错误帧的节点Node_A为报文的发送节点,那么在发送被动错误帧之后,刚刚正在发送的报文被破坏,并且Node_A不能在错误帧之后随着连续发送刚刚发送失败的那个报文。随之而来的是帧间隔,并且连带着8位隐性位的 “延迟传送” 段;这样总线电平就呈现出连续11位隐性位,总线上的其它节点就能判定总线处于空闲状态,就能参与总线竞争 。此时如果Node_A能够竞争成功,那么它就能接着发送,如果竞争不能成功,那么就接着等待下一次竞争。这种机制的目的正是为了让其它正常节点(处于主动错误的节点)优先使用总线。
Tips: 处于被动错误状态,说明这个节点目前是不太可靠的,出现错误的原因可能是它本身的问题,即刚刚检测到的错误可能仅仅只有它自己遇到,正是因为这一点,整个总线才不信任它报告的错误,从而只允许它发送六个连续的隐性位,这样它才不会拖累别人。
3)总线关闭状态
如果一个处于被动错误状态的节点,仍然多次发送被动错误帧,那么势必导致TEC > 255,这样就处于总线关闭状态。
在总线关闭状态下的节点Node_A不能向总线上发送报文,也不能从总线上接收报文,整个节点脱离总线。等到检测到128次11个连续的隐性位时,TEC和REC置0,重新回到主动错误状态。
在检测到错误之后,什么时候发送错误帧呢?
按照CAN协议的规定:
位错误、填充错误、格式错误、ACK错误。 在错误产生的那一位的下一位开始发送错误帧。
CRC错误 紧随ACK界定符后的位发送错误帧
例1:
(1)发送节点Node_A发送一个显性位,但是却从总线上听到一个隐形位,于是Node_A节点就会检测到一个位错误;
(2)Node_A检测到位错误之后,立即在下一位开始发送主动错误帧:6个连续显性位的主动错误标志+8个连续隐性位的错误界定符;
(3)对应Node_A发出的主动错误标志,总线上电平为6个连续显性位;
(4)接收节点Node_B和Node_C从总线上听到连续6个显性位,那么就会检测到一个填充错误,于是这两个节点都会发送主动错误帧;
(5)对应Node_B和Node_C发出的主动错误标志,总线电平又有6个连续显性电平,对应Node_B和Node_C发出的错误界定符,总线电平有8个连续的隐性电平。
(6)在间歇场之后,Node_A节点重新发送刚刚出错的报文。
例2:
(1) 假设发送节点处于被动错误状态,接收节点处于主动错误状态
(2) 当发送节点监控到总线上的位数值与发送的位数值不一致时,检测为位错误,并发送被动错误标志 (6个连续的隐性位)
(3) 接收节点接收到发送节点发送的6个连续的隐性位时,会检测为位填充错误,并会发送主动错误标志
(4) 发送节点发送完被动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误界定符(8个连续的隐性位)
(5) 接收节点发送完主动错误标志后,开始监控总线上是否为隐性位,当总线为隐性位时,开始发送错误界定符(8个连续的隐性位)