打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CAN总线协议

1. CAN简介

  CAN是控制器域网 (Controller Area Network, CAN) 的简称。CAN属于总线式串行通信网络,网络拓扑结构如图1.1所示。

         

CAN总线网络拓扑结构

  CAN节点通过CAN_High、CAN_Low两根线接入CAN总线网络。CAN收发器将CAN控制器的CAN_TX输出的逻辑值0、1转换为差分信号,通过CAN_High、CAN_Low向总线输出;同时将总线上的差分信号转换为逻辑值0、1,通过CAN_RX传输给CAN控制器。CAN_High、CAN_Low的差分电压与逻辑值0、1的关系如图1.2所示。

  

图1.2 CAN的差分信号

  CAN总线为“线与”逻辑,0为显性,1为隐性,只要有一个节点输出0,总线即表现为0,所有节点都输出1时,总线才表现为1。 CAN控制器实现了CAN通信协议,应用程序通过CAN控制器提供的接口寄存器来实现数据报文的收发。

2. CAN数据报文帧结构

图2.1 CAN标准数据报文帧结构

  CAN数据报文分标准和扩展两种类型,这里只介绍常用的标准数据报文。如图2.1所示,CAN数据报文包含帧起始(SOF)、仲裁段、控制段、数据段、CRC段、ACK段、帧结束(EOF)这7个部分。

  帧起始占1位,值为0,表示一帧数据报文的开始,帧结束占7位,值都为1,表示一帧数据报文的结束。

  仲裁段包括11位的标识符ID和1位RTR;每个节点发送的数据报文使用独立的标识符ID,接收方可以通过标识符ID判断数据报文来自哪个节点;RTR指示该数据报文是数据帧还是遥控帧,RTR值为0时表示数据帧,值为1时表示遥控帧,遥控帧不含数据段,节点可以通过发送遥控帧来请求其它节点发送数据。当多个节点同时发送数据报文时,节点通过仲裁段来参与总线的竞争,竞争获胜的一方可继续发送数据报文。

  控制段包括1位IDE、1位r0、4位的DLC。IDE指示该数据报文属于标准数据报文还是扩展数据报文,IDE值为0时表示标准数据报文,值为1时表示扩展数据报文。DLC指示数据段的字节数(最大值应为8),r0值为0。

  实际要传输的数据放在数据段,占0 ~ 8个字节,即一帧数据报文最多只能携带8个字节的数据内容。数据段的字节数通过DLC指定。

  CRC段包含15位的CRC和1位CRC界定符。CRC的计算范围包括帧起始、仲裁段、控制端、数据段,接收节点在接收数据报文时也会计算CRC,与数据报文中的CRC进行比较,如果不一致会报CRC错误。CRC界定符的值为1。

  ACK段包括1位ACK槽和1位ACK界定符。发送节点在ACK槽输出1,接收节点如果正确接收到数据报文,会在ACK槽输出0作为应答。ACK界定符的值为1。

3. 总线仲裁

  当多个节点同时发送数据报文时,节点通过仲裁段来参与总线的竞争。节点向总线发送数据的同时会检测总线的电平状态。 如图3.1所示,在红线位置之前,节点A、B输出的位数据都相同,都是0或1;但在红线位置,节点A输出1,节点B输出0,由于CAN总线为”线与“逻辑,总线表现为0,节点A检测到总线为0,得知自己竞争总线失败,从下一位开始停止发送,转为接收。CAN的总线仲裁属于非破坏性仲裁技术,仲裁获胜的节点可不受影响继续传输数据,该节在仲裁段发送的位数据没有被破坏。

图3.1 总线仲裁

4. 位填充

  节点发送数据报文时,在数据报文的SOF至CRC段内,如果出现连续5个位的0,要在下一个位插入1, 如果出现连续5个位的1,则要在下一个位插入0 ,如图4.1所示。

图4.1 位填充

  节点接收数据报文时,要去掉填充位,即在数据报文的SOF~CRC 段内,如果发现连续5个位的0或连续5个位的1,要删除下一个位,即去掉填充位。

