CAN总线详解

CAN是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车领域,汽车上大量的传感器与模块都是通过CAN总线连接起来的。CAN总线目前是自动化领域发展的热点技术之一,由于其高可靠性,CAN总线目前广泛的应用于工业自动化、船舶、汽车、医疗和工业设备等方面。目前主流控制器都自带CAN接口,因此可以开发CAN相关的设备。

CAN 协议简介

有关CAN协议详细内容请参考资料《CAN入门教程》,百度网盘可以下载:

链接:https://pan.baidu.com/s/1cQ-xXt9lgylTMyTxEtTKig 
提取码:98ip 

1,何为CAN?

CAN的全称为 Controller Area Network,也就是控制局域网络,简称为CAN。CAN最早是由德国 BOSCH(博世)开发的,目前已经是国际标准(ISO 11898),是当今应用最广泛的现场总线之一。BOSCH主要是做汽车电子的,因此CAN一开始主要是为汽车电子准备的,事实也是如此,CAN协议目前已经是汽车网络的标准协议。当然,CAN不仅仅应用于汽车电子,经过几十年的发展,CAN协议的高性能和高可靠性已经得到了业界的认为,目前除了汽车电子以外也广泛应用于工业自动化、医疗、工业和船舶等领域。

以汽车电子为例,汽车上有空调、车门、发动机、大量的传感器等,这些部件都是通过CAN总线连在一起形在一个网络,车载网络结构如下图:
在这里插入图片描述上图中的各个单元通过CAN总线连接在一起,每个单元都是独立的CAN节点。同一个CAN网络中所有单元的通信速度必须一致,不同的网络之间通信速度可以不同。如上图中的125Kbps的CAN网络下所有节点速度都是125Kbps的,整个网络由一个网关与其它网络连接。

1.1 CAN的应用实例

在这里插入图片描述

1.2 总线拓扑图

CAN控制器根据两根线上的电位差判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使用总线电平发生变化,将消息发送给接收方。
在这里插入图片描述

1.3 CAN的特点

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

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

③、通信速度快,距离远
最高 1Mbps (距离小于 40m),最远可达10km (速率低于 5Kbps)。

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

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

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

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总线就通过显性和隐性电平的变化来将具体的数据发送出去,如下图:
在这里插入图片描述
CAN总线上没有节点传输数据的时候一直处于隐性状态,也就是说总线空闲状态的时候一直处于隐性。CAN网络中的所有单元都通过 CAN_H 和 CAN_L 这两根线连接在一起,如下图:
在这里插入图片描述
途中所有的CAN节点单元都采用 CAN_H 和 CAN_L 这两根线连接在一上起,CAN_H 接 CAN_H、CAN_L接CAN_L,CAN总线两端要各接一个120Ω的端接电阻,用于匹配总线阻抗,吸收信号反射及回波,提高数据通信的抗干扰能力以及可靠性。

CAN总线传输速度可达 1Mbps/S,最新的CAN-FD最高速度可达 5M/bps/S,甚至更高,CAN-FD先不学习,后面需要补充的时候再补充。

CAN传输速度和总线距离有关,总线距离越短,传输速度越快。

3,CAN 协议

通过CAN总线传输数据是需要按照一定协议的,CAN协议提供了5种格式来传输数据:
数据帧、
摇控帧、
错误帧、
过载帧、
帧间隔

其中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有11位标识符(ID),扩展格式有29个标识符(ID)。以下是这5种帧用途。

帧类型帧用途
数据帧用于CAN节点单元之间进行数据传输的帧
遥控帧用于接收单元向具有相同 ID 的发送单元请求数据的帧
错误帧用于当检测出错误时向其它单元通知错误的帧
过载帧用于接收单元通知其尚未做好接收准备的帧
间隔帧用于将数据帧及遥控帧与前面的帧分离开来的帧

3.1 数据帧

数据帧由7段组成:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、数据段,数据的内容,一帧可发送 0~8 个字节的数据。
⑤、CRC段,检查帧的传输错误的段。
⑥、ACK段,表示确认正常接收的段。
⑦、帧结束,表示数据帧结束的段。
数据帧结构如下图:
在这里插入图片描述上图给出了数据帧标准格式和扩展格式两种帧结构,图中 D 表示显性电平0、R表示隐性电平1、D/R表示显性或隐性,也就是0或1。下面分析这7个段。

①、帧起始
帧超始很简单,标准格式和扩展格式都是由一个位的显性电平0来表示帧起始。

②、仲裁段
仲裁段表示帧优先级,仲裁段结构如下图:
在这里插入图片描述标准格式和扩展格式的仲裁段不同,标准格式 的ID为11位,发送顺序是为ID10 到 ID0,最高7位 ID10 ~ ID4不能全为隐性(1),也就是禁止0x1111 111x xxx 这样的ID。扩展格式的ID为29位,基本ID从 ID28 到 ID18,扩展ID由 ID17 到 ID0,基本ID与标准格式一样,禁止最高7位都为隐性。

