3 CAN错误帧、过载帧、帧间隔

2023-10-20 16:10
文章标签 错误 间隔 过载

本文主要是介绍3 CAN错误帧、过载帧、帧间隔,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、错误帧、过载帧、帧间隔的格式

  这三种帧的格式远比数据帧简单,但它背后的机制比较复杂,需要重点掌握,详细的机制后面讲,先看每种帧的格式。

1、错误帧

  当节点检测到总线上有错误出现时,会发送一包错误帧。格式如下图所示:
在这里插入图片描述

(1)错误标志

  错误标志分为两类:主动错误标志和被动错误标志。
  主动错误标志为6个显性电平,被动错误标志为6个隐性电平。

(2)错误界定符

  错误界定符为8个隐性电平。
  但实际使用中错误帧的格式一般如下所示,在错误标志后面,可能还会有0~6位的错误标志重叠。原因后续再讲。
在这里插入图片描述

2、过载帧

  当节点正在忙,却检测到总线上有数据在发送,则会发送一包过载帧,格式如下图所示:
在这里插入图片描述

(1)过载标志

  过载标志为6个显性电平。

(2)过载界定符

  过载界定符为8个隐性电平。
  同样的,实际使用中过载帧的格式一般如下所示,在过载标志后面,可能还会有0~6位的过载标志重叠。
在这里插入图片描述

3、帧间隔

  当需要连续发送多个数据帧时,需要在每帧之间加一包帧间隔。帧间隔有两种形式,
  主动错误状态:间隔段+空闲段。
  被动错误状态:间隔段+暂停段+空闲段。
在这里插入图片描述

(1)间隔段

  间隔段为3个隐性电平

(2)暂停段

  只出现在被动错误状态,为8个隐性电平。

(3)空闲段

  空闲段就是总线的空闲状态,即隐性电平,个数无所谓。

二、错误种类

  CAN之所以有很强的可靠性,离不开它的错误检测机制,CAN总线一共有5中错误:

1、位错误

  节点将自己发送到总线上的电平与从总线上读回的电平进行比较,如果二者不一致,则产生位错误。
  不过有3种例外不属于位错误:
  (1)在仲裁区,节点发送隐性位却读到显性位,表示该节点仲裁失败,故不认为是位错误。
  (2)ACK标记,发送节点的ACK标记为隐性电平,如果某个节点成功接收到数据并CRC校验成功,则该位被接收节点拉为显性电平,故不认为是位错误。
  (3)节点发送被动错误帧的错误标志时,该标志为6个隐性电平,很有可能因为“线与”的特性,被其他节点的电平线与,而读到显性电平,故不认为是位错误。

2、ACK错误

  节点发送隐性电平的ACK标记后,如果某个节点成功接收数据,该接收节点会把ACK标记拉为显性电平,如果在ACK标记时间段内,发送节点没有读到显性电平,则产生ACK错误。
在这里插入图片描述

3、填充错误

  CAN有一个特殊的同步机制,它利用了传输数据的电平跳变进行节点间的时钟同步,但是如果电平一直不跳变怎么办?所以CAN引入了填充机制,CAN规定,当相同极性的电平持续5位时,则添加一个极性相反的位。这样就能保证最大不会超过5位,节点间就能进行一次时钟同步。
  对于发送节点,在发送数据帧和遥控帧时,在SOF~CRC之间的位(包含SOF,不包含CRC界定符),如果相同极性的电平持续5位,那么插入一位极性相反的电平。
  对于接受节点,在接受数据帧和遥控帧时,在SOF~CRC之间的位,如果接受到相同极性的电平持续5位,那么删除接收到的下一个位。
  如下图所示:
在这里插入图片描述
  所以节点检测到总线上的数据帧和遥控帧的SOF~CRC之间出现连续6个极性相同的电平时,产生填充错误。

4、CRC错误

  发送节点和接收节点均会对数据帧和遥控帧的SOF~Data段的位(包含SOF)进行CRC校验,如果两个节点计算的CRC不一致,则接收节点产生CRC错误。

5、格式错误

  每种帧都会存在已经有预定值的区域,如果节点检测到这些区域与预定值不同,则产生格式错误。
  有预定值的区域:数据帧和遥控帧的CRC界定符、ACK界定符、EOF;错误帧界定符;过载帧界定符。