5. CAN错误帧、过载帧结构以及帧间隔

  在数据报文传输过程中,节点检测出总线错误后会发送错误帧。如图5.1所示,错误帧由错误标志和错误界定符构成,错误标志分主动错误标志(连续6个位的0)和被动错误标志(连续6个位的1)。处于主动错误状态的节点检测出错误时会发送带主动错误标志的错误帧,处于被动错误状态的节点在检测出错误时会发送带被动错误标志的错误帧。

  错误界定符是连续8个位的1。节点发送完错误标志后,从检测到总线的第一个1开始的连续8个位的1作为错误帧的界定符。

图5.1 错误帧结构

   节点检测出总线错误后会发送错误帧,错误帧是如何通知其它节点总线有错误?其它节点如何做出响应?下面分两种情况进行说明:

(1)发送数据报文的节点检测出错误

  该节点停止数据报文的发送,转为发送错误帧。错误帧的错误标志会破坏原数据报文的结构,其它节点可能在错误标志的任何一位检测出错误,然后在下一位开始发送错误帧,因此错误标志会出现重叠部分。

(2)接收数据报文的节点检测出错误

  如果该节点处于主动错误状态,会发送带主动错误标志的错误帧。主动错误标志会破坏总线上正在传输的数据报文的结构,其它节点可能在主动错误标志的任何一位检测出错误,然后在下一位开始发送错误帧,因此错误标志会出现重叠部分。

  如果该节点处于被动错误状态,会发送带被动错误标志的错误帧。被动错误标志对总线上正在传输的数据报文没有影响。

  当某个接收节点没有做好接收下一帧数据报文的准备时,将发送过载帧以通知发送节点。如图5.2所示,过载帧由过载标志(连续6个位的0)和过载界定符(连续8个位的1)构成,过载标志重叠部分的产生机理与错误帧类似。

图 5.2 过载帧结构

  帧间隔用于将数据帧或遥控帧与前面的帧(可以是数据帧、遥控帧、错误帧、过载帧)分离开来,帧间隔是连续3个位的1。处于被动错误状态的节点,在输出帧间隔时需要在帧间隔之后插入“延迟传送”(连续8个位的1)。

6. CAN总线错误类型

  在数据传输过程中,节点会检测总线的电平状态,识别可能发生的错误。CAN协议规定了五种类型的错误,分别是位错误、ACK错误、填充错误、CRC错误、格式错误。

位错误:

(1)节点发送数据报文,输出0时检测到总线为1,或输出1时检测到总线为0,该节点检测出一个位错误。但以下两种情况除外:① 在数据报文的仲裁段,节点输出1时检测到总线为0,说明该节点竞争总线失败,不视为位错误;② 在数据报文的ACK槽,发送节点输出1时检测到总线为0,说明有接收节点正确接收到数据报文并输出0来做出应答,不视为位错误。

(2)节点接收数据报文,在ACK槽输出0时检测到总线为1,该节点检测出一个位错误。

(3)节点发送错误帧或过载帧,在主动错误标志或过载标志中检测到1,该节点检测到一个位错误。

ACK错误:

  节点发送数据报文时,在ACK槽检测到总线为1(即没有接收节点正确接收到数据报文并输出0来做出应答),该节点检测出一个位错误。

填充错误:

(1)节点发送数据报文,在数据报文的SOF ~ CRC段内检测到连续6个位的0或连续6个位的1,该节点检测出一个填充错误。

(2)节点接收数据报文,在数据报文的SOF ~ CRC段内检测到连续6个位的0或连续6个位的1,该节点检测出一个填充错误。

CRC错误:

  节点接收数据报文,检测到计算的CRC与数据报文中的CRC不一致,该接收节点检测出一个CRC错误。

格式错误:

(1)节点接收数据报文,在数据报文的CRC界定符、ACK界定符、EOF中检测到0,该节点检测出一个格式错误。

(2)节点发送错误帧或过载帧,在错误界定符或过载界定符中检测到0,该节点检测出一个格式错误。

7. CAN总线的错误管理

  CAN协议规定了节点的三种错误状态,分别是主动错误状态、被动错误状态、总线关闭态,节点始终处于这三种状态之一。如图7.1所示,节点会依据自身的TEC、REC值决定进入哪种状态,初始为主动错误状态,TEC、REC的值都为0。处于关闭态的节点在总线上检测到128次连续11个位的1时,会将TEC、REC清零,进入主动错误状态。

