【总线】CAN总线

在工业和汽车上用的比较多一种通信总线技术。
汽车上很多电气部分,通过两根线连接,按照CAN通信的标准读写数据。
各个部分遵循同样的协议,每部分对应不同的ID号,以相同的波特率收发数据。
每帧数据包含0-8字节及ID及CRC校验码等,通信速度快,距离远,且可靠性高。
(SCI通信一次仅1字节,速度也不够高,采用奇偶校验码检测概率低,只适合可速度要求不高的短距离通信)


CAN总线介绍:
 
一文通透CAN总线相关知识(有SJA1000代码):
 

一、帧类型

帧类别包括:数据帧,遥控帧,过载帧,错误帧,间隔帧。
1、数据帧
用于发送节点将接收节点传送数据的帧
数据帧由7个不同的位场组成:帧起始、仲裁场、控制场、数据场、CRC场、应答场、帧结尾。数据场的长度可以为0。
 
2、远程帧
总线单元发出,与该远程帧具有相同ID的接收节点发出自己的数据。
远程帧由6个不同的位场组成:帧起始、仲裁场、控制场、CRC场、应答场、帧末尾。(没有数据场)
 
3、过载帧
当某个接收节点没有做好接收下一帧数据的准备时(接收报文的能力达到极限),将发送过载帧以通知发送节点。
 
4、错误帧
任何单元在检测出通信错误(如校验错误)时向其它节点通知错误的帧。
 
5、间隔帧
帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。
 

二、数据帧格式

数据帧构成:帧起始、仲裁段、控制段、数据段、CRC、ACK(应答场)、帧结束。
标准帧:
 
 
 
 
扩展帧:

 

 

1、帧起始

帧起始(SOF)标志着数据帧和远程帧的起始,标准帧和扩展帧都是由1个位的显性电平表示帧起始。

2、仲裁域

由标识符和RTR位组成,标准帧格式与扩展帧格式的仲裁域格式不同。
标准格式里,仲裁域由1l位标识符和RTR位组成。标识符位有ID28~ID18。
扩展帧格式里,仲裁域包括29位标识符、SRR位、IDE位、RTR位。其标识符有ID28~ID0。
 
标识符有优先级,越小,优先级越高。
对于扩展格式,IDE位属于仲裁场;对于标准格式,IDE位属于控制场。
 
仲裁域传输顺序为从最高位到最低位,其中最高7位不能全为零。
 
下面详细说一下扩展帧的仲裁段(对应下面两张图)。
(1)替代远程请求位SRR(Substitute Remote Request)
在扩展帧中,SRR恒为隐性位1,并且扩展帧的隐性SRR位正好对应标准帧的显性RTR位。
这就解释了SRR位的作用:在前11位ID号相同的情况下,标准数据帧的优先级高于扩展数据帧
 
在传输完11位标识符之后(扩展帧的后18位在最后发送,先发送11位标识符),轮到标准帧的RTR位和扩展帧的SRR位了。这时候,标准帧的RTR为显性,而扩展帧SRR为隐性,这样,总线自然就被标准帧占据。
 
(2)标志符扩展位IDE(Identifier Extension)
在扩展帧中恒为隐性1;
在标准帧中,IDE位于控制段,且恒为显性0。
且扩展帧IDE位和标准帧IDE位位置对应,这就保证了: 在前11位ID号相同的情况下,标准遥控帧的优先级一定高于扩展遥控帧

(3)远程发送请求位RTR(Remote TransmissionRequest)
在数据帧里必须为“显性 0”,而在远程帧里必须为“隐性 1”。
这么做的原因是保证数据帧优先级高于远程帧
  *灰色表示显性0

3、控制段

表示数据的字节数及保留位的段,由6个位构成,表示数据段的字节数。
标准帧:IDE,r0,DLC
扩展帧:r1,r0,DLC
 
