通信协议-07-CAN通信

本文主要是通信协议——CAN通信相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日
开发板 正点原子 i.MX6ULL Linux阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
STM32开发板 正点原子战舰V3(STM32F103ZET6)
点击查看本文参考资料
点击查看相关文件下载
--- ---

一、CAN简介

1. CAN

控制器局域网( Controller Area Network, CAN) ,是由德国BOSCH(博世)公司开发, 是目前国际上应用最为广泛的现场总线之一。 其特点是可拓展性好,可承受大量数据的高速通信, 高度稳定可靠,因此常应用于汽车电子领域、工业自动化、医疗设备等高要求环境。

它是 ISO 国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需要, 1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后, CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。

(1) ISO11519定义了通信速率为10~125Kbps的低速CAN通信标准,属于开环总线,传输速率为40Kbps时,总线长度可达1000米;

(2)ISO11898定义了通信速率为125Kbps~1 Mbps的高速CAN通信标准,属于闭环总线,传输速率可达1Mbps,总线长度≤40米;

高速CAN主要应用在发动机、变速箱等对实时性、传输速度要求高的场景。低速CAN主要应用在车身控制系统等可靠性要求高的场景,低速CAN在断掉其任一导线后,仍可以继续接收数据,因此在汽车发生交通事故时,使用低速CAN能更大提高设备正常接收数据工作的可能性,提高安全性。

现在, CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。

2. 特点

CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。 它主要有以下特点:

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

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

(3)通信速度较快,通信距离远。 最高 1Mbps(距离小于 40M),最远可达 10KM(速率低于 5Kbps)。

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

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

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

正是因为 CAN 协议的这些特点,使得 CAN 特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。

二、网络拓扑结构

  • 低速 CAN 拓扑结构
image-20230502094247993
  • 高速 CAN 拓扑结构
image-20230502094312429

基于ISO11519标准的低速CAN,是一个“开环网络”,每根总线上个串联一个2.2KΩ的电阻;基于ISO11898标准的高速CAN,是一个“闭环网络”,总线的两端各需串联一个120Ω的电阻用于阻抗匹配,以减少回波反射。

三、电气特性与协议

1. 电气特性

类似RS485, CAN也使用差分信号传输数据。 CAN总线使用CAN_H和CAN_L的电位差来表示数据电平。电位差分为显性电平和隐性电平,分别表示逻辑0和1。

  • 低速CAN( ISO11519标准)的电平定义
image-20230502094501198
  • 高速CAN( ISO11898标准)的电平定义
image-20230502094510371

两者物理层电气特性不一样,因此不能将它们连接在一起。可以看到当CAN_H和CAN_L电压相近,则表示隐性电平,对应逻辑1,当两个电压相差较大,表示显性电平,对应逻辑0。

2. 低速/高速 CAN 对比

image-20230502094842195

3. CAN协议

CAN是一种基于消息广播模式的串行通信总线, 即在同一时刻网络上所有节点监测到的数据是一致的,各节点根据报文ID来甄别是否是发给自己的报文。

CAN总线以“帧”( Frame)的形式进行通信。 CAN 总线协议规定了5种帧,分别是数据帧、 远程帧、错误帧、 超载帧以及帧间隔, 其中数据帧最常用, 各个帧的用途如下:

帧类型 作用
数据帧(Data Frame) 用于发送节点向接收节点传输数据的帧
远程帧(Remote Frame) 用于接收节点向具有相同ID的发送节点请求数据的帧
错误帧(Error Frame) 用于当检测出错误时,向其它节点通知错误的帧
超载帧(Overload Frame) 用于接收节点通知其尚未做好接收准备的帧
帧间隔(Inter Frame Space) 用于将数据帧及远程帧与前面的帧分离开来的帧

数据帧又分为标准帧( CAN2.0A) 和扩展帧( CAN2.0B) ,标准帧有 11 个位的标识符(ID),扩展帧有 29 个位的 ID ,主要体现在在仲裁段和控制段上。 当CAN总线网络中有多个CAN节点设备时, 某一CAN设备发出数据帧,总线上所有设备(无过滤时)都获取该数据帧中仲裁段中的ID,如果是自己关注ID的数据,则获取数据段的内容,完成数据的传输。

4. 数据帧详解

4.1 格式概览

数据帧由七段组成, 如下图(CAN 标准数据帧和扩展数据帧结构 ):

image-20230502094956476

(1)帧起始(Start Of Frame-SOF): 1bit,显性信号,表示数据帧(或远程帧)的开始;

