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

相关文章

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Python中ModuleNotFoundError: No module named ‘timm’的错误解决

《Python中ModuleNotFoundError:Nomodulenamed‘timm’的错误解决》本文主要介绍了Python中ModuleNotFoundError:Nomodulen... 目录一、引言二、错误原因分析三、解决办法1.安装timm模块2. 检查python环境3. 解决安装路径问题

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

SpringBoot中的404错误:原因、影响及解决策略

《SpringBoot中的404错误:原因、影响及解决策略》本文详细介绍了SpringBoot中404错误的出现原因、影响以及处理策略,404错误常见于URL路径错误、控制器配置问题、静态资源配置错误... 目录Spring Boot中的404错误:原因、影响及处理策略404错误的出现原因1. URL路径错

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去