嵌入式常用通讯协议2(CAN协议)

9 CAN总线

9.1 CAN简介

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

9.1.1 CAN基本参数

表9.1-1 CAN基本参数列表

ISO11898 ISO11519-2
最大传输速率 1Mbps 125Kbps
最大传输距离
40m/1Mbps
1km/40kbps
节点数 理论上没有限制
连接方式 半双工
接线数 2
工作方式 差分(平衡)

9.1.2 CAN 的特点

(1) 多主控制
    在总线空闲时,所有的单元都可开始发送消息(多主控制)。 最先访问总线的单元可获得发送权(CSMA/CA 方式 *1 )。 多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。
(2) 消息的发送
     在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新 消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID )决定优先级。 ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
(3) 系统的柔软性
     与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
(4) 通信速度
    根据整个网络的规模,可设定适合的通信速度。在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。
(5) 远程数据请求
    可通过发送“遥控帧” 请求其他单元发送数据。
(6) 错误检测功能、错误通知功能、错误恢复功能
    所有的单元都可以检测错误(错误检测功能)。检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
(7) 故障封闭
    CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部 故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
(8) 连接
    CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元 数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接 的单元数减少。

9.2 CAN的ISO标准

    CAN 协议如表 3 所示涵盖了 ISO 规定的 OSI   基本参照模型中的 传输层、数据链路层及物理层 。 CAN 协议中关于 ISO/OSI 基本参照模型中的传输层、数据链路层及物理层,具体有哪些定义如表9-2   所示。

 表9.2-2 ISO/OSI 基本参照模型

嵌入式常用通讯协议2(CAN协议)_第1张图片

嵌入式常用通讯协议2(CAN协议)_第2张图片

图9.2-1 ISO/OSI 基本参照模型和 CAN 协议 

    数据链路层分为 MAC 子层和 LLC 子层, MAC 子层是 CAN 协议的核心部分。数据链路层的功能是将物理层收到的信号组织成有意义的消息,并提供传送错误控制等传输控制的流程。具体地说,就是消息的帧化、仲裁、应答、错误的检测或报告。数据链路层的功能通常在 CAN 控制器的硬件中执行。 在物理层定义了信号实际的发送方式、位时序、位的编码方式及同步的步骤。但具体地说,信号电平、通信速度、采样点、驱动器和总线的电气特性、连接器的形态等均未定义*1 。这些必须由用户根据系统需求自行确定。

9.2.1  ISO11898 标准和 ISO11519-2 标准比较

    CAN 协议经 ISO 标准化后有 ISO11898 标准和 ISO11519-2 标准两种。ISO11898 ISO11519-2 标准对于数据链路层的定义相同,但物理层不同。

(1) 关于 ISO11898 
    ISO11898 是通信速度为 125kbps-1Mbps CAN 高速通信标准。目前,ISO11898 追加新规约后,成为 ISO11898-1 新标准。
(2) 关于 ISO11519
    ISO11519 是通信速度为 125kbps 以下的 CAN 低速通信标准。ISO11519-2 是 ISO11519-1 追加新规约后的版本。
9.2-2 ISO11898 11519-2 物理层的主要不同点
嵌入式常用通讯协议2(CAN协议)_第3张图片

9.3 CAN物理层

9.3.1 CAN拓扑结构

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

嵌入式常用通讯协议2(CAN协议)_第4张图片

 图9.3-1 CAN连接图

9.3.2 硬件构成

    如图图9.3-1所示:CAN总线的硬件构成是由MCU + CAN控制器 + CAN收发器构成。一些单片机内部集成了CAN控制器,因此可以直接连接CAN收发器。(如集成CAN控制器的单片机如NXP半导体的P87C591)常用的CAN控制器芯片如:SJA1000、SIT1057、GCA1000T等。常用的CAN收发器芯片如表9.3-1所示。

表9.3-1

嵌入式常用通讯协议2(CAN协议)_第5张图片

嵌入式常用通讯协议2(CAN协议)_第6张图片

图9.3-2 CAN收发器电路1 

嵌入式常用通讯协议2(CAN协议)_第7张图片

 图9.3-3 CAN收发器电路2

 9.3.3 CAN协议电平

和RS485一样,CAN总线使用双绞线进行差分电压传输,两条信号线被称为CAN高(CAN_H)和CAN低(CAN_L)。

嵌入式常用通讯协议2(CAN协议)_第8张图片

图9.3-4 ISO11898ISO11519-2 的物理层特征 

如上图所示:对于ISO11898协议来说,两条线静态时均为2.5V左右,此时状态表示为逻辑1,也被称作隐性。当两条线电压值出现差异时,通常CAN_H=3.5V和CAN_L=1.5V,此时状态表示为逻辑0,也称作显性。即:

差分电压CAN_diff = 0V,表示逻辑“1”,为隐性;

差分电压CAN_diff = 2V,表示逻辑“0”,为显性;

显性电平用逻辑“0”表示,隐性电平用逻辑“1”表示,之所所以0为显性,其实这是因为CAN总线采用“线与”规则进行冲突仲裁,即当多个CAN信号同时发送时,有的发1有的发0,而只要有0,当前总线就是0(1&0 = 0),看上去就是1被0覆盖了。另一方面,从电位看,高电位为0,当1和0同时发送时,总线处于高电位,显现出来的是0,所以把0规定为显性。

9.4 CAN协议层

    在 SPI 通讯中,片选、时钟信号、数据输入及数据输出这 4 个信号都有单独的信号线,I2C 协议包含有时钟信号及数据信号 2 条信号线,异步串口包含接收与发送 2 条信号线,这些协议包含的信号都比 CAN 协议要丰富,它们能轻易进行数据同步或区分数据传输方向。而 CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢?CAN 协议给出的解决方案是对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。

    在原始数据段的前面加上传输起始标签、片选 (识别) 标签和控制标签,在数据的尾段加上 CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同 SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN 的“数据帧”。

