CAN-bus现场总线基础教程【第1章】现场总线CAN-bus-CAN-bu数据链路层(3)

  • 格式:pdf
  • 大小:652.64 KB
  • 文档页数:9

广州致远电子有限公司 文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 文章源自广州致远电子有限公司,转载或引用请注明出处 1 工业通讯-CAN bus通信产品 第1章 现场总线CAN-bus 1.1 CAN-bus数据链路层 我们已经知道物理层实现了信号的传输,那么信号是如何运送数据的、多个节点同时发送时怎么办、如何保证数据的可靠性、发生错误时怎么办、以及发送与接收目标如何选择呢?这些工作都是在数据链路层完成的。 1.1.1 CAN帧类型 CAN-bus通信是通过五种类型的帧进行的,它们分别是数据帧、远程帧、错误帧、过载帧和帧间隔,其种类及用途如表1.1所示。 表1.1 帧的种类及用途 帧类型 帧用途 数据帧 用于发送节点向接收节点传送数据,是使用最多的帧类型 远程帧 用于接收节点向某个发送节点请求数据的帧 错误帧 用于在检测出通信错误(如校验错误)时向其它节点通知错误的帧 过载帧 用于接收节点通知 帧间隔 用于将数据帧和远程帧与前面的帧分离开来的帧 1.1.2 数据帧 CAN-bus的用途就是在各个节点之间建立起交换数据的桥梁,数据帧就像卡车一样,承担了运送数据的功能。 目前使用最广泛的CAN-bus标准是V2.0版本,该标准在发布之初就制定了A和B两部分,称为CAN2.0A和CAN2.0B。这两个部分的主要区别是仲裁区域的ID码长度不同,CAN2.0A为11位ID,称为标准帧。CAN2.0B为29位ID,称为扩展帧。这两种标准的设备一般不会在同一个物理网络中混合使用。 数据帧由7个段组成,帧结构如图1.1所示,各段的结构如图1.2所示,作用如表1.2所示。 帧起始仲裁段控制段数据段CRC段应答段帧结束 图1.1 数据帧结构 广州致远电子有限公司 文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 文章源自广州致远电子有限公司,转载或引用请注明出处 2 工业通讯-CAN bus通信产品 图1.2 数据帧各段组成 表1.2 数据帧各段功能 段 名 段长度 说 明 帧起始 1bit 表示数据帧开始,由单个显性位构成 仲裁段 标准帧 12 bit 表示该帧优先级。由11位ID码和1位远程帧(RTR)标志位组成 扩展帧 32 bit 表示该帧优先级。由29位ID码、1位替代远程帧请求位(SRR)、1位标志位扩展位(IDE)和1位远程帧标志位(RTR)组成 控制段 6 bit 表示数据段数据长度的编码和保留位 数据段 0~8字节 数据内容,每字节为8位,具体字节数在控制段中体现 CRC段 16 bit 检查帧的传输错误,范围包括从帧起始到数据段的所有内容(不包括填充位) ACK段 2 bit 其它接收节点确认改帧被正常接收 帧结束 7 bit 表示数据帧结束 1. 帧起始 表示数据帧的开始,由单个显性位构成,在总线空闲时才允许发送。所有节点必须同步于首先开始发送帧的起始位。 2. 仲裁段 我们知道一个CAN-bus线缆上会挂接很多CAN节点,它们都可以主动发送报文。我们可以想象如果在同一时刻有多个节点同时发送数据帧,则可能出现数据互相干扰的问题,就像一条铁轨不能在同一时刻跑多列火车一样。聪明的工程师想到了优先级仲裁的方法,该方法的实现基础是我们在错误!未找到引用源。节了解到的CAN-bus线与原理。 仲裁过程是这样的,CAN控制器在发送数据的同时会监听线缆上的电平状态,如果线缆上的电平状态与自己正在发送的电平状态不一致,则退出发送。如果这个位属于仲裁段,并主动退出发送,放弃总线的使用权。但是如果这个位属于其他位置,则CAN控制器会出现错误事件。 广州致远电子有限公司 文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 文章源自广州致远电子有限公司,转载或引用请注明出处 3 工业通讯-CAN bus通信产品 我们已经知道当多个节点同时发送数据时,有任何一个节点发送显性位(逻辑0),线路将表现为显性状态,那么正在发送隐性位的节点就会发现线缆的电平状态与自己正在发送的电平状态不一致,那它就会放弃总线的使用权。所以在仲裁段发送显性电平的节点会比发送隐性电平的节点的优先级高。也就是仲裁段中ID码值越小(逻辑0越多越靠前)优先级越高。相比较以太网等发生碰撞后所有节点停止发送的方法,CAN-bus的无损仲裁机制可以很大程度的提升总线的利用率,并从最底层保证了整个系统具有优先级的概念和实现基础。具体仲裁过程如图1.3所示。 图1.3 标准帧的总线仲裁过程 仲裁段由ID码和一些标志位组成,标准帧具有11位ID码,扩展帧有29位ID码。标志位中比较重要的是远程帧标志位RTR,当该位为逻辑0(显性电平)时表示该帧为数据帧,该位为逻辑1(隐性电平时)表示该帧为远程帧。所以在ID相同的情况下(这种应用极少出现),数据帧的优先级高于远程帧。 扩展帧中的IDE标志位与标准帧中的IDE位处于同样的编码位置(标准帧的IDE位属于控制段,不参与总线仲裁)。IDE位为1时表示该帧为扩展帧,为0则表示该帧为标准帧。所以假设两个具有相同前11位ID的标准帧与扩展帧进行总线仲裁时,扩展帧将因为IDE位为1而失去总线控制权(一般不会将两种设备混合使用)。 3. 控制段 控制段由6个位构成。标准帧与扩展帧的控制段组成有所不同,它们除了都有4位数据长度代码(DLC)外,标准帧有IDE(数值为0)位和保留位r0,扩展帧则是有两位保留位r0和r1。保留位是为了将来扩展CAN-bus帧规则时使用的,在未定义其具体用途前,CAN控制器发送时用1填充保留位,接收时无论保留位为0或1都没有影响。DLC的编码规则如表1.3所示。 4. 数据段 表1.3 DLC表示的数据字节数 数据字 节数目 DLC DLC3 DLC2 DLC1 DLC0 0 0 0 0 0 1 0 0 0 1 2 0 0 1 0 3 0 0 1 1 4 0 1 0 0 5 0 1 0 1 6 0 1 1 0 7 0 1 1 1 8 1 0 0 0 广州致远电子有限公司 文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 文章源自广州致远电子有限公司,转载或引用请注明出处 4 工业通讯-CAN bus通信产品 无论标准帧还是扩展帧,一帧数据帧都只能传送0~8字节数据,每字节为8位。相对于其它一帧就可以传送上千字节的通信方式(例如一帧以太网报文最多可以传送1500字节数据),可能有读者认为CAN-bus的通信效率太低了。而实际上小数据量恰恰是CAN-bus的一个重要特点。CAN-bus主要面对的是汽车和工控等应用场合,这些场合的数据特点是小数据量和实时性。例如汽车里的发动机向行车电脑(ECU)发送转速温度等信息时,仅需几个字节就可以完成。而在汽车发生碰撞时,一条弹出气囊的命令也只需几个字节,但是对实时性要求非常高。所以CAN-bus中0~8字节的数据承载量可以满足绝大部分工业应用场合的需要。 5. CRC段 数据在传输过程中可能因为某些原因导致某些数据被篡改,例如电磁干扰或接插件松动导致数据由0变1或由1变0。为了避免错误的数据引起系统的误操作,通信系统会在每一层加入合适的校验,以及时发现这种错误。在CAN帧中使用的是CRC校验。CRC校验是由CAN控制器自动完成的,即发送节点会根据发送内容计算得到一个CRC值,并填入CRC段进行发送。接收节点也会根据接收到的数据内容进行CRC计算,并将计算结果与CAN帧的CRC值进行比对,如果不一致则认为数据帧传输错误,并根据状态向总线和应用程序通告错误消息。 校验范围包括从帧起始一直到数据段的区域,如图1.4所示。 图1.4 CRC校验范围 6. ACK段 发送节点在ACK段发送两个隐性位。接收节点会通过ACK段用来确认之前的信息是否正常接收。如果没有填充错误、格式错误和CRC错误,则认为接收正常。接收正常的节点会在ACK的第一位发出一个显性位。根据ACK的状态,发送节点就能知道这帧数据是否传输成功,如果失败了发送节点会根据自身状态来决定是否重传。 7. 帧结束 帧结束段由7个隐性位构成,用于表示该帧结束。 1.1.3 远程帧 如果说数据帧是运送货物的大卡车,那么远程帧就是调运货物的调度员。一个节点可以向另一个指定的节点发送远程帧,以要求获取数据。具体获取什么数据,由通信双方自行约定。 远程帧与数据帧一样也分为标准帧格式和扩展帧格式,不同的是远程帧没有数据段,并且远程帧标志位(RTR)为1,其具体帧格式如图1.5所示。 远程帧的DLC内容为发送节点请求的数据长度值,例如DLC为5,表示本次请求5字节。 广州致远电子有限公司 文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 文章源自广州致远电子有限公司,转载或引用请注明出处 5 工业通讯-CAN bus通信产品 因为数据帧中的SRR位为0,而远程帧中该位为1,所以具有相同ID的CAN帧进行仲裁时,数据帧将具有更高优先级。 图1.5 远程帧结构 1.1.4 错误帧 CAN-bus的可靠性很高,但还是可能因为某些原因发生错误,这些错误归结起来有五种:  CRC错误:当接收节点计算得到的CRC值与发送节点发送的CRC值不一致时会发生该错误;  格式错误:如果传输的数据帧格式与任何一种合法的帧格式不符,都会发生该错误;  应答错误:发送节点如果在ACK段没有收到接收节点发出的应答(显性位),将发生应答错误,所以单个节点的CAN设备发送数据帧时将会发生该错误;  位发送错误:发送节点在发送数据时如果发现总线电平与正在发送的电平不符,将发生该错误;  位填充错误:如果线缆上传输的信号违反了错误!未找到引用源。提到的“位填充”规则,将发生该错误。 错误帧起着信号灯的作用,接收和发送过程中如果检测到通信出错,可以发送错误帧。错误帧由错误标识符和错误界定符构成,如图1.6所示。 广州致远电子有限公司 文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 文章源自广州致远电子有限公司,转载或引用请注明出处 6 工业通讯-CAN bus通信产品 ACK段ACK应答主动错误标识主动错误标识错误界定符帧间隔接收正确的节点在该段发出应答有一个或多个节点检测到错误时将发送该标识符其它接收正确的节点和发送节点也必需发送主动错误标识符6~12位8位 图1.6 错误帧结构 其中错误标识符分为两种:  主动错误标识:由6个显性位组成,由处于主动错误的节点发出;  被动错误标识:由6个隐性位组成,由处于被动错误的节点发出。 错误界定符由8个隐性位构成。 因为主动错误标识由6个显性位组成,这违反了错误!未找到引用源。提到的“位填充”规则。可以理解为当一个节点发现通信错误时,其主动将帧彻底破坏掉,让其它节点都知道它接收出错了。 CAN-bus通信的一个特点就是必须保证一个帧能被所有节点正确接收,如果因为某些原因(例如传输)使众多节点中的一个节点出现了接收错误,那这个节点就会主动站出来,通过发送不符合位填充规则的错误帧来把当前帧彻底破坏掉,以通知其它节点“这个帧我接收错了,不算数,重来”。其它接收节点也许尽管没有出错,但是本着“不抛弃不放弃”的原则,在收到错误标识后,也会发出一个主动错误标识,以表示对出错节点的声援。发送节点在发送的同时也会监听总线数据,当发现数据被其它节点“破坏”后,会主动进行数据重发。这些繁琐的过程都是有CAN控制器自动完成的,无需用户程序干预。 为了避免某个设备因为自身原因(例如硬件损坏)导致无法正确收发数据而不断的破坏数据帧,从而影响其它正常节点通信。CAN-bus规范中规定每个CAN控制器中有一个发送错误计数器和一个接收错误计数器。根据计数值不同,CAN节点会处于不同的设备状态,状态转换如图1.7所示。 三种状态的说明如下:  主动错误状态:这是设备的正常状态,设备可以正常参加总线通信,检测到发送错误时将发送主动错误标志;  被动错误状态:检测出错误后,设备将发送被动错误标志;  总线关闭状态:因为设备自身的严重问题使自身进入总线关闭状 图1.7 设备状态转换图