③、控制段
控制段由6个位构成,表示数据段的字节数,标准格式和扩展格式的控制段略有不同,如下图:
在这里插入图片描述上图中的 r1 的 r0 为保留位,保留位必须以显性电平发送。DLC 为数据长度码,高位在前,DLC 段有效值范围为 0 ~ 8。4位的DLC与数据字节数对应关系如下图:
在这里插入图片描述

④、数据段
数据段也就是帧的有效数据,标准格式和扩展格式相同,可以包含 0~8 个字节的数据,从最高位(MSB)开始发送,结构如下图:
在这里插入图片描述
注意,上图中数据段的 0~64为bit,对应到字节就是 0 ~ 8字节。

⑤、CRC 段
CRC段保存CRC校准值,用于检查帧传输错误,标准格式和扩展格式相同,CRC段结构如下图:
在这里插入图片描述从上图中可以看出,CRC段由15位的CRC值与1位的CRC界定符组成。CRC值的计算范围包括:帧超始、仲裁段、控制段、数据段,接收方以同样的算法进行计算,然后用讲得到的CRC值与此CRC段进行比较,如果不一致就报错。

⑥、ACK 段
ACK段用来确认接收是否正常,标准格式和扩展格式相同,ACK段结构如下图:
在这里插入图片描述从上图可以看出,ACK段由ACK槽(ACK Slot) 和 ACK 界定符两部分组成。发送单元的ACK,发送2个隐性位,而接收到正确消息的单元在ACK槽(ACK Slot)发送显性位,通知发送单元正常接收结束,这个过程叫 发送ACK/返回ACK。发送ACK的是所有接收单元中接收到正常消息的单元,所谓正常消息是指不包含填充错误、格式错误、CRC错误的消息,这些接收单元既不处于总线关闭也不处于休眠态的所有接收单元中。

⑦、帧结束
最后就是帧结束段,标准格式和扩展格式相同,帧结束段结构如下图:
在这里插入图片描述
从上图可以看出,帧结束段很简单,由7位隐性位构成。

3.2 遥控帧

接收单元向发送单元请求数据的时候就用遥控帧,遥控帧有6个段组成:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、CRC段,检查帧的传输错误的段。
⑤、ACK段,表示确认正常接收的段。
⑥、帧结束,表示数据帧结束的段。
遥控帧结构如下图:
在这里插入图片描述从上图可以看出,遥控帧结构基本和数据帧一样,最主要的区别就是遥控帧没有数据段。遥控帧的 RTR 位为隐性的,数据帧的 RTR 位为显性,因此可以通过RTR位来区分遥控帧和没有数据的数据帧。遥控帧没有数据,因此DLC表示的是所请示的数据帧数据长度,遥控帧的其他段参考数据帧的描述即可。

3.3 错误帧

当接收或发送消息出错的时候使用错误帧来通知,错误帧由错误标志和错误界定符两部分组成,错误帧结构如下图:
在这里插入图片描述错误标志有主动错误标志和被动错误标志两种,主动错误标志是6个显性位,被动错误标志是6个隐性位,错误界定符由8个隐性位组成。

3.4 过载帧

接收单元尚未完成接收准备的话就会发送过载帧,过载帧由过载标志和过载界定构成。过载帧结构如下图:
在这里插入图片描述过载标志由6个显性位组成,与主动错误标志相同,过载界定符由8个隐性位组成,与错误帧中的错误界定符构成相同。

3.5 间隔帧

帧间隔用于分隔数据帧和遥控帧,数据帧和遥控帧可以通过插入帧间隔来将本帧与前面的任何帧隔开,过载帧和错误帧前不能插入帧间隔,帧间隔结构如下图:
在这里插入图片描述上图中间隔由3个隐性位构成,总线空闲为隐性电平,长度没有限制,本状态下表示总线空闲,发送单元可以访问总线。延迟发送由8个隐性位构成,处于被动错误状态的单元发送一个消息后的帧间隔中才会有延迟发送。

3.6 优先级的决定

在总线空闲态,最先开始发送消息的单元获得发送权。
当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可以继续发送。实现过程如下图:

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

(1) 数据帧和遥控帧的优先级
具有相同的ID的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性的数据帧具有优先权,可继续发送。如下图:
在这里插入图片描述(2) 标准格式和扩展格式的优先级
标准格式ID与具有相同ID的遥控帧或者扩展的数据帧在总线上竞争时,标准格式的RTR位为显性的具有优先权,可继续发送,如下图:
在这里插入图片描述

3.7 位填充

位填充是为了防止突发错误而设定的功能。当同样的电平持续5位时则添加一个位的反型数据。如下图:
在这里插入图片描述(1) 发送单元的工作
在发送数据帧和遥控帧时,SOF ~ CRC段间的数据,相同电平如查持续5位,在下一个位(第6个位)则要插入1位与前5位反型的电平。