在标准帧中,保留位r1表示为IDE位。
IDE位为显性,表示数据帧为标准格式;
IDE位为隐性,表示数据帧为扩展帧格式。
 
r0保留位必须发送为显性0。
 

4、数据段

数据的内容,一帧可发送0~8个字节的数据。
 

5、循环冗余码CRC场

 
CRC段检查帧的传输错误的段。接收方以同样的算法计算CRC值并进行比较,不一致时会通报错误。
CRC场包括CRC序列(CRC Sequence,15个位),其后是CRC界定符(CRC Delimiter,1个位(用于分隔的位)
CRC界定符是固定的1个隐性位1。
 
CRC在线计算(包含C语言实现)
 
例如:

 

 在网页中输入:

 

 

得到CRC = 0x3132

 
注意:
(1)CRC的值计算范围包括:帧起始、仲裁段、控制段、数据段
(2)计算并不包括因为5个连续相同电平而插入的Bit;
(3)

 

 C#实现:

       private void GetCRC(byte[] data)
        {
            int[] CRC = new int[15];
            //data = new byte[] { 0x01, 0x10, 0x04, 0x12, 0x34, 0x56, 0x78};
            for (int i = 0; i < data.Length; i++)
            {
                for (int j = 7; j >= 0; j--)
                {
                    int tmpbit = (data[i] >> j)&0x01;
                    int DoInvert = tmpbit ^ CRC[14];
                    CRC[14] = CRC[13] ^ DoInvert;
                    CRC[13] = CRC[12];
                    CRC[12] = CRC[11];
                    CRC[11] = CRC[10];
                    CRC[10] = CRC[9] ^ DoInvert;
                    CRC[9] = CRC[8];
                    CRC[8] = CRC[7] ^ DoInvert;
                    CRC[7] = CRC[6] ^ DoInvert;
                    CRC[6] = CRC[5];
                    CRC[5] = CRC[4];
                    CRC[4] = CRC[3] ^ DoInvert;
                    CRC[3] = CRC[2] ^ DoInvert;
                    CRC[2] = CRC[1];
                    CRC[1] = CRC[0];
                    CRC[0] = DoInvert;
                }
            }
            string crcstr = "";
            for (int j = 0; j < 15; j++)
            {
                crcstr += CRC[j].ToString();
            }
            crcstr = new string(crcstr.ToArray().Reverse().ToArray());//字符串转置
            crcstr = "0" + crcstr; //CRC15,最高位添0
        }

 

 

6、应答场

应答场长度为2个位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimiter),如图所示:
发送单元ACK段:发送2个隐性位1。
接收单元ACK段:既不处于总线关闭态也不处于休眠态的所有接收单元中接收到正常消息的单元,在ACK槽发送显性位,通知发送单元,正常接收结束。
正常消息是指:不含填充错误、格式错误、CRC错误的消息。
 

7、帧结束

表示数据帧结束的段。由7个“隐性”位组成。
 
 
标准帧格式:
 扩展帧格式:  

三、仲裁机制

明确两点:

(1)低波形代表0(显性),高波形代表1(隐性);
(2)当隐性碰到显性,就变为显性。

 
如图所示,节点A和节点B的标识符的第10、9、8 位电平相同,因此两个节点侦听到的信息和它们发出的信息相同。
第7位节点B发出一个“1”,但从节点上接收到的消息却是“0”。

因为A节点同时发出显性位,让总线也变成显性了,也就是0。
节点B会退出发送处于单纯监听方式而不发送数据。
节点A成功发送仲裁位从而获得总线的控制权,继而发送全部消息。
总线中的信号持续跟踪最后获得总线控制权发出的报文,本例中节点A的报文将被跟踪。

这种非破坏性位仲裁方法的优点在于,在网络最终确定哪个节点被传送前,报文的起始部分已经在网络中传输了,因此具有高优先级的节点的数据传输没有任何延时

 

