CAN通讯的总结

来源:互联网 发布:blued同志软件下载 编辑:程序博客网 时间:2024/05/16 18:58

1.CAN通讯有2套国际标准,2套协议版本,3种故障状态,4种数据帧类型,5种总线错误类型。

2.CAN的国际标准有两种ISO11898ISO11519

3.CAN2.0协议分为A版和B版两种,A版协议仅支持11位标识符(称为标准帧),B版协议兼容11位,向上扩展到19位标识符(称为扩展帧)。

4.CAN总线中,任何一个节点发生了错误,那么这个节点可能处于3种故障状态:错误主动状态,错误被动状态,离线状态。错误主动状态:可以正常参加总线通讯,检测出错误时,输出主动错误标志。错误被动状态:是易引起错误的状态,虽然能参加总线通讯,但为不妨碍其他节点通讯,接收时不能积极的发送错误通知,处于被动错误状态的节点即时检测出错误,而其它处于主动错误状态的节点如果没有发现错误,整个总线也被认为没有错误。离线状态:不能参加总线通讯的状态。

4.CAN总线中有5类错误,这5类错误并不具有排他性,可以同时发生。CAN总线在任意时刻,只有一个节点在发送数据,其他所有节点都是在接收,只有对应的ID报文节点对接收的报文做出应答反应。

5.位错误(Bit Error):节点是边发送边检听对应的位,发送的位和检测的位如果不一致,则检测到一个位错误。

6.填充错误(Stuff Error)监听到6个连续相同的为电平时,则检测到一个位填充错误。

7.CRC错误(CRC Error)发送节点会对报文的帧起始,仲裁场,数据场进行CRC计算,求出CRC校验码,并将其也发送出去。接收节点在接收到数据后,会根据CRC校验码来判断接收到的数据在传送过程中是否出错。

8.形式错误()一个固定形式的位场中含有非法位时,则检测到一个形式错误。

9.应答错误()只要在应答期间所监听的位不为显性,则发送器检测到一个应答错误。

应答场包括应答位和应答分隔符,发送节点发送的这两位均为隐性电平,这时只有正确接收报文的接收节点发送显性电平来覆盖它。

11.串口通信是一对一的通信,SPI的通信是一对多的通信。CAN的一大特点,多主机串行通信:也就是在总线空闲时,所有单元都可以发送消息,最先访问的节点可以获得发送权,若多个节点认为自己获得发送权同时开始发送数据时,根据ID的优先级来竞争总线的发送权。总线上的节点没有类似于MAC物理地址的信息,所以在总线上增减单元时,连接在总线上的其他单元的软硬件及应用层都不需要改变。单元根据报文ID决定接收或者屏蔽该报文,报文ID在一定程度上也决定了此帧数据的优先级,发送的信息遭到破坏后,可自动重发;节点在错误严重的情况下具有自动退出总线的功能。

12.CAN总线上所有的节点都可以检测错误,检测出错误的单元会立刻通知其他所有单元。正常发送的节点一旦检测出错误,会强制结束当前的发送,强制结束发送的节点会不断反复的发送此信息直到成功发送为止,或进入总线关闭状态。

13.CAN总线上的信号使用差分电压进行传送,两条信号线被称为CAN_H CAN_L,静态时均是2.5v左右,这时的状态表示逻辑1,也称为隐性电平,通常CAN_H3.5CAN_L1.5时,表示为逻辑0,称为显性电平。

14.DSP的CAN模块的引脚在发送数据的同时,其接受引脚也在监听所发送的数据,也就是,发送数据的时候,接受引脚上也会有相应的波形可以在示波器上显示。如果CAN总线上只有发送节点,却没有接受节点,那么这个发送节点会一直发送数据直到发送成功为止,也就是收到有效的应答信号。

15.CAN协议里对ACK(应答场)有如下的描述:

