CAN 是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车 领域,汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。CAN 总线目前是自动化领 域发展的热点技术之一,由于其高可靠性,CAN 总线目前广泛的应用于工业自动化、船舶、汽 车、医疗和工业设备等方面。I.MX6ULL 自带了 CAN 外设,因此可以开发 CAN 相关的设备, 本章我们就来学习一下如何驱动 I.MX6U-ALPHA 开发板上的 CAN 接口。
1:CAN 协议简析
有关 CAN 协议详细内容请参考开发板资料里面由瑞萨电子编写的《CAN 入门教程》,路径 为:4、参考资料->CAN 入门教程.pdf,本小节参考自此教程。
1.1:何为 CAN?
CAN 的全称为 Controller Area Network,也就是控制局域网络,简称为 CAN。CAN 最早是 由德国 BOSCH(博世)开发的,目前已经是国际标准(ISO 11898),是当前应用最广泛的现场总线 之一。BOSCH 主要是做汽车电子的,因此 CAN 一开始主要是为汽车电子准备的,事实也是如 此,CAN 协议目前已经是汽车网络的标准协议。当然了,CAN 不仅仅应用于汽车电子,经过 几十年的发展,CAN 协议的高性能和高可靠性已经得到了业界的认可,目前除了汽车电子以外 也广泛应用于工业自动化、医疗、工业和船舶等领域。 以汽车电子为例,汽车上有空调、车门、发动机、大量传感器等,这些部件都是通过 CAN 总线连在一起形成一个网络,车载网络结构如图 66.1.1.1 所示:
图 66.1.1.1 中各个单元通过 CAN 总线连接在一起,每个单元都是独立的 CAN 节点。同一 个 CAN 网络中所有单元的通信速度必须一致,不同的网络之间通信速度可以不同。比如图 66.1.1.1 中 125Kbps 的 CAN 网络下所有的节点速度都是 125Kbps 的,整个网络由一个网关与其 他的网络连接。 CAN 的特点主要有一下几点:
①、多主控制 在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消 息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而 是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个 位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的 单元则立刻停止发送而进行接收工作。
②、系统的柔软性 与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
③、通信速度快,距离远 最高 1Mbps(距离小于 40M),最远可达 10KM(速率低于 5Kbps)。
④、具有错误检测、错误通知和错误恢复功能 所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单 元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束 发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
⑤、故障封闭功能 CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错 误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将 引起此故障的单元从总线上隔离出去。
⑥、连接节点多 CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际 上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增 加;提高通信速度,则可连接的单元数减少。
1.2: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 总线就通过显性 和隐形电平的变化来将具体的数据发送出去,如图 66.1.2.1 所示:
CAN 总线上没有节点传输数据的时候一直处于隐性状态,也就是说总线空闲状态的时候一 直处于隐性。CAN 网络中的所有单元都通过 CAN_H 和 CAN_L 这两根线连接在一起,如图 66.1.2.2 所示:
途中所有的 CAN 节点单元都采用 CAN_H 和 CAN_L 这两根线连接在一起,CAN_H 接 CAN_H、CAN_L 接 CAN_L,CAN 总线两端要各接一个 120Ω的端接电阻,用于匹配总线阻抗, 吸收信号反射及回拨,提高数据通信的抗干扰能力以及可靠性。 CAN 总线传输速度可达 1Mbps/S,最新的 CAN-FD 最高速度可达 5Mbps/S,甚至更高, CAN-FD 不在本章讨论范围,感兴趣的可以自行查阅相关资料。CAN 传输速度和总线距离有关, 总线距离越短,传输速度越快。
1.3:CAN 协议
通过 CAN 总线传输数据是需要按照一定协议进行的,CAN 协议提供了 5 种帧格式来传输 数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。其中数据帧和遥控帧有标准格式和扩展格 式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)。这 5 中帧的用途见表 66.1.3.1:
1.3.1:数据帧
数据帧由 7 段组成:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、数据段,数据的内容,一帧可发送 0~8 个字节的数据。
⑤、CRC 段,检查帧的传输错误的段。
⑥、ACK 段,表示确认正常接收的段。
⑦、帧结束,表示数据帧结束的段。 数据帧结构如图 66.1.3.1 所示:
图 66.1.3.1 给出了数据帧标准格式和扩展格式两种帧结构,图中 D 表示显性电平 0、R 表 示隐性电平 1,D/R 表示显性或隐性,也就是 0 或 1,我们来简单分析一下数据帧的这 7 个段。
①、帧起始
帧起始很简单,标准格式和扩展格式都是由一个位的显性电平 0 来表示帧起始。
②、仲裁段
仲裁段表示帧优先级,仲裁段结构如图 66.1.3.2 所示:
标准格式和扩展格式的仲裁段不同,从图 66.1.3.2 可以看出,标准格式的 ID 为 11 位,发 送顺序是从 ID10 到 ID0,最高 7 位 ID10~ID4 不能全为隐性(1),也就是禁止 0X1111111XXXXX这样的 ID。扩展格式的 ID 为 29 位,基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0,基本 ID 与标准格式一样,禁止最高 7 位都为隐性。
③、控制段
控制段由 6 个位构成,表示数据段的字节数,标准格式和扩展格式的控制段略有不同,如 图 66.1.3.3 所示:
图 66.1.3.3 中 r1 和 r0 为保留位,保留位必须以显性电平发送。DLC 为数据长度,高位在 前,DLC 段有效值范围为 0~8。
④、数据段 数据段也就是帧的有效数据,标准格式和扩展格式相同,可以包含 0~8 个字节的数据,从 最高位(MSB)开始发