传送节点在发送报文时监视总线,如果节点在自身发送隐性位时检测到显性位,它将立即退出仲裁过程并转变成接收方,并且不会在总线再次空闲之前发送报文,在这逐位的比较中,最终节点B因为第七位的偏差丢掉了总线,从此单纯监听,这就是仲裁机制。仲裁过程不会消耗时间。

无损仲裁方式:就是当两个或者以上的不同ID节点“同时”向总线发送数据时候,优先级最高的就能直接发送。在总线空闲态,最先开始发送消息的单元获得发送权。

 

四、硬件原理

1、引脚分布

 
 

2、终端电阻

在CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配,以减少回波反射。
 

3、总线电平

 

 

 

当CAN总线的两个差分线重合于1/2VCC时,此处以5V供电的CAN收发器为例说明,这个状态对应着逻辑数据的1,这称之为隐性状态电平,与此相反,当两个差分线的电压分离开来时,如上图中所示,CANH为3.5V,CANL为1.5V时,则逻辑数据为0,这称之为显性状态电平。
 

五、ISO 11519-2与ISO 11898-3之间的关系

CAN 协议经 ISO 标准化后有 ISO11898 标准和 ISO11519-2 标准两种。标准对于数据链路层的定义相同,物理层不同。
(1)ISO11898
是通信速度为 5kbps-1Mbps的 CAN 高速通信标准。高速CAN网络在每个网络端点端接一个120欧姆的电阻。
 
(2)ISO11519-2
是通信速度为 125kbps以下的 CAN 低速通信标准,也就是容错CAN(LSFT CAN)。提供从5 Kbit/s到125 Kbits/s的波特率。
该标准允许在CAN总线连线失败时CAN总线通信得以继续进行。在低速/容错CAN网络,每种设备都有它自己的终端。由于终端的类型不同,因此高速和低速/容错CAN设备不能在同一个网络中使用。
(3)ISO-14229https://blog.csdn.net/tfslovexizi/article/details/88523965 

六、Intel格式与Motorola格式数据矩阵示例

 

七、单、双滤波与验收代码寄存器、验收屏蔽寄存器

CAN总线验收代码寄存器(ACR)和验收屏蔽寄存器(AMR)均对于CAN接收而言。

代码寄存器用来指定匹配的格式;
屏蔽寄存器则指定不考虑的位。

验收屏蔽寄存器的某一位等于1时,表示忽略对该位对应ID位的滤波。
如验收屏蔽寄存器值=FFFFFFFF,表示屏蔽ACR的所有滤波位,则可以接收所有的消息。


每个过滤器由两部分组成:验收代码器和验收屏蔽器。

1、单过滤模式

只使用一个过滤器(共8个寄存器——4个验收代码器,4个验收屏蔽器)。
对于标准帧,滤波器只比较11位帧ID、RTR位和帧数据的前2个字节;
对于扩展帧,滤波器比较29位帧ID和RTR位。

当在单过滤模式下接收一个标准帧:
ACR0.7:0 和 ACR1.7:5 与 ID.10:0 比较;
ACR1.4 与 RTR 位比较;
ACR1.3:0 未使用;
ACR2 和 ACR3 与数据字节1和2比较。

当在单过滤模式下接收一个扩展帧:
ACR0.7:0 和 ACR1.7:0 与 ID.28:13 比较;
ACR2.7:0 和 ACR3.7:3 与 ID.12:0 比较;
ACR3.2 与 RTR 位比较;
ACR3.1:0 未使用。

2、双过滤模式

使用两个更小的过滤器(4个验收代码器拆开使用,4个验收屏蔽器拆开使用)。
(相当于定义两组比较规则,收到的帧只要符合任意一组规则就认为是有效帧)
对于标准帧,验收滤波器1比较11位帧ID、RTR位和第1个数据字节,验收滤波器2比较11位帧ID和RTR位;
对于扩展帧,两个滤波器都只比较ID前16位,符合条件就接收。


