一、CAN
CAN是控制器局域网络(Controller Area Network)的简称,是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN通信协议。此后,CAN通过ISO11898及ISO11519进行了标准化,在欧洲已是汽车网络的标准协议。
CAN的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。
二、硬件连接
CAN总线只有2根线与外部相连,并且内部集成了错误探测和管理模块,是一种多主总线,通信介质可以是双绞线、同轴电缆或光导纤维。通信速率最高可达1Mbps(40m以内),最长传递距离达10km(速率为5kbps以下)。网络节点目前可达110个,报文标志符2032种(CAN2.0A),扩展标准(CAN2.0B)中报文标志符几乎不受限制。
CAN网络可以理解为多台CAN设备连接在同一条CAN总线上组合成的网络,其中的CAN设备我们称之为节点。CAN网络拓扑结构如下图:
一个CAN节点主要包含三类:
- MCU应用程序,根据程序分层可分为三部分:
(1)业务逻辑代码:是根据项目需求而定,也很好理解。比如我读取一个传感器数据,并对其做出相应逻辑处理。
(2)协议层代码:比如后续要讲述的CANOpen。
(3)底层驱动代码:配置CAN总线相应参数、控制收发的代码 - CAN控制器。内部结构还是挺复杂的,一般现在CAN控制器都是与处理器集成在一起。包含一些控制、状态、配置等寄存器。比如有些STM32芯片带有CAN,也就是说CAN控制器已经集成在STM32芯片中了,我们只需要编程操作其中的寄存器即可。
- CAN收发器。将CAN收发引脚(CAN_TX和CAN_RX)的TTL信号转换成CAN总线的电平信号。
可以把CAN总线通信认为是UART通过RS485进行通信:CAN控制器就如UART的控制器,而CAN收发器就如RS485转换芯片。
三、通信协议
一般比较常见的CAN通信协议主要有三种:J1939、CANopen、devicenet。这些CAN通信协议的最大特点就是废除了传统的站地址编码,而代之以对通信数据块进行编码。
CAN协议是通过以下5种类型的帧进行的:
- 数据帧,用于发送单元向接收单元传送数据的帧。
- 远程帧,用于接收单元向具有相同ID的发送单元请求数据的帧。
- 错误帧,用于当检测出错误时向其它单元通知错误的帧。
- 过载帧,用于接收单元通知其尚未做好接收准备的帧。
- 间隔帧,用于将数据帧及遥控帧与前面的帧分离开来的帧。
数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11个位的标识符(ID),扩展格式有29个位的ID。
四、数据帧
数据帧结构上由7个段构成,其中根据仲裁段ID码长度的不同,分为标准帧(CAN2.0A)和扩展帧(CAN2.0B)。
- 帧起始、帧结束
- 仲裁段
- 控制段
- 数据段
- CRC段
- ACK段
五、远程帧
数据帧与远程帧的区别:
六、错误帧