CAN通信基础详解
1、CAN 总线与 CANopen 概述
CAN(Controller Area Network)总线是BOSCH为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通信协议,通信介质可以是双绞线、同轴电缆或光导纤维。
通信速率可达 1MBPS。
CAN 协议的一个最大特点是废除了传统的站地址编码,而代之以对通信数据块进行编码。这种按数据块编码的方式,还可使不同的节点同时接收到相同的数据,这一点在分布式控制系统中非常有用。
CAN 总线仅仅定义了物理层、数据链路层,没有规定应用层;本身并不完整,需要一个高层协议来定义 CAN 报文中的各个数据位的具体作用。随着 CAN 总线在工业自动化的应用越来越需广泛,就更加迫切的需要一个开放的、标准化的高层协议。
CANopen 就是一种架构在 CAN 总线应用层上的上层通信协议,包括通信子协议及设备子协议。它是由生产厂商和用户联合 CiA 共同开发的,并于 2002 年成为 CENELEC EN 50325-4 标准。CANopen 已经在广泛的工业通信上建立了标准(例如:机械工程、驱动系统和组件、医疗设备、楼宇自动化、交通工具等等)。基本的通信机制被称为通信描述,大多设备都在“设备描述”的协议中进行描述,“设备描述”定义了不同类型的标准设备及其相应的功能,不同的生产厂商可以通过描述文件(EDS 文件)配置,协调地使用一个CANopen网络。
2、CAN与CANOpen的关系
下面是CAN协议与OSI网络模型的一个对比。CAN的物理层分了三层分别是MDI,PMA和PLS,数据链路层分了两层:MAC与LLC。这五层就是最原始的CAN协议,标准是ISO11898。也就是说CAN协议一开始是没有应用层的。后来有一种叫CANOpen的基于CAN的应用层协议被开发出来,标准是CiA301。
3、CAN通信简介
物理层
CAN总线是一种分布式的控制总线,它的网络由很多CAN节点构成,每个节点均由一个MCU(微控制器)、一个CAN控制器和一个CAN收发器构成,然后使用双绞线连接到CAN网络中。另外,在CAN总线的起止端都有一个120Ω的终端电阻,用来做阻抗匹配,以减少回波反射。
CAN 控制器是根据CAN_L和CAN_H上的电位差(即差分信号的形式)来判断总线电平。总线总线电平分为显性电平(对应逻辑0,电位差为2V左右)和隐性电平(对应逻辑1,电位差为0V),二者必居其一。发送方通过使总线电平发生跳变,将消息发送给接收方。
协议层
CAN通信是通过以下5种类型的帧进行的:
帧类型 | 帧用途 |
---|---|
数据帧 | 用于发送单元向接收单元传送数据的帧 |
遥控帧 | 用于接收单元向具有相同ID的发送单元请求数据的帧 |
错误帧 | 用于检测出错误时向其他单元通知错误的帧 |
过载帧 | 用于接收单元通知其尚未做好接收准备的帧 |
间隔帧 | 用于将数据帧及遥控帧与前面的帧分离开来的帧 |
数据帧
数据帧由 7 个段构成,包括:
(1)帧起始。表示数据帧开始的段。
(2)仲裁段。表示该帧优先级的段。
(3)控制段。表示数据的字节数及保留位的段。
(4)数据段。数据的内容,一帧可发送0~8个字节的数据。
(5)CRC段。检查帧的传输错误的段。
(6)ACK段。表示确认正常接收的段。
(7)帧结束。表示数据帧结束的段。
遥控帧
接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。
遥控帧的构成如图 24 所示。
(1) 帧起始(SOF):表示帧开始的段。
(2) 仲裁段:表示该帧优先级的段。可请求具有相同 ID 的数据帧。
(3) 控制段:表示数据的字节数及保留位的段。
(4) CRC 段:检查帧的传输错误的段。
(5) ACK 段:表示确认正常接收的段。
(6) 帧结束:表示遥控帧结束的段。
错误帧、过载帧和间隔帧在这不再赘述