当在双过滤模式下接收一个标准帧:

过滤器 1:
ACR0.7:0 和 ACR1.7:5 与 ID.10:0 比较;
ACR1.4 与 RTR 位比较;
ACR1.3:0 与数据字节 1 的高半字节比较;
ACR3.3:0 与数据字节 1 的低半字节比较;

过滤器 2:
ACR2.7:0 和 ACR3.7:5 与 ID.10:0 比较;
ACR3.4 与 RTR 位比较。

当在双过滤模式下接收一个扩展帧:

过滤器 1:
ACR0.7:0 和 ACR1.7:0 与 ID.28:13 比较;

过滤器 2:
ACR2.7:0 和 ACR3.7:0 与 ID.28:13 比较。

举例:如果ACR0=11101111,AMR0=00000000,那么要想通过验收滤波,必须ID.28-ID.21=ACR0=11101111。
如果AMR0=00010000,那么ID.28-ID.21=11111111时,也可以通过验收滤波,因为此时AMR0的第五位为1,也就是屏蔽了ACR0的第五位。所以ID的相应位可以不和ACR0一致。
 

八、CAN波形

注意两点:
1、在CAN协议中当连续出现5个相同电平时就需要插入一个反向电平(位填充);
2、在CAN协议中将CAN_H和CAN_L的差值为高电平时定义为显性,逻辑上表示为0,为低电平时定义为隐形,逻辑上表示为1,所以实际读出来的数据要取反。
 
通过波形解析can总线数据:https://blog.csdn.net/ciellee/article/details/96160606
 

九、总线特点

1、可以多主方式工作,网络上任意一个节点均可以在任意时刻主动地向网络上的其他节点发送信息,而不分主从,通信方式灵活。
2、网络上的节点可分成不同的优先级,可以满足不同的实时要求。
3、采用非破坏性位仲裁总线结构机制,当两个节点同时向网络上传送信息时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响地继续传送数据。
4、可以点对点,一点对多点及全局广播几种传送方式接收数据。
5、直接通信距离最远可达10km(速率4Kbps以下)
6、通信速率最高可达1MB/s(此时距离最长40m)
7、节点数最多可达110个。
8、采用短帧结构,每一帧的有效字节数为8个。
9、每帧信息都有CRC校验及其他检错措施,数据错误率极低。
10、通信介质可采用双绞线,同轴电缆和光纤,一般采用廉价的双绞线即可。
11、节点在错误严重的情况下,具有自动关闭总线的功能,切断它与总线的联系,以使总线上的其他操作不受影响。
 
使用非屏蔽双绞线传输时,传输速率与传输距离的关系如下图所示:
 CAN系统又分为高速和低速;
高速CAN系统采用硬线是动力型,速度:500kbps,控制ECU、ABS等;
低速CAN是舒适型,速度:125Kbps,主要控制仪表、防盗等。
 

十、2.0A与2.0B

是标准CAN和扩展CAN的标准正式名称。
1、2.0A,仅支持11位标识符

2、2.0B,支持完整的29位标识符(也可以混合使用11位标识符)的扩展版本。2.0B节点可以是
(1)“2.0B主动型”,也就是说,它可以发送和接收扩展帧
(2)“2.0B被动型”,也就是说,它将静默丢弃接收到的扩展帧(但是请参考下述内容)

3、1.x表示初始规范及其修订版。

如今的新型CAN控制器通常是2.0B类型。1.x或2.0A类型的控制器如果接收到29个仲裁位的报文会很麻烦。2.0B被动型控制器容许这些报文,如果它们正确的话会进行应答,然后抛弃这些报文。2.0B主动型控制器既可传送也可接收这些报文。

实现2.0B和2.0A(和1.x)的控制器相互兼容,并且可以在同一总线上使用它们,则只要实现2.0B的控制器不发送扩展帧即可。
 
 

十一、CAN总线波特率计算

