【Linux CAN应用编程(1)】初识CAN总线(附全文代码)

        接下来我们学习 CAN 应用编程,CAN 是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车领域,汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。CAN 总线目前是自动化领域发展的热点技术之一,由于其高可靠性,CAN 总线目前广泛的应用于工业自动化、船舶、汽车、医疗和工业设备等方面。

什么是 CAN?

        CAN 是 Controller Area Network 的缩写(以下称为 CAN),即控制器局域网络,是 ISO 国际标准化的串行通信协议。

        CAN 总线最初是由德国博世公司(BOSCH)开发,其最初动机就是为了解决现代汽车中庞大的电子控制系统之间的通讯,减少不断增加的信号线。于是,他们设计了一个单一的网络总线,所有的外围器件可以被挂接在该总线上。

        在当前的汽车工业中,出于对安全性、舒适性、方便性、低污染、低成本的要求,各种各样的电子控制系统被开发了出来,车上的电子控制系统越来越多,譬如发动机管理控制、变速箱控制、汽车仪表、空调、 车门控制、灯光控制、气囊控制、转向控制、胎压监测、制动系统、雷达、自适应巡航、电子防盗系统等。 由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议,目前已是当前应用最广泛的现场总线之一。

        CAN 是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。经过几十年的发展,现在,CAN的高性能、高可靠性以及高实时性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。

        以汽车电子为例,汽车上有空调、车门、发动机、大量传感器等,这些部件、模块都是通过 CAN 总线连在一起形成一个网络,车载网络构想图如下所示:

CAN 的特点

        CAN 通信协议具有以下特点:

        (1)、多主控制

        在总线空闲时,所有的单元都可开始发送消息(多主控制)。 最先访问总线的单元可获得发送权(CSMA/CA方式)。多个单元同时开始发送时,发送高优先级ID消息的单元可获得发送权。

        (2)、消息的发送

        在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发 送新消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并 不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各 消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利 的单元则立刻停止发送而进行接收工作。

        (3)、系统的柔性

        与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。

        (4)、通信速度

        根据整个网络的规模,可设定适合的通信速度。 在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此 单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。

        (5)、远程数据请求

        可通过发送“遥控帧” 请求其他单元发送数据。

        (6)、具有错误检测功能·错误通知功能·错误恢复功能

        所有的单元都可以检测错误(错误检测功能)。 检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。 正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。

        (7)、故障封闭

        CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。

        (8)、连接

        CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

CAN 的电气属性

        CAN 总线使用两根线来连接各个单元:CAN_H 和 CAN_L,CAN 控制器通过判断这两根线上的电位差来得到总线电平,CAN 总线电平分为显性电平和隐性电平两种。显性电平表示逻辑“0”,此时 CAN_H 电平比 CAN_L 高,分别为 3.5V 和 1.5V,电位差为 2V。隐形电平表示逻辑“1”,此时 CAN_H 和 CAN_L 电 压都为 2.5V 左右,电位差为 0V。CAN 总线就通过显性和隐形电平的变化来将具体的数据发送出去,如下图所示:

         CAN 总线上没有节点传输数据的时候一直处于隐性状态,也就是说总线空闲状态的时候一直处于隐性。

CAN 网络拓扑

        CAN 是一种分布式的控制总线,CAN 总线作为一种控制器局域网,和普通的以太网一样,它的网络由很多的 CAN 节点构成,其网络拓扑结构如下图所示:

         CAN 网络的每个节点非常简单,均由一个 MCU(微控制器)、一个 CAN 控制器和一个 CAN 收发器构成,然后通过 CAN_H 和 CAN_L 这两根线连接在一起形成一个 CAN 局域网络。CAN 能够使用多种物理介质,例如双绞线、光纤等。最常用的就是双绞线。信号使用差分电压传送,两条信号线被称为“CAN_H” 和“CAN_L”,在我们的开发板上,CAN 接口使用了这两条信号线,CAN 接口也只有这两条信号线。

        由此可知,CAN 控制器局域网和普通的以太网一样,每一个 CAN 节点就相当于局域网络中的一台主机。

        途中所有的 CAN 节点单元都采用 CAN_H 和 CAN_L 这两根线连接在一起,CAN_H 接 CAN_H、CAN_L 接 CAN_L,CAN 总线两端要各接一个 120Ω的端接电阻,用于匹配总线阻抗,吸收信号反射及回拨,提高 数据通信的抗干扰能力以及可靠性。

        CAN 总线传输速度可达 1Mbps/S,最新的 CAN-FD 最高速度可达 5Mbps/S,甚至更高。CAN 传输速度和总线距离有关,总线距离越短,传输速度越快。

