我是靠谱客的博主 单薄火车,最近开发中收集的这篇文章主要介绍CAN通信详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一. CAN是什么?


CAN,全称为“Controller Area Network”,即控制器局域网,是一种多主方式的串行通讯总线,是国际上应用最广泛的现场总线之一。

二. CAN的起源


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

三. CAN的物理层

CAN总线是一种分布式的控制总线,它的网络由很多CAN节点构成,每个节点均由一个MCU(微控制器)、一个CAN控制器和一个CAN收发器构成,然后使用双绞线连接到CAN网络中。另外,在CAN总线的起止端都有一个120Ω的终端电阻,用来做阻抗匹配,以减少回波反射。
其网络拓扑结构如下图所示:
在这里插入图片描述

CAN 控制器是根据CAN_L和CAN_H上的电位差(即差分信号的形式)来判断总线电平。总线总线电平分为显性电平(对应逻辑0,电位差为2V左右)和隐性电平(对应逻辑1,电位差为0V),二者必居其一。发送方通过使总线电平发生跳变,将消息发送给接收方。
在这里插入图片描述

显性电平和隐性电平
总线上的电平有显性电平和隐性电平两种。
显性电平的逻辑值为“0”,隐性电平为“1”。
“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。

四. CAN的特点


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

五. CAN的协议层


帧的种类
通信是通过以下 5 种类型的帧进行的:

其中,数据帧和遥控帧有标准格式和扩展格式两种格式。
标准格式有11 个位的标识符(ID),扩展格式有29 个位的ID 。

数据帧
数据帧由 7 个段构成,包括:
(1)帧起始。表示数据帧开始的段。
(2)仲裁段。表示该帧优先级的段。
(3)控制段。表示数据的字节数及保留位的段。
(4)数据段。数据的内容,一帧可发送0~8个字节的数据。
(5)CRC段。检查帧的传输错误的段。
(6)ACK段。表示确认正常接收的段。
(7)帧结束。表示数据帧结束的段。

在这里插入图片描述
(1) 帧起始(标准、扩展格式相同)
表示帧开始的段。1 个位的显性位(逻辑0)。

(2) 仲裁段(构成ID)
表示数据的优先级的段。标准格式和扩展格式在此的构成有所不同,如图:
在这里插入图片描述

*1 ID
从MSB开始,禁止高7位都为隐性,即不能:ID=1111111XXXX。
*2 RTR
远程请求位。0,数据帧;1, 遥控帧;
*3 SRR
替代远程请求位。设置为1(隐性电平);
*4 IDE
标识符选择位。0,标准帧;1,扩展帧;

(3) 控制段
控制段由 6 个位构成,表示数据段的字节数。标准格式和扩展格式的构成有所不同。
在这里插入图片描述
*1 保留位(r0、r1)
保留位必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。
*2 数据长度码(DLC)
数据的字节数必须为 0~8 字节。但接收方对 DLC = 9~15 的情况并不视为错误。
*3 IDE
标识符选择位。0,标准帧;1,扩展帧;

(4) 数据段
数据段可包含 0~8 个字节的数据。从 MSB(最高位)开始输出。
在这里插入图片描述
(5) CRC 段
CRC 段是检查帧传输错误的帧。由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用于与ACK段区别开来)构成。
在这里插入图片描述
*1 CRC的值计算范围包括:帧起始、仲裁段、控制段、数据段。
*2 接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。

(6) ACK 段
ACK 段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成。
在这里插入图片描述*1 发送单元的 ACK 段
发送单元在 ACK 段发送 2 个位的隐性位。
*2 接收单元的 ACK 段
接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束。这称作“发 送 ACK”或者“返回 ACK”。

(7),帧结束。由7个位的隐性位组成。标准帧和扩展帧在这个段格式完全一样。在这里插入图片描述

遥控帧
接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。
遥控帧的构成如图 24 所示。
(1) 帧起始(SOF)
表示帧开始的段。
(2) 仲裁段
表示该帧优先级的段。可请求具有相同 ID 的数据帧。
(3) 控制段
表示数据的字节数及保留位的段。
(4) CRC 段
检查帧的传输错误的段。
(5) ACK 段
表示确认正常接收的段。
(6) 帧结束
表示遥控帧结束的段。
在这里插入图片描述

遥控帧和数据帧的区别
• 数据帧和遥控帧的不同
 遥控帧的 RTR 位为隐性位,没有数据段。
 没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。
• 遥控帧没有数据段,数据长度码该如何表示?
 遥控帧的数据长度码以所请求数据帧的数据长度码表示。
• 没有数据段的数据帧有何用途?
 例如,可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下。

其他的帧比较简单,这里不做介绍。
优先级的决定
在总线空闲态,最先开始发送消息的单元获得发送权。
多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继
续发送。
仲裁的过程如图 28 所示。
在这里插入图片描述
位时序
帧是以位为单位的,由发送单元在非同步的情况下发送的每秒钟的位数称为位速率(波特率)。一个位可分为 4 段,分别是:
• 同步段(SS)
• 传播时间段(PTS)
• 相位缓冲段 1(PBS1)
• 相位缓冲段 2(PBS2)
这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。
也就是说,1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。
各段的作用和 Tq 数如下:
在这里插入图片描述
简要来说就是:
*1 同步段用来同步发送单元与接受单元的发送和接受的工作。
*2 传播时间段:属于一些硬件误差,无需理会。
*3 相位缓冲段:
举个例子:有两个单片机之间进行CAN通信,但是由于它们各自以独立的时钟进行工作,晶振可能存在偏差,导致时钟存在细微的误差,当发送数据较多时,这个误差会被逐渐放大,导致整个时序混乱,无法同步,这在汽车工业上是不允许的。
*4 再同步补偿宽度:其实就是一个由数个Tq组成的一个段,用来对同步误差进行补偿,下面对如何补偿进行阐述。

再同步
在接收过程中检测出总线上的电平变化时进行的同步调整。
每当检测出边沿时,根据 SJW 值通过加长 PBS1 段,或缩短 PBS2 段,以调整同步。但如果发生了超出 SJW值的误差时,最大调整量不能超过 SJW 值。再同步如图 34 所示。
在这里插入图片描述

最后

以上就是单薄火车为你收集整理的CAN通信详解的全部内容,希望文章能够帮你解决CAN通信详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部