(1)了解位定时与同步

 
(2)总线波特率计算及设置方法
 
 
 

十二、自检测模式只听模式(SJA1000)

(1)自检测模式:发送CAN帧时不检查应答位;
(2)只听模式:此模式下不发送错误帧,用于自动监测波特率,以不同的波特率接收CAN帧。当收到CAN帧时表明当前波特率与总线波特率相同。
 
 

十三、CAN总线协议层次结构

LLC层和MAC层也可以看作是CAN总线数据链路层的两个子层。


LLC层接收MAC 层传递的报文,主要完成报文滤波、过载通知以及恢复管理等工作;
MAC层则为数据报文的传输进行具体的控制,包括帧结构控制、总线仲裁、错误检测、出错界定、报文收发控制等工作;
物理层定义了信号是如何实际传输的,因此涉及到位时间、位编码、同步的解释。

 

十四、CAN错误检测

具有错误检测、错误通知和错误恢复功能所有单元都可以检测错误,检测出错误的单元会立即同时通知其他所有单元。   
 
 

1、错误检测机制

CAN协议定义了五种以上不同的方法来检测错误。其中两种工作在位层次,另外三种工作在报文层次。
(1)位监视
CAN总线上的每个传送器都会监视(也就是回读)传送的信号电平。如果真正读到的位电平与传送的位电平不同,会发出信号指示位错误(仲裁过程中不会发出位错误)。

(2)位填充
节点连续发送五个具有相同电平的位后,将在发送出去的位流中加上第六个相反电平的位。接收方将删除这个额外的位。这样做是为了避免总线上出现过度的直流电成分,但它同时也给予了接收方检测错误的额外机会:如果总线上出现五个以上相同电平的连续位,会发出信号指示填充错误。

(3)帧检查
CAN报文的一些部分具有固定的格式,也就是说,标准明确定义了何种电平和何时出现这种电平(CRC定界符、ACK定界符、帧结束以及间歇,但是间歇还有一些另外的特殊错误检查规则)。如果一个CAN控制器在这些固定字段中的一个中检测到无效值,将发出组成错误。

(4)应答检查
总线上正确接收报文的所有节点(不管这些节点是否对报文内容“感兴趣”)预期将在报文中所谓的应答时隙中发送一个显性电平。这时,发送方将发送一个隐性电平。如果发送方无法在应答时隙中检测到显性电平,会发出应答错误的信号。

(5)循环冗余检查
每个报文都包含一个15位的循环冗余校验和(CRC)。节点如果在报文中检测到与自己计算所得不同的CRC,将发出CRC错误的信号。
 

2、CAN错误处理

错误处理的目标是检测CAN总线上出现的报文中的错误,从而传送器可以重传出错的报文。
总线上的每个CAN控制器都会尝试检测报文中的错误。如果发现错误,发现节点将传送一个错误标志,从而中断总线通信。其它节点将检测错误标志导致的错误(如果它们尚未检测到初始错误)并采取合适的措施(例如丢弃当前报文)。

每个节点维护两个错误计数器:传送错误计数器和接收错误计数器。有几个规则规定这些计数器怎样增加和/或减少计数。总的来讲,检测到故障的传送器增加其传送错误计数器,比侦听节点增加其接收错误计数器要快。这是因为,很有可能是传送器发生了故障!当任何错误计数器增加到超过某个值时,节点将首先进入“错误被动”,也就是说,它在检测到错误时,不会积极地阻止总线通信,然后“离开总线”,这意味着不参与总线通信。

使用错误计数器,CAN节点不但可以检测故障,而且可以执行错误限制。
 

3、错误限制机制

错误发生后,节点开始时处于主动错误模式。当两个错误计数器中的任何一个的计数超过127时,节点将进入称为被动错误的状态。当传送错误计数器达到255以上时,节点将进入总线离线状态