应答场长度为2 个位,包含应答间隙(ACK SLOT)和应答界定符(ACK DELIMITER)。在应答场里,发送站发送两个“隐性”位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK SLOT)期间(发送ACK 信号)向发送器发送一“显性”的位以示应答。

15.应答间隙:所有接收到匹配CRC 序列(CRC SEQUENCE)的站会在应答间隙(ACK SLOT)期间用一“显性”的位写入发送器的“隐性”位来作出回答。ACK 界定符:ACK 界定符是ACK 场的第二个位,并且是一个必须为“隐性”的位。因此,应答间隙(ACK SLOT)被两个“隐性”的位所包围,也就是CRC 界定符(CRC DELIMITER)和ACK 界定符(ACK DELIMITER)。

16.在CAN协议的错误检测部分有这样的描述:

位错误:站单元在发送位的同时也对总线进行监视。如果所发送的位值与所监视的位值不相符合,则在此位时间里检测到一个位错误(BIT ERROR)。但是在仲裁场(ARBITRATION FIELD)的填充位流期间或ACK间隙(ACK SLOT)发送一“隐性”位的情况是例外的—— 此时,当监视到一“显性”位时,不会发出位错误(BIT ERROR)。应答错误:只要在ACK 间隙(ACK SLOT)期间所监视的位不为“显性”,则发送器会检测到一个应答错误(ACKNOWLEDGMENT ERROR)。

17.发送者在发送的同时,会监视总线上的数据,如果与发送的娄据不一致,则表示发送失败或自己失去仲裁,立即停止发送或转入接收模式。如果有一个节点在ACK SLOT的时间内发送“显性”位,则发送者认为此次发送报文成功;如果发送者检测到ACK SLOT为隐性位,则表示没有节点填充ACK SLOT,则发送者会检测到这个隐性位而知道发送失败,此条报文需要重发。所以,当总线上只有一个节点的时候,或是只有一个节点可以收发数据的时候,这个节点是发不出去数据的,因为它所发出的数据帧中的ACK SLOT没有另外一个节点来填充,将永远是隐性位,这个节点会一直重发数据直到发送成功或发送被取消。

18.(注:一:总线上只有一个节点而且它向外发送了数据。它确实不会收到任何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)

19.ACK SLOT只有一个BIT,而接下去的ACK delimiter始终为隐性(我们可认为是1),当数据到达ACK SLOT的时候,所有的节点都会发送显性位(我们可以认为是0),而发送者在ACK这个时间里保持隐性位(即发送者在发送的时候ACK SLOT 为1),这时发送者会检测总线上的ACK时间内的信号,如果是0,则表示正确,如果是1,表示有错误。如果当中有某一个节点在ACK SLOT填入隐性位,则总线上同样还是显性位电平,故只要总线上有一个节点正确接收到数据,则ACK SLOT就会被填入显性电平;那么,接收错误的节点如何来告知发送者此次发送不成功呢?这时候就要用到CAN的错误帧,当一个接收者收到错误的数据的时候,它立即开始发送一个错误帧,则接下去总线上的信号就是这个错误帧,其它的节点和发送者也都会收到这个错误帧,那所有的节点都知道出错了,接收者会丢掉此次消息,而发送者会试图重发此次消息。这才是ACK SLOT真正的含义。

20.我们认为,发送者在发数据的时候,CANTX在发送数据,而CANRX同时也在接收数据,当发送者发送ACK为隐性时,接收到的ACK SLOT一定要是显性才会正确。那么,当有节点正确接收到了数据,在ACK SLOT填上显性位后,接收错误的节点这时候会如何呢?接收错误的节点就会马上发送错误帧,一般是发送连续的601,根据CAN的位填充原理,当有五个连续的01出现时,为了传送中的同步,必须插入一个反相位的BIT作为填充位,如果连续出现6个或以上的相同信号,则此次传送错误,数据将被丢弃。故当发送者收到这个错误帧后,便会知道发送出错,并试图重发数据。

0 0
原创粉丝点击