图7.1 节点错误状态的变换

节点的REC值变动条件:

(1)接收数据报文的节点检测出错误,REC = REC + 1。但以下情况除外:接收数据报文的节点发送错误帧或过载帧,在主动错误标志或过载标志中检测出位错误。

(2)接收数据报文的节点发送错误帧,在错误标志之后,检测到第一个位为0,REC = REC + 8

(3)接收数据报文的节点发送错误帧或过载帧,在主动错误标志或过载标志中检测出位错误,REC = REC + 8。

(4)接收数据报文的节点发送错误帧或过载帧,从主动错误标志、过载标志的最开始检测到连续 14个位的0,以及之后每检测到连续8个位的0,REC = REC + 8。

(5)接收数据报文的节点发送错误帧,在被动错误标志之后,检测到连续8个位的0,REC = REC + 8。

(6)接收数据报文的节点正确接收到一个数据报文:REC ≥ 1 且 REC ≤ 127 时,REC = REC - 1;REC > 127时,REC = 127。

节点的TEC值变动条件:

(1)发送数据报文的节点在发送数据报文时检测出错误,TEC = TEC + 8。

(2)发送数据报文的节点发送错误帧或过载帧,在主动错误标志或过载标志中检测到位错误,TEC = TEC + 8。

(3)发送数据报文的节点发送错误帧或过载帧,从主动错误标志、过载标志的最开始检测到连续 14个位的0,以及之后每检测到连续8个位的0,TEC = TEC + 8。

(4)发送数据报文的节点发送错误帧,在被动错误标志之后,检测到连续8个位的0,TEC = TEC + 8。

(5)发送数据报文的节点成功发送一个数据报文:TEC ≥ 1 时,TEC = TEC - 1。

节点处于总线关闭态,在总线上检测到 128 次连续 11个位的1时,REC = 0,TEC = 0。

8. 位时序与同步

位时序

  位速率是单位时间内可以传输多少数据(bit),CAN总线上的节点按照约定好的速率进行数据传输。为了实现同步,CAN 协议将位时间划分为4个段,分别是同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)、相位缓冲段2(PBS2)。SS为1个Tq,PTS为1 ~ 8个Tq,PBS1为1 ~ 8个Tq,PBS为2 ~ 8个Tq,Tq是最小的时间单位。

  图 8.1是位时序的一个示例,位时间为10个Tq。节点在采样点(PBS1结束位置)读取总线电平,将读取到的电平作为该位的值。

图8.1 位时序示例(1bit = 10Tq)

硬件同步

  节点在总线空闲状态检测到数据报文帧起始信号(从1到0的跳变),将跳变的位置作为该节点位时序的SS段。如图8.2所示,跳变没有位于节点位时序的SS段,该节点进行硬件同步,将跳变的位置作为位时序的SS段。

图8.2 硬件同步 (图中的竖方格代表1Tq)

再同步

  节点检测到总线上的电平跳变(除帧起始外),如果跳变没有位于该节点位时序的SS段,该节点通过延长PBS1或缩短PBS2使跳变落在SS段,从而实现同步。分两种情况:

(1)当跳变位于节点位时序的PTS ~ PBS1段时,节点通过延长位时序的PBS1段使跳变落在SS段。如图8.3所示,节点位时序的PBS1段延长2个Tq使跳变落在SS段。

图8.3 延长PBS1实现位同步(图中的竖方格代表1Tq)

(2)当跳变位于节点位时序的PBS2段时,通过缩短PBS2段使跳变落在SS段。如图8.4所示,节点位时序的PBS2段缩短2个Tq使跳变落在SS段。

图8.4 缩短PBS2段实现位同步(图中的竖方格代表1Tq)

PBS1和PBS2的调整值不能超过SJW(再同步补偿宽度),SJW可设置为1~4个Tq

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
CAN总线技术及应用
一文读懂CAN通讯协议
细说汽车电子通信总线之CAN 2.0 总线协议详解
CAN总线要点
CAN总线详解 |附下载
一文搞懂CAN和CAN FD总线协议
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服