主动错误节点将在检测到错误时发送主动错误标志。被动错误节点将在检测到错误时发送被动错误标志。总线离线节点不会在总线上传送任何内容。

增加和减少错误计数器的规则略显复杂,但是原理比较简单:传送错误的步进为8个错误计数,而接收错误的步进为1个错误计数。正确传送和/或接收的报文会减小计数器值。

示例(稍加简化):假设总线上的节点A运气不好。不管什么时候A发送报文都发生失败(由于种种原因)。每次失败时,它的传送错误计数器增加8并发送主动错误标志。然后它将尝试重传报文,但是一直失败。

当传送错误计数器超过127时(也就是在16次尝试之后),节点A进入被动错误模式。区别在于,它现在将在总线上传送被动错误标志。被动错误标志包含6个隐性位,不会影响其它的总线通信,所以其它节点不会侦听到有关总线错误的反馈。但是,A继续增加其传送错误计数器。当计数值超过255时,节点A最终放弃传送并进入总线离线模式。

其它节点怎样响应节点A?对于A传送的每个主动错误标志,其它节点将为其接收错误计数器增加1。当A进入总线离线状态时,其它节点的接收错误计数器的计数大大低于错误被动的限制值(127)。每次正确收到一条报文,这个计数值将减1。但是,节点A将停留在总线离线状态。
 
大部分CAN控制器将为两种状态提供状态位(和相应的中断):
“错误警告”:一个或两个错误计数器的计数超过96;
“总线离线”:如上所述。

一些控制器(但不是所有)还为被动错误状态提供一个位。一些控制器还可以直接访问错误计数器。

CAN控制器在发生错误时自动重传报文的特性有时候会很烦人。市场上至少有一种控制器(飞利浦公司生产的SJA1000)允许对错误处理完全人工控制。
 

十五、各种CAN总线状况分析

1、未接终端电阻-被动型错误帧

这是一幅来自最普通的ISO11898CAN总线的图片,以1Mbps速率运行。收发器是82C251。也就是说,物理层是由ISO 11898指定的。示波器接CAN_H(CAN高位)和GND(接地):

示波器接CAN_L(CAN低位)和GND(接地):

这是另一个以125kbps发送的报文:

这是一幅更复杂的图片。它显示与上面例子相同的报文,比特率仍然是125kbps,但是CAN总线上没有端接。CAN线缆是短扁平带状线缆:

那么,发生了什么情况?这里,比特率是125kbps,所以一个位的时间是8微秒。

(1)首先传送节点发送一个起始位。这是一个逻辑0,也就是一个显性电平。
(2)然后传送标识符。十进制300的十六进制值是12c,或者二进制表示是001 0010 1100。前两个0会顺利传送。这解释了图片中看到的24微秒的显性电平。
(3)然后应该传送一个1。但是因为总线没有端接,所以斜率上升不是预期的结果。传送节点现在将认为它在总线上看到的是0。
(4)因为这种情况发生在仲裁阶段,所以传送节点将停止传送,其认为有其它节点正在传送。总线现在将变为隐性状态,因为实际上没有节点在传送
(5)在6个隐性位之后,传送节点和接收节点都将检测到填充错误,并开始进行错误处理。这时,已经经过了80微秒(一个起始位、两个2个0、一个误解位和六个隐性位,总共10个位,等于80微秒)。
(6)检测到数据错误的所有节点现在将开始传送一个错误帧。这种情况下,因为在捕获到上方图片之前产生了许多错误,错误帧为被动型,所以传送节点是错误被动型。被动型错误帧和主动型错误帧相似,但是使用隐性电平进行传送,所以在总线上不可见。被动型错误帧持续6位的时间。
(7)然后,所有节点等待8个隐性位的时长(称为错误定界符)。
(8)然后,所有节点等待3个隐性位的时长(称为间歇)。
(9)对以上时间求和,结果是1+6+6+8+3 = 24个隐性位 = 192微秒(如图)

