CAN总线的报文分析(三)

系列文章目录



前言

CAN总线上的节点发送数据都是以报文的形式广播给网络中的所有节点,每一条报文就叫做“一帧”数据。(传输数据的基本单位)

CAN总线的报文帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔5种类型

名称用途
数据帧用于发送单元向接收单元传送数据的帧。
远程帧/遥控帧用于接收单元向具有相同 ID 的发送单元请求数据的帧。
错误帧用于当检测出错误时向其它单元通知错误的帧。
过载帧当一个节点正忙于处理接收的信息,可以通知其它节点暂缓发送新报文。
帧间隔用于将数据帧及遥控帧与前面的帧分离开来的帧

数据帧和遥控帧有标准格式扩展格式
标准格式有11位标识符,扩展格式有29位标识符。


一、数据帧(最常用)

结构上由7段组成: 帧起始+仲裁段+控制段+数据段+CRC段+ACK段+帧结束

名称介绍
帧起始表示帧的开始,由一个的显性电平组成。
仲裁段表示帧的优先级, 由标识符(ID)和传送帧类型(RTR)组成。
控制段表示数据的字节数,由6个bit构成
数据段可发送0~8 个字节的数据
CRC段用于校验传输是否正确
ACK段表示确认是否正常接收
帧结束由7个连续的隐形位组成
隐性电平:逻辑1
显性电平:逻辑0

1.帧起始

无论是标准数据帧还是扩展数据帧都包含这两个段。帧起始标志着数据帧和远程帧的起始,由一个单独的显性位(逻辑0)组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。(总线空闲时为隐性位,故帧起始以显性位非常好识别)
在这里插入图片描述

2.仲裁段

当多个节点同时发送数据,总线应该怎么处理呢?所以仲裁段表示数据传输的优先级,作用就是根据报文ID来确定其发送优先级。标准格式和扩展格式在此的构成有所不同。
在这里插入图片描述

标准帧ID为11位。
扩展帧ID为29位。

数据分析:
在这里插入图片描述
如何仲裁呢?
首先判断节点发送位的电平与总线上的电平是否一致,不一致则停止发送。
在这里插入图片描述
分析:

1.当总线的电平为显性时(逻辑0),节点A ,C的第五位都是显性,节点B为隐性,淘汰节点B。进入只听模式。
2.当节点A,C竞争时,第3位不一致了,节点C的第三位位隐性,节点A的为显性,所以淘汰节点C,节点C进入只听模式。

3.控制段

控制段共6位。
标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;
扩展帧控制段则由r1、r0和DLC组成。
在这里插入图片描述
IDE:标准帧中该位位于控制段,为显性0。扩展帧中属于仲裁段,为隐性1。
r0,r1:保留位,各占1bit,默认设置为显性位
DLC:数据长度码,它由4个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC段表示的数字为0~8。数据的字节数必须为 0~8字节。但接收方对 DLC=9~15的情况并不视为错误。

4.数据段

数据段为数据帧的核心内容,可包含0-8个字节的数据,从MSB(最高位)开始输出。遥控帧没有此段。
在这里插入图片描述

5.CRC段

为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收节点算出的CRC码跟接收到的CRC码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC部分的计算一般由CAN控制器硬件完成.
CRC界定符恒为隐性1。
在这里插入图片描述

6.ACK段

用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位构成。
在这里插入图片描述
应答槽:
发送节点:发送隐性电平1
接受成功的节点:发送显性电平0
总线电平与与节点的发送结果对比:显性发送成功,隐性发送失败。
应答标识:一个隐性电平1

7.帧结束

表示该帧的结束的段,由7个连续的隐形位(1111111)组成
在这里插入图片描述

二、远程帧

与数据帧相比,远程帧结构上无数据段,由6个段组成,同理分为标准格式和扩展格式,且RTR位为1(隐性电平)。
在这里插入图片描述
如下图所示由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平。
所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高。
在这里插入图片描述
数据帧与远程帧的区别:
在这里插入图片描述

