中国汽车工程师之家--聚集了汽车行业80%专业人士 

论坛口号:知无不言,言无不尽!QQ:542334618 

本站手机访问:直接在浏览器中输入本站域名即可 

  • 1006查看
  • 0回复

[模块网络] 一文详解CAN总线错误帧|附下载

[复制链接]

  • TA的每日心情

    1435747603
  • 签到天数: 1 天

    发表于 2-9-2023 08:51:23 | 显示全部楼层 |阅读模式

    汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


    01

    错误帧的帧结构

    在发送和接收报文时,总线上的节点如果检测出了错误,那么该节点就会发送错误帧,通知总线上的节点,自己出错了。

    错误帧由错误标志和错误界定符两个部分组成。
    一文详解CAN总线错误帧|附下载w1.jpg

    主动错误标志:6个连续的显性位;

    被动错误标志:6个连续的隐性位;

    错误界定符:8个连续的隐性位。
    可以看到在错误标志之后还有0~6位的错误标志重叠,这一段最低有0个位,最多有6个位,关于这一段是怎么形成的,将在下文中解释。

    02

    错误帧是怎么检测的

    2.1 位填充原则
    在了解CAN总线中的错误检测之前,首先需要了解什么是位填充。
    CAN协议中规定,当相同极性的电平持续五位时,则添加一个极性相反的位。

    一文详解CAN总线错误帧|附下载w2.jpg

    对于发送节点而言:在发送数据帧和遥控帧时,对于SOF~CRC(除去CRC界定符) 之间的位流,相同极性的电平如果持续5位,那么在下一个位插入一个与之前5位反型的电平;对于接收节点而言:在接收数据帧和遥控帧时,对于**SOF~CRC(除去CRC界定符)**之间的位流,相同极性的电平如果持续5位,那么需要删除下一位再接收。
    一文详解CAN总线错误帧|附下载w3.jpg
    Tips: 注意:填充位的添加和删除是由发送节点和接收节点完成的,CAN-BUS只负责传输,不会操纵信号。

    03

    错误帧的种类

    在CAN总线通信中,一共有五种错误:


      位错误

      ACK错误

      填充错误

      CRC错误

      格式错误
    3.1 位错误(Bit Check Error)节点将自己发送到总线上的电平与同时从总线上回读到的电平进行比较,如果发现二者不一致,那么这个节点就会检测出一个位错误。实际上所谓“发出的电平与从总线上回读的电平不一致”,指的就是节点向总线发出隐性位,却从总线上回读到显性位或者节点向总线发出显性位,却从总线上回读到隐性位这两种情况。Tips: 有三种例外情况不属于位错误:在仲裁区,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示该节点仲裁失败;在ACK槽,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示,该节点当前发送的这一帧报文至少被一个其它节点正确接收;该节点发送被动错误标志,节点Node_A向总线发送连续六个隐性位(被动错误标志)却回读到显性位,不认为是位错误。因为被动错误标志是六个连续的隐性位,所以在总线上按照线与机制,有可能这六个连续隐性位被其它节点发送的显性电平“吃掉”;3.2 ACK错误(Acknowledgment Error)

    按照CAN协议的规定,在一帧报文(数据帧或者遥控帧)发出之后,如果接收节点Node_B成功接收了该帧报文,那么接收节点Node_B就要在该帧报文ACK槽对应的时间段内向总线上发送一个显性位来应答发送节点Node_A。这样发送节点Node_A就会在ACK槽时间段内从总线上回读到一个显性位。因此:当发送节点Node_A在ACK槽时间段内没有回读到显性位,那么发送节点Node_A就会检测到一个ACK应答错误。这表示没有一个节点成功接收该帧报文。
    一文详解CAN总线错误帧|附下载w4.jpg

    3.3 填充错误(Fill Error)
    在需要执行位填充原则的帧段(数据帧遥控帧的SOF~CRC序列),检测到连续六个同性位,则检测到一个填充错误。3.4 CRC错误发送节点Node_A在发送数据帧或者遥控帧时,会计算出该帧报文的CRC序列。接收节点Node_B在接收报文时也会执行相同的CRC算法,如果接收节点Node_B计算出的CRC序列值与发送节点Node_A发来的CRC序列值不一致,那么接收节点就检测到一个CRC错误。
    一文详解CAN总线错误帧|附下载w5.jpg

    3.5格式错误

    在一帧报文发送时,如果在必须发送预定值的区域内检测到了非法值,那么就检测到一个格式错误。
    CAN报文中,有预定值的区域包括:


      数据帧和遥控帧的CRC界定符、ACK界定符、EOF;

      错误帧界定符

      过载帧界定符


    04

    错误通知

    上一节中,讲到CAN通信中有五种错误,并且介绍了在什么情况下能够检测到这几种错误,在检测到错误之后,检测到错误的节点就要发送错误帧到总线上来通知总线上的其他节点。错误帧有的带有主动错误标志,有的带有被动错误标志,而且错误标志重叠部分的字节数也不一样,那么问题就来了:


      什么情况下发送带有主动错误标志的错误帧;

      什么情况下发送带有被动错误标志的错误帧;

      在哪个时间点发送错误帧;

      错误标志重叠部分是怎样形成的;


    4.1 节点错误状态

    按照CAN协议的规定,CAN总线上的节点始终处于以下三种状态之一。


      主动错误状态

      被动错误状态

      总关闭状态


    当满足一定的条件时,节点可以从一种状态转换为另外一种状态。

    一文详解CAN总线错误帧|附下载w6.jpg

    1)主动错误状态节点处于主动错误状态可以正常通信;处于主动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出主动错误标志。2)被动错误状态节点处于被动错误状态可以正常通信;
    处于被动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出被动错误标志。
    Tips: 注意:这里说处于主动错误状态或被动错误状态的节点仍然可以正常通信,这里的正常通信指的是:节点仍然能够从总线上接收报文,也能够竞争总线获胜后向总线上发送报文。但是不代表接收的报文一定正确也不代表一定能正确的发送报文。
    3)总线关闭状态
    节点处于总线关闭状态,那么该节点不能收发报文;
    处于总线关闭状态的节点,只能一直等待,在满足一定条件的时候,再次进入到主动错误状态。

    4.2 错误状态的转换现在我们知道:处于主动错误状态的节点在检测到错误时会发送带有主动错误标志的错误帧;处于被动错误状态的节点在检测到错误时会发送带有被动错误标志的错误帧。那么一个CAN节点在什么情况下处于主动错误状态,什么情况下处于被动错误状态呢?根据CAN协议的规定,在CAN节点内,有两个计数器:发送错误计数器(TEC)和接收错误计数器(REC)。Tips: 需要注意的是:这两个计数器计得不是收发报文的数量,也不是收发错误帧的数量。TEC和RCE计数值的变化,是根据下表的规定来进行的
    一文详解CAN总线错误帧|附下载w7.jpg

    CAN节点错误状态的转换,就是基于这两个计数器来进行的。
    一文详解CAN总线错误帧|附下载w8.jpg

    可以看出,节点错误状态的转换就是一个“量变”到“质变”的过程: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,重新回到主动错误状态。按照我的理解这个所谓“检测到128次11个连续隐性位”其实就是让这个节点隔离一段时间冷静下,因为它一旦处于总线关闭状态,就不会和总线有任何的联系,这个时候只要它计算时间等于达到传送128次11个连续隐性位所用的时间,就可以重新连到总线上。Tips: 处于总线关闭状态说明,这个节点目前挂掉了,总线先把它踢开,这样它才不会拖累别人,等到它冷静一段时间之后再回到总线上。3.3 错误帧的发送

    在检测到错误之后,什么时候发送错误帧呢?
    按照CAN协议的规定:


      位错误、填充错误、格式错误、ACK错误。
      在错误产生的那一位的下一位开始发送错误帧。

      CRC错误
      紧随ACK界定符后的位发送错误帧


    例子1:
    一文详解CAN总线错误帧|附下载w9.jpg

    (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:
    一文详解CAN总线错误帧|附下载w10.jpg

    从上图中可以看出错误帧之中,错误标志重叠部分是怎样形成的,这个例子中,位错误的错误标志与填充错误的错误标志重叠两位,剩下的部分还有四位:

    一文详解CAN总线错误帧|附下载w11.jpg

    文章来源:公众号车辆技术,侵删另外,小编也整理了些总线资料,仅需将此文分享至朋友圈,集20个赞,并截图通过后台发至小编,即可获得下载链接。

    一文详解CAN总线错误帧|附下载w12.jpg


    

    该用户从未签到

    发表于 17-3-2025 19:28:00 | 显示全部楼层
    针对您关于CAN总线错误帧的询问,我将以汽车工程师的专业角度为您解答。

    CAN总线中的错误帧主要用于在节点检测出错时,通知总线上的其他节点。错误帧主要由错误标志和错误界定符组成。其中,主动错误标志由6个连续的显性位构成,而被动错误标志则是6个连续的隐性位。在错误标志之后,还可能有0~6位的错误标志重叠。

    错误帧的检测主要依赖于位填充原则。在CAN通信中,每位时间有一个固定长度,如果在此时间内没有收到任何信号,则判定为存在错误。此外,通过检查报文的CRC字段也可检测出错误。当节点发现错误时,就会发送错误帧来通知其他节点。

    关于错误标志重叠的部分,其形成与具体的错误类型和错误检测机制有关,这部分的详细解释涉及CAN总线的具体工作原理,如感兴趣,可查阅相关技术文档或资料以深入了解。

    因篇幅限制,无法在此详细阐述,您可点击附件下载相关技术文档,以获取更全面的信息。

    【附下载】相关CAN总线技术文档,详解错误帧的帧结构、检测机制及更多内容。希望以上解答对您有帮助。
    回复 支持 反对

    使用道具 举报

    

    该用户从未签到

    发表于 17-3-2025 19:28:00 | 显示全部楼层
    针对您关于CAN总线错误帧的询问,现回复如下:

    一、错误帧的帧结构

    当CAN总线上的节点在发送或接收报文时检测到错误,会发送错误帧通知其他节点。错误帧由两部分组成:错误标志和错误界定符。其中,主动错误标志由6个连续的显性位构成,而被动错误标志则由6个连续的隐性位构成。错误界定符由8个连续的隐性位组成。

    二、错误帧的检测

    1. 位填充原则:在CAN总线通信过程中,消息帧之间的时间间隔是固定的。若节点发现总线空闲时间过长,则认为可能出现错误,此时会插入一个位填充,通常为隐性位。
    2. 错误检测流程:在接收报文时,节点会监测每一位,若连续检测到相同的位(如连续的显性位或隐性位),则判定为错误。此时,节点会发送错误帧通知其他节点。

    关于错误标志之后重叠的0~6位,是由于在检测过程中,根据实际错误的类型和位置,节点会生成不同数量的重叠位。这部分的具体形成机制较为复杂,涉及CAN总线的详细协议和通信机制,建议查阅相关文献资料或专业教程以深入了解。

    以上是对CAN总线错误帧的初步解析,如需更详细的内容,请查阅附带的文档或相关资料。如有更多问题,欢迎继续咨询。
    回复 支持 反对

    使用道具 举报

    
  • TA的每日心情
    无聊
    1-7-2015 18:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 17-3-2025 19:28:00 | 显示全部楼层
    好的,对于您提出的关于CAN总线错误帧的问题,我来做一个专业解答。

    一、错误帧的帧结构

    在CAN总线通信中,当节点检测到错误时,会发送错误帧来通知总线上的其他节点。错误帧主要由错误标志和错误界定符两部分组成。其中,主动错误标志由6个连续的显性位构成,而被动错误标志则由6个连续的隐性位构成。错误界定符由8个连续的隐性位构成。

    二、错误帧的形成

    在发送和接收报文过程中,如果节点检测到错误,如位填充原则被破坏(即连续5个相同位出现),就会触发错误帧的发送。错误标志后可能跟随0到6位的错误标志重叠,这一部分的长度取决于具体的错误类型和严重程度。

    三、错误检测机制

    CAN总线的错误检测主要依赖于位填充原则。在正常通信过程中,每位数据之后应有一个空闲位,用于同步和错误检测。如果发生连续5个相同位的非正常情况(即破坏位填充原则),就会被识别为错误,从而触发错误帧的发送。

    详细的内容建议查阅相关文档资料,更深入的理解CAN总线的错误处理机制。希望这些解释对您有帮助。如果您需要更深入的解释或有其他问题,欢迎继续提问。
    回复 支持 反对

    使用道具 举报

    

    该用户从未签到

    发表于 17-3-2025 19:28:00 | 显示全部楼层
    针对您的帖子内容,作为汽车工程师回复如下:

    一、关于CAN总线错误帧的帧结构

    错误帧是CAN总线中用于指示报文错误的特殊帧。它由错误标志和错误界定符两部分组成。主动错误标志由6个连续的显性位构成,用于指示发送节点检测到错误;被动错误标志则由6个连续的隐性位构成,用于指示接收节点检测到错误。错误界定符由8个连续的隐性位组成,用于标识错误帧的结束。

    二、错误帧的检测

    在了解错误帧之前,需先明确位填充原则,即在发送报文时,若某一位时间间隔内没有节点发送信号,则视为隐性位。当节点连续发送相同信号超过允许的间隔时,会触发错误检测机制。具体检测过程涉及多个方面,如循环冗余检查等。一旦检测到错误,节点会发送相应的错误标志。关于错误标志之后重叠的位数的形成,通常取决于具体的错误类型和发生错误的节点。重叠位数并不是固定的,但有一定的范围限制。为了准确理解这一过程,建议查阅相关文档或资料。如有需要,可进一步探讨。关于详细解释和图示的文档可参见附件下载链接(附下载)。希望以上内容对您有帮助。如有更多疑问或需求,欢迎继续交流。
    回复 支持 反对

    使用道具 举报

    快速发帖

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

    GMT+8, 20-7-2025 22:24 , Processed in 0.407633 second(s), 40 queries .

    Powered by Discuz! X3.5

    © 2001-2013 Comsenz Inc.