三、节点错误状态

  对每一节点,它总是处于如下三种状态之一:主动错误状态、被动错误状态、总线关闭状态。它们的转换关系如下图所示:
在这里插入图片描述
  每个节点,都有两个计数器:TEC,发送错误计数器;REC,接收错误计数器。可以发现,状态之间的扭转,主要靠TEC和REC这两个值,这两个值的变化主要如下表所示。一定要注意,这两个计数器不是计收发报文的数量,也不是收发错误帧的数量。
在这里插入图片描述

1、主动错误状态

  节点初始化完毕后,进入主动错误状态,在该状态下,一旦检测到错误,则会发送主动错误状态的错误帧。
  如果发送节点检测到错误,则之前的帧会先停止发送,再发出主动错误帧,表示之前的帧有错误,被主动破坏掉。因为主动错误标志是6个显性电平,根据线与特性,总线上一定会出现6个显性电平,这就使得接收节点会检测出位填充错误,因为每5个连续相同极性的电平必须要跟一个极性相反的电平。当错误帧发送完毕后,需要发送主动错误状态下的帧间隔。
  如果接受节点检测到错误,它会直接发送主动错误帧,表示当前发送节点发送的帧有错误,同时因为线与特性,正在发送的帧也会被破坏掉。同时其他的接收节点也会检测到填充错误。
  如下图所示,发送节点检测到位错误,它会直接产生主动错误帧,同时其他的接收节点因为主动错误标志,检测到填充错误,也会产生主动错误帧,最后,他们在总线上产生的错误帧的主动错误标志由6个隐性电平,直接扩大到了12个,这就是错误标志重叠区的由来。当主动错误帧发送完毕,会紧跟着一个帧间隔,因为这是主动错误状态,故帧间隔只有间隔段。显然,错误帧的错误界定符的8个显性电平+帧间隔的间隔段的3个显性电平,总线上共出现了连续11个显性电平,总线进入空闲状态。
在这里插入图片描述
  下图展示了另一种报错误帧的情况,发送节点检测到位错误,产生错误帧,然后接收节点产生填充错误帧,此时,错误标志重叠区由6位扩展到了10位。
在这里插入图片描述
  处于主动错误状态,说明这个节点目前是比较可靠的,出现错误的原因可能不是它本身的问题,即刚刚检测到的错误可能不仅仅只有它自己遇到,正是因为这一点,总线才相信它报告的错误,允许它破坏掉发送中的报文。

2、被动错误状态

  在主动错误状态下,如果节点的TCE>127或者REC>127,它就会进入被动错误状态。在该状态下,一旦检测到错误,则会发送被动错误状态的错误帧。
  如果发送节点检测到错误,则之前的帧会先停止发送,再发出被动错误帧,表示之前的帧有错误,被主动破坏掉。但因为被动错误标志是6个隐性电平,它不会影响总线上的电平。错误帧结束后,要发送被动状态下的帧间隔,它包含间隔段和暂停段,因为间隔段+暂停段是连续11个隐性电平,故总线进入空闲状态。其他的节点可以参与总线仲裁。
  如果接收节点检测到错误,它会直接发送被动错误帧,表示当前发送节点发送的帧有错误,同样的,也不会影响总线上的电平,发送节点会接续发送,其他的接收节点也会继续接收。
  之所以有被动错误状态,说明这个节点目前是不太可靠的,出现错误的原因可能是它本身的问题,即刚刚检测到的错误可能仅仅只有它自己遇到,正是因为这一点,总线才不信任它报告的错误,从而只允许它发送六个连续的隐性位,这样它才不会拖累其他节点。

3、总线关闭状态

  在被动错误状态下,如果节点的TEC > 255,它就会进入总线关闭状态。在总线关闭状态下的节点不能向总线上发送报文,也不能从总线上接收报文,整个节点脱离总线。等到检测到128次11个连续的隐性位时,TEC和REC置0,重新回到主动错误状态。

四、错误帧

  有关错误帧的使用的机制,上面几节基本上已经讲完了。还剩下错误帧的发送时机。
  当节点检查到位错误、填充错误、格式错误、ACK错误时,会在错误产生的下一位马上开始发送错误帧。
  当节点检查到CRC错误时,会在ACK界定符之后发送错误帧。