三、错误帧

用于在接收和发送消息时检测出错误通知错误的帧,
错误帧由错误标志和错误界定符构成。
主要错误的类型:在这里插入图片描述
当出现错误时,发送或接收节点将发送错误帧。错误帧的结构如下,
其中错误标识分为主动错误标识和被动错误
在这里插入图片描述
(1)主动错误状态:可以正常参加总线通信的状态,处于主动错误状态的单元检测出错误时,输出主动错误标志。
(2)被动错误状态:是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其他单元通信,接收时不能积极地发送错误通知;处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。处于被动错误状态的单元检测出错误时,输出被动错误标志。另外,处于被动错误状态的单元在不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8个位的隐性位)。
(3)总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。
在这里插入图片描述

四、过载帧

当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;
过载帧由过载标志(6个位的显性位)和过载界定符(8个位的隐性位)构成。过载界定符的构成与错误界定符的构成相同。
在这里插入图片描述
在这里插入图片描述
对于过载帧的帧结构我们可以这样理解:接收节点达到接收极限时,就会发出过载帧到总线上,显然,过载标志的6个连续显性位会屏蔽掉总线上其它节点的发送,也就是说这个时候的接收节点通过发送过载帧的方式来破坏其它节点的发送,这样在接收节点发送过载帧期间,其它节点就不能成功发送报文,于是就相当于把其它节点的发送推迟了,也就是说接收节点在其发送过载帧的这段时间得以“休息”。

有3种情况会引起过载帧:
1.接收节点自身原因。接收节点由于某种原因需要延迟接收下一个数据帧或者遥控帧。
2.在帧间隔的间歇段的第一位和第二位检测到一个显性位(正常的间歇段都是隐性位)。帧间隔的间隔段本应是三个连续的隐性位,如果接收节点在间隔段检测到显性位,那么就意味着此时有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。
3.CAN节点在错误界定符或过载界定符的第八位(最后一位)听到一个显性位0,节点会发送一个过载帧,且错误计数器不会增加。接收节点在错误界定符和过载界定符的最后一位听到显性位,也意味着有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。

五、帧间隔

帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间隔。
1 .帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。
在这里插入图片描述
2 .帧间隔过后,如果无节点发送帧,则总线进入空闲。
在这里插入图片描述
3 .帧间隔过后,如果被动错误节点要发送帧,则先发送8个隐性电平的传输延迟,再发送帧.
在这里插入图片描述
在这里插入图片描述
间隔为3个位的隐性位;总线空闲为隐性电平,无长度限制(0亦可);延迟传送为8个位的隐性位,只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。这里为什么需要延迟传送段呢?
首先,考虑主动错误状态的节点A,发送主动错误标志之后,随之就要重新发送刚刚发送失败的报文,但是为了间隔开与前面刚刚发送的错误帧,总线在错误帧之后就会插入3个隐形位的帧间隔,在这3个隐形位期间,其它的节点不足以判定总线空闲(需要连续11个隐性位才能判定),所以节点A仍然占据着总线的控制权,于是在帧间隔之后,节点A能够接着发送报文。现在节点A转入到被动错误状态了,说明它已经不是很可靠了,这个时候如果没有延迟传送段,在节点A发出被动错误标志之后,它仍然能够在3位的帧间隔之后立即重新发送报文,这是不符合我们对被动错误状态的处理要求的当然也是不符合CAN协议的,于是乎对于发送出被动错误标志的节点,总线在帧间隔中加入了8个连续隐性位的延迟传送段,这样的3+8=11个连续隐性位。就能让节点A在这个帧间隔期间失去对总线的控制权,从而优先保证其它正常(处于主动错误状态)节点能够使用总线,而不必等着一个已经不可靠的节点A占据总线。

总结

仅仅用于个人学习使用!
在这里插入图片描述

  • 21
    点赞
  • 188
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值