(2)仲裁段(Arbitration Field):包括标识符位( Identifier field-ID)和远程发送请求位( Remote Transfer Request, RTR) 。标准帧的ID位是11位,即范围是0x000~0x7FF, 而扩展帧的ID是11+18=29位;在CAN协议中, ID决定报文的优先级高低,也决定这拓扑结构的节点是否接收此ID的帧数据。远程发送请求位, 用于区分该帧是数据帧还是远程帧,显性信号( 0 )代表数据帧( Data Frame) ,隐性信号( 1 )代表远程帧( Remote Frame);

(3)控制段( Control Field) :标准帧中由扩展标识符位( Identifier Extension bit-IDE, 1 bit) 、 保留位 0( Reseved bit0-r0, 1 bit) 、 数据长度编码位( Data Length Code-DLC, 4 bits) 组成;扩展帧用由两个保留位( Reseved bit, 2 bit) 、 数据长度编码位( Data Length Code-DLC, 4 bits) 组成

(4)数据段( Data Field):发送数据的内容,最多8个字节( 64bit),它的实际长度会写到前面的数据长度编码位DLC里。

(5)循环校验段( CRC Field):包括循环校验序列( CRC Sequence)和界定符( Delimiter, DEL) ;循环校验序列用于校验传输是否正确; 界定符用于表示循环校验序列是否结束。

(6)确认段( ACK Field):包括确认位( ACK SLOT)和界定符( Delimiter, DEL) ;确认位在节点收到正确的CRC序列时,发送端的ACK位被置位; 界定符表示确认是否正常接收;

(7)帧结束( End of Frame-EOF) : 7位长度,隐性信号,表示帧的结束。

4.2 各部分说明

image-20230502100222299

图中 D 表示显性电平, R 表示隐形电平(下同)。

4.2.1 帧起始和仲裁段

  • 帧起始,标准帧和扩展帧都是由 1 个位的显性电平表示帧起始。

  • 仲裁段,表示数据优先级的段,标准帧和扩展帧格式在本段有所区别 ,如下图(数据帧仲裁段构成 )

image-20230502100325963

标准格式的 ID 有 11 个位。从 ID28 到 ID18 被依次发送。禁止高 7 位都为隐性(禁止设定: ID=1111111XXXX)。扩展格式的 ID 有 29 个位。基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0 表示。基本 ID 和标准格式的 ID 相同。禁止高 7 位都为隐性(禁止设定:基本ID=1111111XXXX)。

其中 RTR 位用于标识是否是远程帧( 0,数据帧; 1,远程帧), IDE 位为标识符选择位( 0,使用标准标识符; 1,使用扩展标识符), SRR 位为代替远程请求位,为隐性位,它代替了标准帧中的 RTR 位。

4.2.2 控制段

控制段,由 6 个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同 :

image-20230502100559117

上图中, r0 和 r1 为保留位,必须全部以显性电平发送,但是接收端可以接收显性、隐性及任意组合的电平。 DLC 段为数据长度表示段,高位在前, DLC 段有效值为 08,但是接收方接收到 915 的时候并不认为是错误。

4.2.3 数据段

数据段,该段可包含 0~8 个字节的数据。从最高位( MSB)开始输出,标准帧和扩展帧在这个段的定义都是一样的。

image-20230502100648721

4.2.4 CRC 段

CRC 段,该段用于检查帧传输错误。 由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的。

image-20230502100728154

此段 CRC 的值计算范围包括: 帧起始、仲裁段、控制段、数据段。接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。

4.2.5 ACK 段

ACK 段,此段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位组成。标准帧和扩展帧在这个段的格式也是相同的。

image-20230502100818549

发送单元的 ACK,发送 2 个位的隐性位,而接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束,这个过程叫发送 ACK/返回 ACK。发送 ACK 的是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、 CRC 错误的消息。

4.2.6 帧结束

帧结束,标准帧和扩展帧在这个段格式一样,由 7 个位的隐性位组成。至此,数据帧的 7 个段就介绍完了。

四、CAN的位时序

位速率:由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。

1. 一个位的组成

一个位可分为 4 段:同步段(SS)、传播时间段(PTS)、相位缓冲段 1(PBS1)和相位缓冲段 2(PBS2) 。这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。

1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和 Tq 数如下表(一个位各段及其作用 ):

image-20230502101242527

一个位的构成如下图所示:

image-20230502101408532

上图的采样点,是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。根据这个位时序,我们就可以计算 CAN 通信的波特率了。图中采样时间加大或减少量的最大值就是SJW(再同步补偿宽度)。

2. CAN协议仲裁的实现

在总线空闲态,最先开始发送消息的单元获得发送权,一但发送,其他单元无法抢占。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁,连续输出显性电平最多的单元可继续发送,具有较高优先级。实现过程如下图:

image-20230502101543523

上图中,单元 1 和单元 2 同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到 T 时刻,单元 1 输出隐性电平,而单元 2 输出显性电平,此时单元 1仲裁失利,立刻转入接收状态工作,不再与单元 2 竞争,而单元 2 则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。