(2)接收单元的工作
在接收数据帧和遥控帧时,SOF ~ CRC段间的数据,相同电平如果持续5位,需要删除下一个位(第6个位)再接收。如果这个第6个位的电平与前5位相同,将被视为错误并发送错误帧。

3.8 错误的种类

错误共有5种。多种错误可能同时发生。
· 位错误
· 填充错误
· CRC错误
· 格式错误
· ACK错误
错误的各类、错误的内容、错误检测帧 和 检测单元如下图:
在这里插入图片描述(1) 位错误
—— 位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出ACK的单元、输出错误的单元来检测。
—— 在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误。
—— 在仲裁段作为填充位输出隐性电平时,但检测出显性电平时,将不视为位错误,而是填充错误。
—— 发送单元在 ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的 ACK 应答,而非位错误。
—— 输出被动错误标志(6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同6个位的值(显性或隐性),并不视为位错误。

(2) 格式错误
—— 即使接收单元检测出 EOF(7 个位的隐性位)的最后一位(第 8 个位)为显性电平,也不视为格式错误。
—— 即使接收单元检测出数据长度码(DLC)中 9∼15 的值时,也不视为格式错误。

3.9 错误帧的输出

检测出满足错误条件的单元输出错误标志通报错误。
处于主动错误状态的单元输出的错误标志为主动错误标志;处于被动错误状态的单元输出的错误标志为被动错误标志。
发送单元发送完错误帧后,将再次发送数据帧或遥控帧。(关于错误见第4节)
错误标志输出时序如下图:
在这里插入图片描述

3.10 位时序

CAN总线以帧形式发送数据,但是最终到总线上的就是“0”和“1”这样的二进制数据,这里就涉及到了通信速率,也就是每秒钟发送多少位数据,前面说了CAN2.0最高速率为1Mbps/S。对于CAN总线,一个位分为4个段:
①、同步段(SS)
②、传播时间段(PTS)
③、相位缓冲段 1(PBS1)
④、相位缓冲段 2(PBS2)
这些段由Tq(Time Quantum)组成,Tq是CAN总线的最小时间单位。帧由位构成,一个位由4个段构成,每个段又由若干个Tq组成,这个就是位时序。1位由多少个Tq构成、每个段又由多少个Tq构成等,可以任意设定位时序。通过设定位时序,多个单元同时采样,也可任意设定采样点。各段的作用和Tq数如下图:
在这里插入图片描述1个位的构成如下图:
在这里插入图片描述上图中采样点是指读取总线电平,并将读到的电平作为位值的点。位置在PBS1结束处。根据这个位时序,我们就可以计算CAN通信的波特率了。

3.11 取得同步的方法

CAN协议的通信方法为 NRZ(Non-Return to Zero) 方式。各个位的开头或者结尾没有附加同步信号。发送单元以与位时序同步的方式开始发送数据。另外,接收单元根据总线上电平的变化进行同步并进行接收工作。

但是,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引起同步偏差。因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。

3.12 硬件同步

接收单元在总线空闲状态检测出帧起始时进行的同步调整。
要检测出边沿的地方不考虑 SJW 的值而认为是 SS 段。
硬件同步的过程如下图:
在这里插入图片描述

3.13 再同步

在接收过程中检测出总线上的电平变化时进行的同步调整。

每当检测出边沿时,根据SJW值通过加长PBS1段,或缩短PBS2段,以调整同步。但如果发生了超出SJW值的误差时,最大调整量不能超过SJW值。

再同步如下图:
在这里插入图片描述

3.14 调整同步的规则

硬件同步和再同步遵从如下规则:
(1) 1 个位中只进行一次同步调整。
(2) 只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。
(3) 在总线空闲且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。
(4) 在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件(1)和(2),将进行再同步。但还要满足下面条 件。
(5) 发送单元观测到自身输出的显性电平有延迟时不进行再同步。
(6) 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。

4,错误

4.1 错误状态的种类

单元始终处于 3 种状态之一。
(1) 主动错误状态
主动错误状态是可以正常参加总线通信的状态。

处于主动错误状态的单元检测出错误时,输出主动错误标志。

(2) 被动错误状态
被动错误状态是易引起错误的状态。

处于被动错误状态的单元虽然能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。

处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。

处于被动错误状态的单元检测出错误时,输出被动错误标志。

另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8个位的隐性位)。

(3) 总线关闭态
总线关闭态是不能参加总线上通信的状态。

信息的接收和发送均被禁止。

这此状态依靠发送错误计数接收错误计数来管理,根据计数值决定进入何种状态。错误状态和计数值的关系如下图:
在这里插入图片描述
在这里插入图片描述

4.2 错误计数值

发送错误计数值和接收错误计数值根据一定的条件发生变化。
错误计数值的变动条件如下图:
一次数据的接收和发送可能同满足多个条件。
错误计数器在错误标志的第一个位出现的时间点上开始计数。
在这里插入图片描述

  • 3
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值