merlinzjl

导航

CAN基础入门

本文转自 电子发烧友网站"黄工的嵌入式技术圈"。

 

1、什么是CAN和CANopen

     CAN即Controller Area Network,即控制器局域网络,属于工业现场总线,是ISO国际标准化的串行通信协议。

CAN定义了OSI7层模型中的物理层和数据链路层。CAN总线属于硬件协议,定义了差分信号的电平、数据帧等等,由硬件实现,软件开发

人员只需要调用用相关的接口和寄存器,即可完成对CAN的控制。

     CANopen是一种应用层通信协议,建立在CAN控制局域网之上,包括通信子协议及设备子协议,常在嵌入式系统中使用,是工业控制常用到的一种现场总线协议。

CANopen协议是在20世纪90年代末,由总部位于德国纽伦堡的 CiA 组织——CAN-in-Automation,在 CAL(CAN Application Layer)的基础上发展而来。

关于CANOpen协议内容请参看:http://www.can-cia.org

 

2、CAN总线的特点

CAN总线采用差分信号传输,通常情况下只需要两根信号线(CAN-H和CAN-L)就可以进行正常的通信。

在干扰比较强的场合,还需要用到屏蔽地即CAN-G(主要功能是屏蔽干扰信号), CAN协议推荐用户使用屏蔽双绞线作为CAN总线的传输线。

CAN总线通信的优势和特点:

A.CAN总线上任意节点,均可在任意时刻主动的向其它节点发起通信,但在同一时刻优先级高的节点能获得总线的使用权。

B.标准CAN总线传输波特率可达到1Mbps。在5Kbps的通信波特率下最远传输距离可以达到 10Km,即使在1Mbps的波特率下也能传输40m的距离。

C.CAN总线定义使用了硬件报文滤波,可实现点对点及点对多点的通信方式,不需要软件来控制。

D.CAN 总线所挂接的节点数量主要取决于CAN总线收发器或驱动器,目前的驱动器一般都可以使同一网络容量达到110个节点。

 

3、CAN基础入门

 

 上图是一个典型的CAN网络,在这个网络中,每个CAN节点通过CAN总线连接。每个节点包含MCU、CAN控制器、CAN收发器。

  在一个MCU典型应用程序中,主要包含三部分

  A.业务逻辑代码:是根据项目需求而定,比如我读取一个传感器数据,并对其做出相应逻辑处理。

  B.协议层代码:比如CANOpen。

  C.底层驱动代码:配置CAN总线相应参数、控制收发的代码。

  CAN控制器内部结构比较复杂,现在一般都是CAN控制器与处理器集成在一起。

        对于编程人员来说无非也就是包含一些控制、状态、配置等寄存器。

        比如我们看到有些STM32芯片带有CAN,也就是说CAN控制器已经集成在STM32芯片中了,我们只需要编程操作其中的寄存器即可。

  CAN收发器:将CAN收发引脚(CAN_TX和CAN_RX)的TTL信号转换成CAN总线的电平信号。

        

 

      CAN收发器R引脚就是与CAN控制器接收相连的引脚,R引脚的信号是表示总线当前的信号,用于控制器实时监测总线信号。主要两个目的:

          A.监测其它节点发送出来的信号:别人给它发送数据;

          B.监测自身节点发送出去的信号:自己发送是否失败。就像上面说的,自己发送一个隐形信号,结果监测出来是显性信号,那就说明是别人在发送数据。

 

    从上图可以知道CAN总线底层硬件的内容(CAN控制器、收发器)主要位于OSI的物理层和数据链路层。

    CAN总线为「两线」「差分」信号,用隐形代表逻辑1,显性代表逻辑0。如下图

    

  我们这里说的显性和隐性信号,指的是总线传输的bit位信号。

  假如某一时刻,一个设备(节点)往总线发0,一个设备往总线发1,那么总线将按显性显示。

  CAN总线平时空闲表现为隐性状态。如果想要发送的信号为显性位,那么总线才会呈现出来显性。

  只要其它有一个节点发送显性信号,你这个节点发送出来的隐性信号就无效。  

 

  位时序逻辑将监视串行总线,执行采样并调整采样点,在调整采样点时,需要在起始位边沿进行同步并后续的边沿进行再同步。

  简单的说就是对一个bit位分几段进行采样,目的就是提高数据传输稳定性。

  在CAN标准中一个位可分为4段:

     同步段(SS)

  传播时间段(PTS)

  相位缓冲段1(PBS1)

  相位缓冲段2(PBS2)

   这些段又由可称为 Time Quantum(简称Tq)的最小时间单位构成。1位分为4个段,每个段又由若干个Tq构成,这称为位时序。

  在STM32中底层驱动代码就需要进行位时序编程,在STM32参考手册中也会发现如下位时序图:

  

 

   

  位填充

  位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。位填充的数据不需要编程控制,由控制器自动完成。其目的也是提高CAN总线的稳定性。

  如下图:

  

 

   对于发送单元,在发送数据帧和遥控帧时, SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则要插入 1 位与前 5 位反型的电平。

   对于接收单元,在接收数据帧和遥控帧时, SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。

   

  错误的种类

    

 

    总线利用率

    CAN通信和485通信一样属于半双工,为什么CAN总线相比485通信不管在速度和稳定性上都具有明显优势呢?

    简单来说就是CAN总线具有自动仲裁功能,这样就提高了总线的利用率,而RS485总线是一种常规的通信总线,它不能够做总线的自动仲裁。

    对于CAN总线没有被发送出去的隐性信号,会由CAN控制器后续发送出去。在牵涉到CAN总线优先级的问题,进一步讲述。

 

    帧的种类和格式

    数据帧:用于发送单元向接收单元传送数据的帧。

    遥控帧:用于接收单元向具有相同 ID 的发送单元请求数据的帧。

    错误帧:用于当检测出错误时向其它单元通知错误的帧。

    过载帧:用于接收单元通知其尚未做好接收准备的帧。

    帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧。

    数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11个位的标识符ID,扩展格式有29个位的ID。

   

    A.数据帧

    

