CAN总线数据链路层分析(四)

在SPI通信中,片选、时钟信号、数据输入及数据输出这四个信号都有单独的信号线。而CAN使用的是两条差分信号线,只能表达一个信号。简洁的物理层决定了CAN必然要配上一套更为复杂的协议。如何用一个信号通道实现同样甚至更强大的功能,答案就是对数据或操作命令进行打包。

一、通信机制

1.1 多主机(Multi-Master)

安全敏感的应用(如汽车动力)对通信系统的可靠性要求很高。将总线能否正常工作归结到单一节点是非常危险的,比较合理的方案是对总线接入的去中心化,即每个节点都有接入总线的能力。这也是CAN总线采用多主控(Multi-Master)线性拓扑结构的原因。

在CAN总线上,每个节点都有往总线上发送消息的能力,而消息的发送不必遵从任何预先设定的时序,通信是事件驱动的。只有当有新的信息传递时,CAN总线才处于忙碌的状态,这使得节点接入总线速度非常快。CAN总线理论最高数据传输速率为1Mbps,对于异步事件反应迅速,基本对于ms级别的实时应用没有任何问题。

1.2 寻址机制

不同于其它类型的总线,CAN总线不设定节点的地址,而是通过消息的标识符(Identifier)来区别消息。这种机制虽然会增加消息的复杂度(增加标识符),但是节点在此情况下可以无需了解其他节点的状况,而相互间独立工作。在总线上增加节点时仅需关注消息类型,而非系统上其他节点的状况。这种以消息标识符寻址的方式,让总线上增加节点变得更加灵活。

1.3 总线访问CSMA/CD+AMP

CAN总线通信原理可简单描述为多路载波侦听+基于消息优先级的冲突检测和非破坏性的仲裁机制(CSMA/CD+AMP)。

CSMA(Carrie Sense Multiple Access)指的是所有节点必须都等到总线处于空闲状态时才能往总线上发送消息;

CD+AMP(Collision Detection + Arbitration on Message Priority)指的是如果多个节点往总线上发送消息时,具备最高优先级的消息获得总线。

多路载波侦听

网络上所有节点以多点接入的方式连接在同一根总线上,且发送数据是广播式的。网络上各个节点在发送数据前都要检测总线上是否有数据传输:若网络上有数据,暂时不发送数据,等待网络空闲时再发;若网络上无数据,立即发送已经准备好的数据。

冲突检测

节点在发送数据时,要不停的检测发送的数据,确定是否与其他节点数据发送冲突,如果有冲突,则保证优先级高的报文先发送。

发送低优先级报文的节点退出仲裁后,在下次总线空闲时自动重发报文

非破坏性仲裁机制

通过ID仲裁,ID数值越小,报文优先级越高。

高优先级的报文不能中断低优先级报文的发送

1.4 报文接收过滤(硬件过滤&软件过滤)

CAN控制器大多具有根据ID过滤报文的功能,即只接收某些ID的报文。节点对接收到的报文进行过滤:比较消息ID与选择器(Accepter)中和接受过滤相关位是否相同。如果相同,接收;如果不相同,则过滤。

二、CAN的报文种类及结构

在原始数据段的前面加上传输起始标签、片选(识别)标签、控制标签,在数据的尾段加上CRC校验标签、应答标签和传输结束标签。把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了。各种各样的标签,起到了协同传输的作用。当整个数据包被传输到其他设备时,只要这些设备按格式去解读,就能还原出原始数据。类似这样的数据包就被称为CAN的数据帧。

为了更有效的控制通信,CAN一共规定了5中类型的帧,帧也称为报文。

2.1 数据帧

数据帧在CAN通信中最主要,也最复杂。数据帧以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束。CAN总线的数据帧有标准格式(Standard Format)和扩展格式(Extended Format)的区分。

数据帧可以分为七段:

帧起始(SOF)

标识一个数据帧的开始,固定一个显性位。 ​ 用于同步,总线空闲期间的任何隐性到显性的跳变都将引起节点进行硬同步。只有总线在空闲期间节点才能够发送SOF。

仲裁段(Arbitration Field)

仲裁段的内容主要为本数据帧的ID信息。数据帧分为标准格式和扩展格式两种,区别就在于ID信息的长度:标准格式的ID为11位;扩展格式为29位。在CAN协议中,ID决定着数据帧发送的优先级,也决定着其他设备是否会接收这个数据帧。 仲裁段除了报文ID外,还有RTR, IDE, SRR位。

控制段

在控制段,r1(reserved1)和r0(reserved0)为保留位,默认设置为显性位。最主要的是DLC(Data Length Code)段,它是用二进制编码表示本报文中的数据段包含多少个字节。DLC段由4位组成,DLC3−DLC0,表示的数字为0-8. ​

数据段

数据帧的核心内容,有0-8个字节长度,由DLC确定。

CRC段

 

为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收端计算出的CRC码跟接收到的CRC码不同,就会向发送端反馈出错信息以及重新发送。CRC部分的计算和出错处理一般由CAN控制器硬件完成,或由软件控制最大重发数。

在CRC校验码之后,有一个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK段隔开。

ACK段

包含确认位(ACK slot)和界定符(Delimiter, DEL)。ACK在发送节点发送时,为隐性位。当接收节点正确接收到报文时,对其用显性位覆盖。DEL界定符同样为隐性位,用于隔开。

帧结束段(End-of-Frame, EOF)

帧结束段由发送端发送7个隐性位表示结束。

2.2 远程帧

(暂略)

2.3 错误帧