经验提示:始终端接CAN总线!反射不一定有害,但是损坏的边缘形状将破坏通信。

端接可以达到两个目的:
①消除总线终端处的信号反射。
②确保总线获得正确的直流电电平。

 

2、未接终端电阻-主动型错误帧

这里是同一个CAN总线在另一个时间刻度中的情况:

CAN总线大约2分米(8英寸)长。信号的下冲和振铃均可见,但是在这种情况中无关紧要。这次,平缓的上升斜率是问题所在。

这里是相同的设置,但是这次传送节点和接收节点都是错误主动型:

发生了什么情况?

(1)如上图所示,传送了三个‘0’(花费24微秒)。
(2)接下去的位被误解,所以传送器认为它已经失去仲裁。传送节点等待6位,然后检测到一个填充错误。误解的位和这6个位花费56微秒。
(3)传送节点和接收节点现在开始传送错误帧。它是6个显性位(48微秒)。
(4)传送错误帧的节点现在等待8个隐性位。但是,因为上升斜率不对,第一个位被误解。节点将认为这是另一个节点在传送错误帧,所以将忽略它
(5)当总线回到隐性电平时,所有节点等待8位。
(6)然后是3个隐性位的间歇。
(7)3+9 = 12个位 = 96微秒(如图中所示)。
(8)然后,传送节点重新尝试并得到相同的结果。一段时间以后,传送节点进入错误被动型状态,并将如前所述那样运行。

 

3、没有接收节点

这里是另一幅图片。在此设置中,CAN总线上只有一个节点(正确端接)。该节点试图传送一条报文,但是没有其它节点在侦听。

那么,会发生什么情况?

(1)首先,传送节点发送整个报文。
(2)传送节点期望在ACK时隙中填充一个显性电平。但是,因为没有其它节点在侦听,没有任何ACK到达,所以传送节点检测到一个应答错误
(3)然后传送器传送一个被动型错误标志(上图中,尝试发送了几秒钟,所以不再是错误主动型,而是被动型)。
(4)被动型错误标志后面跟随一个错误定界符和间歇。
(5)因为这个节点尝试发送一个报文但是操作失败,它必须再等待8位才能开始新的传送。这种情况在CAN规范中称为“挂起传送”。
(6)传送节点还必须将其传送错误计数加8。但是,这是CAN规范中的特殊情况,只有当传送节点是错误主动型时才会发生。当传送节点进入错误被动型时,它不会增加其传送节点错误计数(这种情况中),而是会不断重试传送。

所以,上图表示,一条报文被传送,然后短暂停顿(时间为错误标志、错误定界符、间歇和挂起传送的总和)。然后报文被不断重传…

 

4、ACK异常导致CAN发送失败
如果总线上没有ACK应答(即应答间隙为隐性),发送器就会发送一个错误标志,并且发送错误计数器值加8,节点就会对报文进自动重发,若自动重发依然收不到ACK,则在发送错误计数器计数满128后(即出现16帧错误帧),由错误主动转为错误被动状态。
 
导致ACK段出错的原因可能有:
(1)总线上只有一个有效节点
发送报文的节点在发送出一帧报文后会检测总线上应答间隙的状态,如果检测到应答间隙为隐性位,则表示该帧报文没有得到ACK,发送失败,需要重发,而由于发送错误计数器会在发送失败后累加,直到该节点关闭。所以,当总线上只有一个有效节点时,这个节点是发不出去数据的,因为它所发出的数据帧中的ACK Slot没有另外一个节点来填充,将永远是隐性位,这个节点会一直重发数据直到发送成功或发送被取消。
(2)波特率不匹配或者节点没有初始化,导致没有ACK;
(3)总线线缆短路,断路,接反;
(4)高速CAN总线上接的节点不是高速CAN,而是容错低速CAN,导致不匹配。
 
posted @ 2020-09-01 14:46  不溯流光  阅读(1649)  评论(0编辑  收藏  举报