CAN 总线通信模型

        CAN 总线传输协议参考了 OSI 开放系统互连模型,也就是前面所介绍的 OSI 七层模型(具体详情参考网络基础知识(1)——从OSI七层模型和TCP/IP说起)。虽然 CAN 传输协议参考了 OSI 七层模型,但是实际上 CAN 协议只定义了“传输层”、“数据链路层”以及“物理层”这三层,而应用层协议可以由 CAN 用户定义成适合特别工业领域的任何方案。 已在工业控制和制造业领域得到广泛应用的标准是 DeviceNet,这是为 PLC 和智能传感器设计的。在汽车工业,许多制造商都有他们自己的应用层协议标准。

         CAN 协议只参考了 OSI 模型中的“传输层”、“数据链路层”以及“物理层”,因此出现了各种不同的应用层协议,比如用在自动化技术的现场总线标准 DeviceNet,用于工业控制的 CanOpen,用于乘用车的诊断协议 OBD、UDS(统一诊断服务,ISO14229),用于商用车的 CAN 总线协议 SAEJ1939。

        数据链路层分为 MAC 子层和 LLC 子层,MAC 子层是 CAN 协议的核心部分。数据链路层的功能是将物理层收到的信号组织成有意义的消息,并提供传送错误控制等传输控制的流程。具体地说,就是消息的帧化、仲裁、应答、错误的检测或报告。数据链路层的功能通常在 CAN 控制器的硬件中执行。

        在物理层定义了信号实际的发送方式、位时序、位的编码方式及同步的步骤。但具体地说,信号电平、通信速度、采样点、驱动器和总线的电气特性、连接器的形态等均未定义。这些必须由用户根据系统需求自行确定。

CAN 帧的种类

        CAN 通信协议定义了 5 种类型的报文帧,分别是:数据帧、遥控帧、错误帧、过载帧、间隔帧。通信是通过这 5 种类型的帧进行的。其中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11 位标识符 (ID),扩展格式有 29 个标识符(ID)。这 5 种类型的帧如下表所示:

用途
数据帧 用于发送单元向接收单元传送数据的帧。
遥控帧 用于接收单元向具有相同 ID 的发送单元请求数据的帧。
错误帧 用于当检测出错误时向其它单元通知错误的帧。
过载帧 用于接收单元通知其尚未做好接收准备的帧。
间隔帧 用于接收单元通知其尚未做好接收准备的帧。

        其中数据帧是使用最多的帧类型,这里重点介绍一下数据帧,数据帧结构如下图所示:

         上图给出了数据帧标准格式和扩展格式两种帧结构,图中 D 表示显性电平 0、R 表示隐性电平 1, D/R 表示显性或隐性,也就是 0 或 1,我们来简单分析一下数据帧的这 7 个段。

        数据帧由 7 个段构成:

        (1)、帧起始

        表示数据帧开始的段。

        (2)、仲裁段

        表示该帧优先级的段。

        (3)、控制段

        表示数据的字节数及保留位的段。

        (4)、数据段

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

        (5)、CRC 段

        检查帧的传输错误的段。

        (6)、ACK 段

        表示确认正常接收的段。

        (7)、帧结束

        表示数据帧结束的段。

        本文只是粗浅地介绍了CAN总线的一些基础知识,如果还有需要,大家可以参考大牛的书籍,比如瑞萨电子编写的《CAN 入门教程》等等优秀的资料。

        下篇来向大家介绍 CAN 的应用编程。

猜你喜欢

转载自blog.csdn.net/cj_lsk/article/details/130934712