CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低功耗、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商BOSCH(博世)公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,在欧洲已是汽车网络的标准协议。
表9.1-1 CAN基本参数列表
ISO11898 | ISO11519-2 | |
最大传输速率 | 1Mbps | 125Kbps |
最大传输距离 |
40m/1Mbps
|
1km/40kbps
|
节点数 | 理论上没有限制 | |
连接方式 | 半双工 | |
接线数 | 2 | |
工作方式 | 差分(平衡) |
表9.2-2 ISO/OSI 基本参照模型
图9.2-1 ISO/OSI 基本参照模型和 CAN 协议
CAN 协议经 ISO 标准化后有 ISO11898 标准和 ISO11519-2 标准两种。ISO11898 和 ISO11519-2 标准对于数据链路层的定义相同,但物理层不同。
图9.3-1 CAN连接图
如图图9.3-1所示:CAN总线的硬件构成是由MCU + CAN控制器 + CAN收发器构成。一些单片机内部集成了CAN控制器,因此可以直接连接CAN收发器。(如集成CAN控制器的单片机如NXP半导体的P87C591)常用的CAN控制器芯片如:SJA1000、SIT1057、GCA1000T等。常用的CAN收发器芯片如表9.3-1所示。
表9.3-1
图9.3-2 CAN收发器电路1
图9.3-3 CAN收发器电路2
和RS485一样,CAN总线使用双绞线进行差分电压传输,两条信号线被称为CAN高(CAN_H)和CAN低(CAN_L)。
图9.3-4 ISO11898、ISO11519-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规定为显性。
在 SPI 通讯中,片选、时钟信号、数据输入及数据输出这 4 个信号都有单独的信号线,I2C 协议包含有时钟信号及数据信号 2 条信号线,异步串口包含接收与发送 2 条信号线,这些协议包含的信号都比 CAN 协议要丰富,它们能轻易进行数据同步或区分数据传输方向。而 CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢?CAN 协议给出的解决方案是对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。
在原始数据段的前面加上传输起始标签、片选 (识别) 标签和控制标签,在数据的尾段加上 CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同 SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN 的“数据帧”。
为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧,它们的类型及用途说明如下表所示:
表9.4-3
数据帧是在 CAN 通讯中最主要、最复杂的报文,我们来了解它的结构,如下图所示:
图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 竞争总线成功,这个报文得以被继续发送出去。
图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 个隐性位表示结束。
通过发送远程帧,作为某数据接收器的站通过其资源节点对不同的数据传送进行初始化设置。远征帧由6个不同的位场组成,即帧起始、仲裁场、控制场、CRC场、应答场、帧结束。
与数据场相反,远程帧的RTR位是“隐形”的。远程帧没有数据场,数据长度码的数值是不受制约的(可以标注位容许范围值0 - 8里的任何值),此数值是相对与数据帧的数据长度码。远程帧组成如下图所示:
图9.4-3 远程帧组成
错误帧由监控到总线错误的节点发送。它由两个不同的场组成,如图9-4所示:第一个场是不同节点提供的错误标志的叠加综合,第二个场是错误界定符。被动错误的节点要求总线至少有3个位时间长度的总线空闲才能正确地种植错误帧。
图9.4-4 错误帧格式
CAN协议规定两种的错误标志:主动的错误标志和被动的错误标志。
(a)主动的错误标志:由6个连续的显性位组成。
(b)被动的错误标志:由6个连续的隐性位组成。
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
(1)过载标志:6个位的显性位。过载标志的构成与主动错误标志的构成相同。
(2)过载界定符:8个位的隐性位。过载界定符的构成与错误界定符的构成相同。
图9.4-5 过载帧的构成
帧间隔是用于分割数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间隔。
图9.4-6 帧间隔构成
(1)间隔:3个位的隐性位。
(2) 总线空闲:隐性电平,无长度限制(0亦可)。本状态下可视为总线空闲,要发送的单元可开始访问总线。
(3)延迟传送(发送暂时停止):8个位的隐性位。只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
1.CAN入门书.pdf
2、秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4 CAN!_Wireless_Link的博客-CSDN博客
3、CAN总线原理-精华整理 - 知乎