为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧,它们的类型及用途说明如下表所示:

表9.4-3 

嵌入式常用通讯协议2(CAN协议)_第9张图片

9.4.1  数据帧的结构

数据帧是在 CAN 通讯中最主要、最复杂的报文,我们来了解它的结构,如下图所示:

嵌入式常用通讯协议2(CAN协议)_第10张图片

 图9.4-1 数据帧结构

数据帧以一个显性位 (逻辑 0) 开始,以 7 个连续的隐性位 (逻辑 1) 结束,在它们之间,分别有仲裁段、控制段、数据段、CRC 段和 ACK 段。

(1) 帧起始

SOF 段 (Start OfFrame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。

(2) 仲裁段

当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。

仲裁段的内容主要为本数据帧的 ID 信息 (标识符),数据帧具有标准格式和扩展格式两种,区别就在于 ID 信息的长度,标准格式的 ID 为 11 位,扩展格式的 ID 为 29 位,它在标准 ID 的基础上多出 18 位。在 CAN 协议中, ID 起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。CAN 协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,我们会给它打包上一个优先级高的 ID,使它能够及时地发送出去。也正因为它这样的优先级分配原则,使得 CAN 的扩展性大大加强,在总线上增加或减少节点并不影响其它设备。报文的优先级,是通过对 ID 的仲裁来确定的。根据前面对物理层的分析我们知道如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,CAN 正是利用这个特性进行仲裁。

若两个节点同时竞争 CAN 总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。见图 ,在开始阶段,两个设备发送的电平一样,所以它们一直继续发送数据。到了图中箭头所指的时序处,节点单元 1 发送的为隐性电平,而此时节点单元 2 发送的为显性电平,由于总线的“线与”特性使它表达出显示电平,因此单元 2 竞争总线成功,这个报文得以被继续发送出去。

嵌入式常用通讯协议2(CAN协议)_第11张图片

 图9.4-2

仲裁段 ID 的优先级也影响着接收设备对报文的反应。因为在 CAN 总线上数据是以广播的形式发送的,所有连接在 CAN 总线的节点都会收到所有其它节点发出的有效数据,因而我们的 CAN

控制器大多具有根据 ID 过滤报文的功能,它可以控制自己只接收某些 ID 的报文。回看数据帧格式,可看到仲裁段除了报文 ID 外,还有 RTR、IDE 和 SRR 位。

(a) RTR 位 (Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。

(b) IDE 位 (Identifier ExtensionBit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。

(c) SRR 位 (Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的 RTR位。由于扩展帧中的 SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个 ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。

(3) 控制段

在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是 DLC 段 (Data Length Code),译为数据长度码,它由 4 个数据位组成,用于表示本报文中的数据段含有多少个字节, DLC 段表示的数字为 0~8。

(4)数据段

数据段为数据帧的核心内容,它是节点要发送的原始信息,由 0~8 个字节组成,MSB 先行。

(5) CRC 段

为了保证报文的正确传输,CAN 的报文包含了一段 15 位的 CRC 校验码,一旦接收节点算出的CRC 码跟接收到的 CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK段间隔起来。

(6)ACK 段

ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。

(7) 帧结束

EOF 段 (End Of Frame),译为帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。

9.4.2 远程帧

    通过发送远程帧,作为某数据接收器的站通过其资源节点对不同的数据传送进行初始化设置。远征帧由6个不同的位场组成,即帧起始、仲裁场、控制场、CRC场、应答场、帧结束。

    与数据场相反,远程帧的RTR位是“隐形”的。远程帧没有数据场,数据长度码的数值是不受制约的(可以标注位容许范围值0 - 8里的任何值),此数值是相对与数据帧的数据长度码。远程帧组成如下图所示:

嵌入式常用通讯协议2(CAN协议)_第12张图片

图9.4-3 远程帧组成

9.4.3 错误帧

    错误帧由监控到总线错误的节点发送。它由两个不同的场组成,如图9-4所示:第一个场是不同节点提供的错误标志的叠加综合,第二个场是错误界定符。被动错误的节点要求总线至少有3个位时间长度的总线空闲才能正确地种植错误帧。

嵌入式常用通讯协议2(CAN协议)_第13张图片

图9.4-4 错误帧格式 

CAN协议规定两种的错误标志:主动的错误标志和被动的错误标志。

(a)主动的错误标志:由6个连续的显性位组成。

(b)被动的错误标志:由6个连续的隐性位组成。

 9.4.4 过载帧

    过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。

(1)过载标志:6个位的显性位。过载标志的构成与主动错误标志的构成相同。

(2)过载界定符:8个位的隐性位。过载界定符的构成与错误界定符的构成相同。

嵌入式常用通讯协议2(CAN协议)_第14张图片

 图9.4-5 过载帧的构成

9.4.5 帧间隔

   帧间隔是用于分割数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间隔。

嵌入式常用通讯协议2(CAN协议)_第15张图片

图9.4-6 帧间隔构成

(1)间隔:3个位的隐性位。

(2) 总线空闲:隐性电平,无长度限制(0亦可)。本状态下可视为总线空闲,要发送的单元可开始访问总线。

(3)延迟传送(发送暂时停止):8个位的隐性位。只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。

参考内容:

1.CAN入门书.pdf

2、秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4 CAN!_Wireless_Link的博客-CSDN博客

3、CAN总线原理-精华整理 - 知乎 

你可能感兴趣的:(网络,java,开发语言)