如上图,数据帧由7个段构成:

(1) 帧起始   表示数据帧开始的段,1bit的显性位

(2) 仲裁段   表示该帧优先级的段。标准格式和扩展格式在此的构成有所不同,扩展格式多了18位ID。RTR = 0代表数据帧,RTR = 1代表远程帧。CANID越小,优先级越高。

(3) 控制段   表示数据的字节数及保留位的段。标准和扩展格式的构成有所不同,都有4位表示数据段长度代码(DLC)外,标准帧有IDE(数值为0)位和r0保留位,扩展帧有r0和r1保留位。

      保留位必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。

(4) 数据段   数据的内容,可发送 0~8 个字节的数据。

(5) CRC 段  检查帧的传输错误的段。CRC段是检查帧传输错误的帧,由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用于分隔的位)构成。CRC校验有控制器完成。

(6) ACK 段  表示确认正常接收的段。ACK段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成。

发送单元在 ACK 段发送 2 个位的隐性位,接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位, 通知发送单元正常接收结束。这称作“发送 ACK”或者“返回 ACK”。

(7) 帧结束   表示数据帧结束的段。帧结束是表示该该帧的结束的段。由 7 个位的隐性位构成。

一般的CAN总线通信,总线上通信绝大部分时候都是数据帧。像在CANOpen协议中,用的最多的PDO过程数据对象就是通过数据帧进行的通信。

    

     B.遥控帧

 

 

和数据帧相比,遥控帧是接收单元向发送单元请求发送数据所用的帧。所以,遥控帧没有数据段。因此,遥控帧由如下 6 个段组成,这6个段和上面数据帧的内容基本一样:

(1) 帧起始(SOF)表示帧开始的段。

(2) 仲裁段   表示该帧优先级的段。可请求具有相同 ID 的数据帧。

(3) 控制段   表示数据的字节数及保留位的段。

(4) CRC 段  检查帧的传输错误的段。

(5) ACK 段   表示确认正常接收的段。

(6) 帧结束  表示遥控帧结束的段。

 

遥控帧和数据帧的区别:

   遥控帧的 RTR 位为隐性位,没有数据段。所以对于没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。

   遥控帧的数据长度码用以请求数据帧的数据长度。

   对于没有数据段的数据帧,可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下。

 

     C. 错误帧

用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。

(1) 错误标志

错误标志包括主动错误标志和被动错误标志两种。

主动错误标志: 6 个位的显性位。

被动错误标志: 6 个位的隐性位。

(2) 错误界定符

错误界定符由 8 个位的隐性位构成。

 

   D.过载帧

过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。

(1) 过载标志  6 个位的显性位,过载标志的构成与主动错误标志的构成相同。

(2) 过载界定符 8 个位的隐性位,过载界定符的构成与错误界定符的构成相同。

 

  E.帧间隔

 

 

帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。

过载帧和错误帧前不能插入帧间隔。

(1) 间隔   3 个位的隐性位。

(2) 总线空闲  隐性电平,无长度限制(0 亦可),本状态下,可视为总线空闲,要发送的单元可开始访问总线。

(3) 延迟传送(发送暂时停止) 8 个位的隐性位,只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。

 

CAN ID的仲裁(优先级)

在CAN总线空闲态,最先开始发送消息的单元获得发送权。

多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。

上图描述了CAN控制仲裁的过程,单元2最终获得了抢占CAN总线的权利,也就是说单元2具有更高的优先级。

当单元1 仲裁失利时,自动转换为接收(本来该发送,优先级比别人低,就开始接收数据了。 同时,控制器将会在下一轮继续发送这次未完成的数据)。

具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。

标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送。

 

CAN基本内容介绍到这,另外还有一些注意事项,比如 硬件设计需要在CAN_H和CAN_L之间添加一个120欧电阻。

posted on 2020-05-17 22:27  merlinzjl  阅读(1518)  评论(0编辑  收藏  举报