五、过载帧

  当某个节点没有做好接收下一帧数据的准备时,会发送过载帧。
  过载帧的过载标志为6个显性电平,显然会直接屏蔽其他节点发送的数据,导致填充错误,强制令发送节点停止发送。
  一般情况下,会有3中情况引起过载帧:
  (1)接收节点自身原因,接收节点因为某种原因需要延迟接收下一包数据帧或者遥控帧。
  (2)在帧间隔的间隔段的前两位检测到显性电平,因为正常的间隔段是3个隐性电平,如果突然检测到显性电平,一般是数据帧的SOF,这说明有节点想要发送数据,但CAN规定,此时不允许有其他节点发送报文,故要发送过载帧,破坏发送节点的数据,推迟发送。
  (3)在错误界定符或过载界定符的第8位,检测到显性电平,同样的道理,此时也是不允许其他节点发送数据,故要发送过载帧。

六、帧间隔

  帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。如下图所示
在这里插入图片描述
  它能够避免处于被动错误状态的节点长期占用总线,保证主动错误节点优先发送。

这篇关于3 CAN错误帧、过载帧、帧间隔的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248198

相关文章

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne

SQL2005 性能监视器计数器错误解决方法

【系统环境】 windows 2003 +sql2005 【问题状况】 用户在不正当删除SQL2005后会造成SQL2005 性能监视器计数器错误,如下图 【解决办法】 1、在 “开始” --> “运行”中输入 regedit,开启注册表编辑器,定位到 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVer

ssm 之事务管理出现错误

JDBC Connection will not be managed by Spring 项目采用的是分布式架构,分别有controller,service,solr三个服务器,之间通过dubbo进行调用,经过测试发现事务配置完以后不能通过spring进行管理,其中两条insert和一条update语句都执行完毕,异常并没有使得事务进行回滚,通过调取debug日志发现“JDBC Conn

Unstructured cannot write mode RGBA as JPEG 错误解决

Unstructured cannot write mode RGBA as JPEG 错误解决 0. 错误详细1. 解决方法 0. 错误详细 Image Extraction Error: Skipping the failed imageTraceback (most recent call last):File "/root/miniconda3/envs/learn-y

收藏:解决 pip install 出现 error: subprocess-exited-with-error 错误的方法

在使用 pip 安装 Python 包时,有时候会遇到 error: subprocess-exited-with-error 错误。这种错误通常是由于 setuptools 版本问题引起的。本文将介绍如何解决这一问题 当你使用 pip install 安装某个 Python 包时,如果 setuptools 版本过高或过低,可能会导致安装过程出错,并出现类似以下错误信息:error: subpr

如何根据相同分隔符提取间隔数据?

最近遇到很多提问怎么提取字符的,而这些问题都有一个相同的特征,就是要提取的内容与内容之间,都有着相同的分隔符。当然,这种问题直接用“数据” →  “分列”功能就可以一步到位实现的,但有人喜欢折腾,而更多的人又非得指定函数公式的方法,或者更多的是要保持数据的同步性。   下面,我们就来讲讲用函数公式应该怎么实现这个提取,首先来个数据和要求,如下图,将 - 号间隔的内容依次提取到右边单元格内:

插件:清理maven错误缓存.bat

插件:https://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd=7zenhttps://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd=7zen没错误缓存时: 有错误缓存时:

在幼儿园管理系统中,会议管理申请会议模块:添加会议记录(提交表单)的时候报:404错误!

在幼儿园管理系统(spring MVC)中,会议管理>申请会议模块:添加会议记录的时候报:404错误!不知道为啥找不到,一开始感觉一头雾水,怎么会出现404页面找不到错误那,又检查action,controller等这也没错啊!怎么出现404错误那。经过询问和查找,终于找到原因了。 原因是:添加的有时间字段。 代码: @InitBinder public void in

Java中计算两个日期间隔多少天

String dbtime1 = "2017-02-23";  //第二个日期 String dbtime2 = "2017-02-22";  //第一个日期 //算两个日期间隔多少天 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = format.parse(dbtime1); Date dat

关于ddddocr运行错误的解决

关于ddddocr运行错误的解决 前因 今天看了一个开源项目,自己拉下来重建虚拟venv后,运行报错。 看了半天,除了requirements.txt 写的不详细缺少引用外,最大的问题是报找不到指定的模块 分析错误信息 ddddocr import onnxruntime 时候报错 具体错误为 from .onnxruntime_pybind11_state import * # noqa