【转载】关于CAN报文中ACK检测错误的原理
- 格式:doc
- 大小:121.00 KB
- 文档页数:3
一文看懂CAN总线
前言挂起传输
"被动错误"的节点发送报文之后,在下一个报文开始传送之前或是确认总线空闲之前发出8个隐性位跟随在间歇的后面。
如果这个时候有一个报文从其他的节点发过来,则这个节点就成为了接收器。
错误处理机制错误侦测下标是几个错误类型:
错误类型
出错条件
出错域
帧测单元
比特错误
bit error
发送的位值与所监控的位值不相符合(填充比特和ACK比特除外)
数据帧(SOF~EOF)
远程帧(SOF~EOF)
错误帧
过载帧
发送单元
接收单元
填充错误stuff error
侦测到6个连续相同的电平
数据帧(SOF~CRC)
远程帧(SOF~CRC)。
网络上搜到的CAN错误笔记CAN笔记再再续1、CAN错误检测(Error Detection)CAN网络具有严格的错误诊断功能,该功能已固化在硅片之中,一旦错误被检测,正在传送的数据帧将会立即停止而待总线空闲时再次重发直至发送成功,该过程并不需要CPU的干涉除非错误累计该发送器退隐(Bus Off)。
CAN控制器可检测如下五种错误:√ 位错误(Bit Check Error)发送器在发送比特流的同时也对发出的比特流采样回收,若送出的bit与所期待的bit不合,则会检测到一个Bit Check Error;√ 位填充错误(Bit Stuff Error)在需要执行位编码规则的位流序列中检测到第6个连续的极性相同的位序流时,则检测到一个Bit Stuff Error;√ CRC 错误(CRC Error)发送端送出的CRC序列由发送器算出,接收器执行同样的CRC算法,若计算结果与接收到的CRC序列不符,一个CRC Error被检测到,由发送端送出;√ 帧格式错误( Check Error)当一个固定形式的位场含非法位,则检测到一个 Check Error(接收端检测到帧结束最后一位为显性时帧错误忽略);√ 应答错误(Acknowledgment Error)ACK SLOT采样为隐性,则检测到一个Acknowledgement Error;2、CAN错误界定(Error Confinement)CAN控制器内置两个错误计数器:Receive Error Counter及Tranmit Error Counter(错误计数器的计数规则后附)。
当某个计数器的当前值达到128时,CAN控制器将进入“Error Passive Mode”,此时该节点仍然参与CAN通讯,检测到错误时只能发送“Error Passive Flag”,且错误帧发送完毕重启下一个发送之前有8bits位时的挂起状态;当Tranmit Error Counter当前值为255接着又一个错误被检测到时,CAN控制器将进入“Bus Off Mode”,此时该节点与总线完全脱离,整个瘫痪;计数器当前值均小于128时,CAN控制器被标识为“Error Active Mode”,CAN节点可正常通讯并检测到错误时发送“Error Active Flag”。
can错误类型和界定9.2.4 错误类型和界定1. 错误类型有以下5种不同的错误类型(这5种错误不会相互排斥)(1)位错误(Bit Error)节点在发送位的同时也对总线进行监视。
如果所发送的位值与所监视的位值不相符合,则在此位时间里检测到一个位错误。
但是在仲裁场(Arbitration Field)的填充位流期间或应答间隙(ACK Slot)发送一“隐性”位的情况是例外的——此时,当监视到一“显性”位时,不会发出位错误。
当发送器发送一个“认可错误”标志但检测到“显性”位时,也不视为位错误。
(2)填充错误(Stuff Error)如果在使用位填充法进行编码的报文中,出现了6个连续相同的位电平时,将检测到一个填充错误。
(3)CRC错误(CRC Error)CRC序列包括发送器的CRC计算结果。
接收器计算CRC的方法与发送器相同。
如果计算结果与接收到CRC序列的结果不相符,则检测到一个CRC错误。
(4)格式错误(Form Error)当一个固定形式的位场含有1个或多个非法位,则检测到一个格式错误。
(注意:接收器的帧末尾最后一位期间的显性位不被当作帧错误)(5)应答错误(Acknowledgment Error)只要在应答间隙期间所监视的位不为“显性”,则发送器会检测到一个应答错误。
2. 错误信号的发出检测到错误条件的节点通过发送错误标志指示错误。
对于“错误激活”的节点,错误信息为“激活错误”标志”;对于“错误认可”的节点,错误信息为“认可错误”标志。
节点检测到无论是位错误、填充错误、形式错误,还是应答错误,这个节点会在下一位时发出错误标志信息。
如果检测到的错误的条件是CRC错误,错误标志的发送开始于ACK界定符之后的位(除非其他错误条件引起的错误标志已经开始)。
3. 故障界定(1)CAN的3种故障状态①错误激活(Error Active)“错误激活”的节点可以正常地参与总线通信,并在错误被检测到时发出“激活错误”标志。
一文读懂CAN通讯错误帧当前CAN总线通讯技术已经运用于各行各业之中,基本是每个总线设计工程师必学的一个通讯网络。
但什么是CAN通讯中的错误帧,很多人还是处于只知其名,不知其所以然的状态,也因此造成许多工程师在明知总线通讯出现问题却束手无策的困扰。
1.1.1 错误标定检测到错误条件的站通过发送错误标志指示错误。
对于“错误主动”的节点,错误信息为“主动错误标志”,对于“错误被动”的节点,错误信息为“被动错误标志”。
站检测到无论是位错误、填充错误、形式错误,还是应答错误,这个站会在下一位时发出错误标志信息。
只要检测到的错误的条件是CRC错误,错误标志的发送开始于ACK界定符之后的位(其他的错误条件除外)。
1.2 故障界定至于故障界定,单元的状态可能为以下三种之一:●‘错误主动’●‘错误被动’●‘总线关闭’“错误主动”的单元可以正常地参与总线通讯并在错误被检测到时发出主动错误标志。
“错误被动”的单元不允许发送主动错误标志。
“错误被动”的单元参与总线通讯,在错误被检测到时只发出被动错误标志。
而且,发送以后,“错误被动”单元将在初始化下一个发送之前处于等待状态。
(见“挂起发送”)“总线关闭”的单元不允许在总线上有任何的影响(比如,关闭输出驱动器)。
在每一总线单元里使用两种计数以便故障界定:●发送错误计数●接收错误计数这些计数按以下规则改变(注意,在给定的报文发送期间,可能要用到的规则不只一个):●当接收器检测到一个错误,接收错误计数就加1。
在发送主动错误标志或过载标志期间所检测到的错误为位错误时,接收错误计数器值不加1。
●当错误标志发送以后,接收器检测到的第一个位为“显性”时,接收错误计数值加8。
●当发送器发送一错误标志时,发送错误计数器值加8⏹例外情况1:发送器为“错误被动”,并检测到一应答错误(注:此应答错误由检测不到一“显性”ACK 以及当发送被动错误标志时检测不到一“显性”位而引起)。
⏹例外情况2:发送器因为填充错误而发送错误标志(注:此填充错误发生于仲裁期间。
CAN为什么会发送失败CAN总线调试过程中出现报文发送失败,很多工程师都对此只知其一不知其二,这里就CAN报文发送失败的问题我们来做一次探讨。
在了解CAN报文为什么会发送失败之前我们先看看一条正确的CAN报文到底应该是怎么样的,表1是一个正常标准数据帧的报文组成。
表 1 标准数据帧报文格式组成图 1 标准数据帧格式CAN总线是一种基于广播的通讯方式,为了保证总线上的每一个正常节点都能正确的接收到报文,报文的发送者要求每一个接收节点在报文发送结束前要作出应答,这也是报文里ACK存在的原因。
一帧CAN报文中ACK段长度为2个位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimter)。
在应答场里,发送站发送两个隐性位。
当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK Slot)期间(发送ACK信号)向发送器发送一“显性”的位以示应答。
应答间隙:所有接收到匹配CRC序列(CRC SEQUENCE)的站会在应答间隙(ACK Slot)期间用一显性的位写入发送器的隐性位来作出回答。
应答界定符:ACK界定符是ACK场的第二个位,并且是一个必须为隐性的位。
因此,应答间隙(ACK Slot)被两个隐性的位所包围,也就是CRC界定符(CRC Delimter)和ACK界定符(ACK Delimter)。
图 2 正常ACK段报文而如果总线上没有ACK应答(即应答间隙为隐性),发送器就会发送一个错误标志,并且发送错误计数器值加8,节点就会对报文进行自动重发,若自动重发依然收不到ACK,则在发送错误计数器计数满128后(即出现16帧错误帧),由错误主动转为错误被动状态,如图3所示。
那导致ACK段出错的原因有哪些呢?●总线上只有一个有效节点:发送报文的节点在发送出一帧报文后会检测总线上应答间隙的状态,如果检测到应答间隙为隐性位,则表示该帧报文没有得到ACK,发送失败,需要重发,而由于发送错误计数器会在发送失败后累加,直到该节点关闭。
CAN总线错误处理CAN怎样处理错误错误处理内建在CAN协议中,对CAN系统的运行十分重要。
错误处理的目标是检测CAN总线上出现的报文中的错误,从而传送器可以重传出错的报文。
总线上的每个CAN控制器都会尝试检测报文中的错误。
如果发现错误,发现节点将传送一个错误标志,从而中断总线通信。
其它节点将检测错误标志导致的错误(如果它们尚未检测到初始错误)并采取合适的措施(例如丢弃当前报文)。
每个节点维护两个错误计数器:传送错误计数器和接收错误计数器。
有几个规则规定这些计数器怎样增加和/或减少计数。
总的来讲,检测到故障的传送器增加其传送错误计数器比侦听节点增加其接收错误计数器要快。
这是因为,很有可能是传送器发生了故障!当任何错误计数器增加到超过某个值时,节点将首先进入“错误被动”,也就是说,它在检测到错误时不会积极地阻止总线通信,然后“离开总线”,这意味着节点根本不参与总线通信。
使用错误计数器,CAN节点不但可以检测故障,而且可以执行错误限制。
错误检测机制CAN协议定义了五种以上不同的方法来检测错误。
其中两种工作在位层次,另外三种工作在报文层次。
位监视位填充帧检查应答检查循环冗余检查1. 位监视CAN总线上的每个传送器都会监视(也就是回读)传送的信号电平。
如果真正读到的位电平与传送的位电平不同,会发出信号指示位错误(仲裁过程中不会发出位错误)。
2. 位填充节点连续发送五个具有相同电平的位后,将在发送出去的位流中加上第六个相反电平的位。
接收方将删除这个额外的位。
这样做是为了避免总线上出现过度的直流电成分,但它同时也给予了接收方检测错误的额外机会:如果总线上出现五个以上相同电平的连续位,会发出信号指示填充错误。
3. 帧检查CAN报文的一些部分具有固定的格式,也就是说,标准明确定义了何种电平和何时出现这种电平(CRC定界符、ACK定界符、帧结束以及间歇,但是间歇还有一些另外的特殊错误检查规则)。
如果一个CAN控制器在这些固定字段中的一个中检测到无效值,将发出组成错误。
CAN总线的原理及故障诊断概述我国当前多数轿车的控制系统之间的通信,还是采用模拟信号,相互间的通信需要一对一的导线连接。
随着新技术的发展,车上的控制系统越来越多,连接的导线大量增加,占用了轿车内有限的空间,消耗大量可贵的金属铜,而且系统的运算速度和精确度都很低,抗干扰能力也差,出现故障后在线束中查找非常困难,这些问题都严重的制约着车用计算机系统的发展。
有了数字信号和数字控制技术,CAN总线网络通信技术使计算机系统间的通信成为现实,可靠性得到进一步提高,它仅用一条双绞线,即能连接全车所有控制系统,达到信息共享,减少布线,降低成本,提高总体可靠性的目的,它是电控自动化过程控制网络通信的新技术。
在国外汽车产业发达国家CAN总线已处于比较成熟阶段,早些年,主要用于奔驰、宝马、凌志LS430等高档车。
在我国起步较晚,引进车型用于奥迪、宝来等中级轿车,近年由于成本降低,已用于经济型轿车,如菲亚特派朗、奇瑞A5等。
CAN总线网络通信技术必成为我们汽车行业电控维修技师学习的新技术,但是在专业的汽车局域网技术书丛中用了大量的网络与计算机的专业语言,一般汽车维修专业人员未学过这类知识,跨行业读书有一定的困难。
本文用通俗的语言,简单介绍它的一般工作原理及检修的基本方法,使读者学到CAN总线的入门知识。
一、CAN总线网络技术的构造和工作原理(一)CAN总线简介CAN总线是一种新兴的现场总线,CAN(ControllerAreaNetwork)即控制器局域网络,在汽车行业中又称汽车局域网技术,它属于总线串行通信网络,通讯介质可以选用双绞线,同轴电缆和光纤。
在汽车网络中,许多汽车制造商都使用专用双绞线,由于该系统采用了许多新技术和独特的设计,使得基于CAN总线构建的系统具有优良的特点:如良好的故障隔离能力,可靠性高,实时响应性能好,通信速率高,还有较好的检错措施,使数据传输的出错率降至极低。
由于具有这些特点,非常适合在多个独立的计算机管理系统中作通信。
【原理解析】一文读懂CAN节点错误管理机制CAN节点的稳定性、可靠性和安全性得益于其强大的错误管理机制。
那么,CAN节点为什么能感知错误?又是如何响应错误?您是否能清晰地想象出这一过程?本文将为大家详细分析CAN节点错误管理的工作过程。
节点电路构成如图1所示,MCU作为主控制器,完成CAN控制器和功能电路的控制。
图1 CAN节点组成框图CAN控制器是工作于数据链路层的器件,集成了CAN规范中数据链路层的全部功能,其功能由软件和硬件共同实现,从设备供应商买回来的CAN控制器已经把相应的逻辑固化在其硅片之中;MCU是工作于应用层的器件,其功能由软件和硬件共同实现,MCU运行的程序可由设计者灵活设计,以实现CAN节点的特定功能;CAN收发器工作于物理层,其功能完全由硬件实现,其作用是将CAN控制器的逻辑电平转化为CAN总线的模拟差分信号,以及把总线模拟差分信号转换成CAN控制器的逻辑电平。
CAN节点的错误管理属于CAN通信规范数据链路层的内容,具体来说,错误管理是通过MCU和CAN控制器来实施的。
可以说,CAN控制器是错误管理的基础设施,我们可以从两个方面理解其工作逻辑:一是如何感知错误,二是如何响应错误。
注:1、本文所说的CAN规范指的是德国BOSCH公司的《CANSpecification Version 2.0》。
节点如何感知错误?如前文所述,节点对总线错误的识别是通过CAN控制器来完成的。
CAN控制器输出给收发器发送引脚TX的逻辑信号位会从收发器接收引脚RX接收,这使得CAN控制器可以在发送一个逻辑位期间同时监测总线的实际电平值。
CAN控制器检测总线错误原理如图2所示:图2 监测总线错误原理图如图2描述,CAN控制器监测一个总线电平的电平值是在采样点位置进行的,判断是否出现错误是在信息处理时间内完成的。
综上所述,CAN控制器对错误的识别可概括为:无论是作为发送器还是接收器,在采样点位置成功监测到当前总线的实际电平值后,CAN控制器便按照CAN规范中描述的错误管理规则判断是否出现错误。
以前曾经有一段时间认真的想过CAN数据报文中的ACK应答机制问题,原以为自己想通了,但前两天又再想想,觉得还是没有想清楚故将其放到论坛上,虽然到如今还没有人来回复,但通过与一些朋友的确认,发现自己犯了一个不小错误,对协议本身的理解产生了错误,以至后来竟无法找到答案,改换过前提后,问题得以解决。
下面将此次思考的情况一一列出,以希各位同道中的朋友不要再
犯与我相似之低级错误:)
CAN协议里对ACK(应答场)有如下的描述:
应答场长度为2 个位,包含应答间隙(ACK SLOT)和应答界定符(ACK DELIMITER)。
在应答场里,发送站发送两个“隐性”位。
当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK SLOT)期间(发送ACK 信号)向发送器发送一“显性”的位以示应答。
应答间隙:所有接收到匹配CRC 序列(CRC SEQUENCE)的站会在应答间隙(ACK SLOT)期间用一“显性”的位写入发送器的“隐性”位来作出回答。
ACK 界定符:ACK 界定符是ACK 场的第二个位,并且是一个必须为“隐性”的位。
因此,应答间隙(ACK SLOT)被两个“隐性”的位所包围,也就是CRC 界定符(CRC DELIMITER)和ACK 界定符(ACK DELIMITER)。
此主题相关图片如下:
在CAN协议的错误检测部分有这样的描述:
位错误:站单元在发送位的同时也对总线进行监视。
如果所发送的位值与所监视的位值不相符合,则在此位时间里检测到一个位错误(BIT ERROR)。
但是在仲裁场(ARBITRATION FIELD)的填充位流期间或ACK间隙(ACK SLOT)发送一“隐性”位的情况是例外的——此时,当监视到一“显性”位时,不会发出位错误(BIT ERROR)。
应答错误:只要在ACK 间隙(ACK SLOT)期间所监视的位不为“显性”,则发送器会检测到一个应答错误(ACKNOWLEDGMENT ERROR)。
从协议所描述的内容来看,我们不难得出一个结论:CAN是一种基于广播的通讯方式,为了保证总线上的每一个节点(处于normal mode)都能正确的接收到报文,报文的发送者要求每一个接收节点在报文发送结束前,也就是ACK slot 的时间内,作出应答,即要求接收的节点都在这个时间发送一个“显性”位。
发送者在发送的同时,会监视总线上的数据,如果与发送的娄据不一致,则表示发送失败或自己失去仲裁,立即停止发送或转入接收模式。
如果有一个节点在ACK SLOT的时间内发送“显性”位,则发送者认为此次发送报文成功;如果发送者检测到ACK SLOT为隐性位,则表示没有节点填充ACK SLOT,则发送者会检
测到这个隐性位而知道发送失败,此条报文需要重发。
所以,当总线上只有一个节点的时候,或是只有一个节点可以收发数据的时候,这个节点是发不出去数据的,因为它所发出的数据帧中的ACK SLOT没有另外一个节点来填充,将永远是隐性位,这个节点会一直重发数据直到发送成功或发送被取消。
(注:一:总线上只有一个节点而且它向外发送了数据。
它确实不会收到任何ACK,它会变成“error passive”但是它不会变成BUS off。
why?请参考CAN specificaton 2.0-partB-Fault_Confinement--rule3--exception1 二:其它检测到CRC 错误的节点不会马上发送错误帧,而是在ACK delimiter之后才发送。
请参考CAN specificaton 2.0-partB-Error_Signalling)
ACK SLOT只有一个BIT,而接下去的ACK delimiter始终为隐性(我们可认为是1),当数据到达ACK SLOT的时候,所有的节点都会发送显性位(我们可以认为是0),而发送者在ACK这个时间里保持隐性位(即发送者在发送的时候ACK SLOT 为1),这时发送者会检测总线上的ACK时间内的信号,如果是0,则表示正确,如果是1,表示有错误。
如果当中有某一个节点在ACK SLOT 填入隐性位,则总线上同样还是显性位电平,故只要总线上有一个节点正确接收到数据,则ACK SLOT就会被填入显性电平;那么,接收错误的节点如何来告知发送者此次发送不成功呢?这时候就要用到CAN的错误帧,当一个接收者收到错误的数据的时候,它立即开始发送一个错误帧,则接下去总线上的信号就是这个错误帧,其它的节点和发送者也都会收到这个错误帧,那所有的节点都知道出错了,接收者会丢掉此次消息,而发送者会试图重发此次消息。
这才是ACK SLOT真正的含义。
下面我们通过一个实例来看看CAN节点是如何进行ACK SLOT的动作的。
我们抓取一个总线上面的信号波形,此波形已经是通过82C251解码过后的。
此主题相关图片如下:
抓取的波形,图中的四个通道分别表示两个节点的CANTX和CANRX,其中通道A,B表示NODE 1 的CANTX和CANRX,通道C,D表示NODE 2 的CANTX 和CANRX。
将其正对坐标中轴的部分展开,得到如下的图形,由上图我们清楚的看到,NODE 1的CANTX在接收到数据后立即响应,即向外发送数据,当数据发送完毕,到了ACK的时间内,见下图中黄色图标处,NODE 1的CANTX 发送两个隐性位,而对于NODE 2,当发送者NODE 1的CANTX到了报文的ACK时间,NODE2也接收完数据,如果CRC校验通过,则NODE2的CANTX 会相应的发送显性位,即通道C的红色图标处。
如果总线上存在NODE 3和NODE 4或是更多NODE,则波形相同。
图中的B和D都是CANRX,所以都有ACK 的显性位出现。
此主题相关图片如下:
我们认为,发送者在发数据的时候,CANTX在发送数据,而CANRX同时也在接收数据,当发送者发送ACK为隐性时,接收到的ACK SLOT一定要是显性才会正确。
那么,当有节点正确接收到了数据,在ACK SLOT填上显性位后,接收错误的节点这时候会如何呢?接收错误的节点就会马上发送错误帧,一般是发送连续的6个0或1,根据CAN的位填充原理,当有五个连续的0或1出现时,为了传送中的同步,必须插入一个反相位的BIT作为填充位,如果连续出现6
个或以上的相同信号,则此次传送错误,数据将被丢弃。
故当发送者收到这个错误帧后,便会知道发送出错,并试图重发数据。