CAN网络具有严格的错误诊断功能,该功能已固化在硅片之中,一旦错误被检测,正在传送的数据帧将会立即停止而待总线空闲时再次重发直至发送成功,该过程并不需要CPU的干涉除非错误累计该发送器进入总线关闭( Bus Off )。经过计算,正常使用的CAN总线约一千年才会漏检出一个错误!

错误检测

可检测的错误有:位错误(Bit Error)、填充错误(Stuff Error)、ACK错误(ACK Error)、格式错误(Form Error)、CRC错误(CRC Error)。

位检测->位错误

节点检测到的位与自身送出的位数值不同。

Exception:口仲裁或ACK位期间送出“隐性”位,而检测到“显性”位不导致位错误

填充检测->填充错误

在使用位填充编码的帧场(帧起始至CRC序列)中,不允许出现六个或更多连续相同的电平位。

CRC检测->CRC错误

接收节点计算的CRC序列与接收到的CRC序列不同。

格式检测->格式错误

固定格式位场(CRC界定符、ACK界定符、帧结束)检测到一个或更多显性位。

ACK检测->ACK错误

发送节点在ACK位期间未检测到“显性”位。

错误通知

错误管理的重要概念( ISO11898 )

 1. Fault confinement(错误界定)

CAN nodes shall be able to distinguish short disturbances from permanent failures.Defective transmitting nodes shall be switched off. Switched off means a node is logically disconnected from the bus, so that it can neither send nor receive any frames.
CAN节点可以区分常规错误和永久故障。有故障的发送节点将切换到离线状态。离线意味着在逻辑上与总线断开,既不能发送也不能接收。

2. Error-active(主动错误)

An error-active node shall normally take part in bus communication and send an active error flag when an error has been detected. The active error flag shall consist of six (6) consecutive dominant bits and shall violate the rule of bit stuffing and all fixed formats appearing in a regular frame .

处于主动错误状态的节点能正常参与总线通信的收发和当检测到错误时将发送动错误标志, 错误标志由6个连续的显示位组成(这种连续的6个显示位与常规的填充位和其它帧固定格式不相同,正因为如此,硬件才容易区别)。

3. Error-passive (被动错误)
An error-passive node shall not send an active error flag. It takes part in bus communication, but when an error has been detected a passive error flag shall be sent.The passive error flag shall consist of six (6) consecutive recessive bits. After transmission, an error-passive node shall wait some additional time before initiating a further transmission .
处于被动错误状态的节点不能发送主动错误标志。它能参与正常通信,但当检测到错误时发送的是被动错误标志。被动错误标志由6个连续的隐性位组成。当发送结束后,处于被动错误状态的节点在下一次再次发送时之前需要等待一些额外时间。

4. Bus-off (离线)
A bus-off state shall not have any influence on the bus. It shall neither send any frames nor send ACK, error frames, overload frames. Whether such a node receives frames from the bus depends on the implementation.
Bus off 状态下节点不允许对总线产生任何影响,此时节点既不会发送任何报文或是发送ACK应答、错误帧、过载帧。节点是否能够接收总线报文取决于实际应用情况。

5. TEC&REC (发送错误计数器&接收错误计数器)
CAN协议描述的出错管理,完全由硬件通过发送错误计数器(CAN_ ESR寄存器里的TEC域),软件可以读出它们的值来判断CAN网络的稳定性。

  • 每个节点都含有REC和TEC
  • 当接收错误产生时,REC增加;
  • 正确接收到数据帧,REC减少
  • 当发送错误产生时,TEC增加;
  • 正确发送一帧数据帧,TEC减少;
  • REC、TEC的数值会引发节点状态改变

6. 节点的三种状态

  • Error Active

正常的进行总线通信错误产生时,发送主动错误帧

  • Error Passive

能够进行总线通信错误产生时,发送被动错误帧

  • Bus Off

不能收发任何报文

特例:如果总线上只有一 个节点,该节点发送数据帧后得不到应答,TEC最大只能计到128,即节点只会进入被动错误状态而不会进入总线关闭状态

错误通知

总线通信错误以向总线上发送错误帧作为标志。

  • 检测错误->发送错误帧->通知报文错误
  • 错误帧的发送

位错误、填充错误、格式错误或ACK错误产生后>当前发送的下一-位发送错误帧
CRC错误->紧随ACK界定符后的位发送错误帧

  • 错误帧发送后->总线空闲时自动重发出错的数据帧!

错误帧的格式(包括错误标志与错误界定符)

  • 错误标志

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

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

  • 错误界定符

8个连续隐性位

错误标志的叠加

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

破坏填充规则,诱发其它节点发送错误标志;
破坏固定位场(CRC界定符、ACK界定符及EOF)的固定格式,诱发其它节点发送错误标志;

  • 0~6个错误标志叠加
  • 错误标志发送后,每个站都送出隐性位,并监视总线,直到检测到隐性位,此后开始发送剩余的7个隐性位。

  • 被动错误
  • 错误标志: 6个连续隐性位
  • 由发送节点发送的被动错误标志,会诱发接收节点发送错误标志,特例:

仲裁期间发送,如果有其它节点发送报文
ACK位发送

  • 由接收节点引起的被动错误标志不会诱发总线上的任何活动
  • 被动错误节点必须检测到总线上6个连续相同的极性位后,才认为错误标志被送出

错误帧的发送

  • 位错误

  • 格式错误

  • CRC错误

错误恢复

错误状态的转换关系

错误计数值得变动条件

Bus Off 问题现象分析

(暂略)

2.4 超载帧

(暂略)

2.5 帧间隔

(暂略)

三、位时序

 

四、同步

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章