【转载】关于CAN报文中ACK检测错误原理.doc

【转载】关于CAN报文中ACK检测错误原理.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【转载】关于CAN报文中ACK检测错误原理

以前曾经有一段时间认真的想过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解码过后的

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档