一、CAN协议的特点
1)在总线空闲时,所有单元都可以发送消息,两个以上单元同时发送消息时,对各消息的Identifier进行逐位仲裁比较,仲裁获胜的单元(具有较高优先级)可继续发送消息,仲裁失败的单元停止发送。
2)消息中没有地址,消息广播到总线上,任何总线上的单元都可以接收消息。在总线上增加单元,不会影响到其它的单元。
3)最高数据传输速率1Mbps(距离小于40m),最远传输距离10km(速率低于5kbps)。CAN总线两个节点之间的通讯距离与波特率成反比。工程常用为500kbit/s的通信速率。
类型 最高速率 描述
高速CAN 1Mbit/s 最通用的CAN总线类型
低速CAN 125kbit/s 容错,在一条总线短路时仍能正常工作
单线CAN 50kbit/s 主要用低速的车身电子单元、舒适及娱乐控制领域
4)CAN总线上可挂载多个单元,理论上挂载单元数没有上限,但受总线的时间延迟和电气负载限制。降低通信速率,可增加单元数量。
5)所有单元具有错误检测功能,检测出错误后会立即通知其他单元。正在发送消息的单元一旦检测出错误,会结束当前的发送。
1) 多主控制。 在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元
同时开始发送消息时, 根据标识符(Identifier 以下称为 ID)决定优先级。 ID 并不是
表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始
发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
2) 系统的柔软性。 与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
3) 通信速度较快,通信距离远。 最高 1Mbps(距离小于 40M),最远可达 10KM(速率低于 5Kbps)。
4) 具有错误检测、错误通知和错误恢复功能。 所有单元都可以检测错误(错误检测功能),
检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单
元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
5) 故障封闭功能。 CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
6) 连接节点多。 CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
二、网络拓扑
CAN节点挂载在CAN_L和CAN_H之间,为降低反射,高速CAN在CAN总线两端增加了120Ω电阻,低速CAN和单线CAN在节点位置增加了电阻。低速CAN在总的终端电阻为100Ω时性能最佳,因此,确定低速CAN的终端电阻,需要先确定网络中的节点数,每个终端提供100Ω的一部分,并不要求每个终端有相同的阻值,但总值应该为100Ω。如总线中有3个CAN节点,则接到网络上的6个终端电阻值均为600Ω。
对于高速CAN,当CAN_H - CAN_L < 0.5 时为隐性,即逻辑1;当 CAN_H-CAN_L>0.9V时为显性,即逻辑0。
对于低速CAN,当CAN_L = 5V, CAN_H = 0V时为隐性;当CAN_H = 3.6V,CAN_L = 1.4V时为显性。相较于高速CAN,低速CAN显性和隐性的电平差异更大,抗干扰能力更强,
单线CAN只有一根线,要求节点有较好的共地性,抗干扰能力较弱。
从该特性可以看出,显性电平对应逻辑 0, CAN_H 和 CAN_L 之差为 2.5V 左右。而隐性
电平对应逻辑 1, CAN_H 和 CAN_L 之差为 0V。在总线上显性电平具有优先权,只要有一个
单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都
输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在 CAN 总线的起止端都有一个 120Ω的终端电阻,来做阻抗匹配,以减少回波反射。
三、总线仲裁
总线空闲时,任何节点都可以发送报文。如果同时有多个节点发送报文,会出现总线访问冲突,CAN使用逐位仲裁的方式解决冲突。在仲裁期间,每个发送器都对发送的 Identifier 电平与被监控的总线电平进行比较,如果电平相同,则继续发送报文。若发送器发送了一个隐性电平,而监视到一个显性电平,则节点仲裁失败,退出发送状态。因此,Identifier越小,消息的优先级越高。若在非仲裁期间出现发送电平与监视电平不一致的状况,将产生错误事件。
四、消息机制
数据帧一般由 7 个段构成,即:
(1) 帧起始。表示数据帧开始的段。
(2) 仲裁段。表示该帧优先级的段。
(3) 控制段。表示数据的字节数及保留位的段。
(4) 数据段。数据的内容,一帧可发送 0~8 个字节的数据。
(5) CRC 段。检查帧的传输错误的段。
(6) ACK 段。 表示确认正常接收的段。
( 7) 帧结束。表示数据帧结束的段。
遥控帧 相比于数据帧,从帧结构上来看,只是少了数据段,包含六个段:帧起始、仲裁段、控制段、CRC段、ACK段、帧结束。
4.1 数据帧分解
1. 帧起始
帧的最开始的一位是帧起始,也叫SOF(Start Of Frame),SOF恒为显性位,即逻辑 0 。
帧起始表示CAN_H 和 CAN_L上有了电位差,也就是说,一旦总线上有了SOF就表示总线上开始有报文了。
**
2.仲裁段
**
仲裁段是用来判定一帧报文优先级的依据,仲裁段中的ID号也是实现报文过滤机制的基础。仲裁段由以下几个部分组成,
数据帧仲裁段:
遥控帧仲裁段:
可以看到相比于数据帧仲裁段RTR位恒为显性0,遥控帧仲裁段的RTR位恒为隐性1。
4.2 仲裁过程
在CAN总线通信中,有一种回读机制:指的是节点在向总线上发送报文的过程中,同时也对总线上的二进制位进行“回读”。通过这种机制,节点就可以判断出本节点发出的二进制位与总线上当前的二进制位是否一致。
还有一种叫做线与机制:指的是在总线上,显性位能够覆盖隐性位。
下面将以标准数据帧的一个例子来分析CAN总线的***非破坏性***逐位仲裁机制。
一条CAN总线上有Node_A 和 Node_B两个节点,在总线空闲时,总线上为隐性电平,就在这个时候Node_A 和 Node_B 这两个节点同时向总线上发送数据,如下图:
从图中可以看出,在Node_A 和 Node_B 传输数据前,总线处于空闲状态,为隐性电平1,这也就意味着,此时总线上的任意节点都可以向总线发送数据。
在某一时刻,Node_A 和Node_B两个节点同时向总线上发送数据。按照线与机制,总线上的电位为:
在Node_A和Node_B两个节点向总线发送数据时,他们同时回读总线上的电平。从图中我们可以看到,Node_A 和Node_B的ID10 、ID9、ID8电位相同,因此这两个节点从总线上听到的电位与他们自己发出的电位也相同,这个时候还没有分出胜负。
当Node_B回读总线上的 ID7 这一位时,发现总线上的电平跟它自己发送到总线上的不一样,此时,Node_B知道自己在争夺总线的仲裁中失败了,那么它主动地转换为接收状态,不再发出信息。
于是在此之后,总线上的电平和Node_A发出的电平一致,也就是说,Node_A占据了总线的发送权。
通过上面的分析我们可以看到,在整个仲裁过程中:
1.在Node_A获取总线的发送权之后,Node_A接着发送自己的Msg_A,因此在竞争总线的过程中不会对Msg_A的传输造成延时;
2.在两个节点竞争总线的过程中,不会破坏Msg_A;
正是由于上面的两点,才称之为非破坏性仲裁机制。
1)多主控制方式:只要总线空闲,总线上的任意节点都可以向总线上发送数据,直到节点在仲裁中一个个失败,最后只留下一个节点获得总线的发送权。
2)非破坏性仲裁机制:仲裁段逐位总裁,依靠回读机制、线与机制得以实现。
3)半双工通信:所谓半双工通信,指的是节点不能在自己发送报文的时候,同时接收其他节点发送来的报文。这是显然的,一个节点正在发送报文时,已经占据了总线的发送权,其他节点肯定不能向总线上发送报文
4.2.1 仲裁段中的RTR,SRR和IDE位
通过上面标准数据帧的仲裁过程分析,我们已经理解了CAN总线的仲裁机制。但同时也注意到仲裁段除了ID号之外,还有其他的位。**
1)RTR位:
Tranmission Request Bit (远程发送请求位)。在数据帧中,RTR位恒为显性位0,在遥控帧中,恒为隐性1。
Tips: 这么做的原因是保证数据帧优先级高于遥控帧。比如:在某一时刻t,节点Node_A发出了ID号为ID_2遥控帧报文来请求总线上的其它节点发出ID号为ID_2的数据帧报文。但是就在同一时刻t,节点Node_B发出了ID号为ID_2的数据帧报文。这个时候怎么办呢,显然依靠ID号不能仲裁出这两帧报文(一个遥控帧,一个数据帧,ID号相同)谁能占据总线的发送权,这种情况下,RTR位就起作用了,由于RTR在数据帧中恒为显性0,在遥控帧中恒为隐性1,所以在ID号相同的情况下,一定是数据帧仲裁获胜。这就解释了 RTR位的作用:在ID号相同的情况下,保证数据帧的优先级高于遥控帧。
2)SRR位
Substitutes for Remote Requests Bit(替代远程请求位),在扩展帧(数据帧或遥控帧)中,SRR恒为隐性位1,并且可以发现,扩展帧的隐性SRR位正好对应标准帧的显性RTR位,这就解释了 SRR位的作用:在前11位ID号相同的情况下,标准数据帧的优先级高于扩展数据帧;
3)IDE位
全称:Identifier Extension Bit(标识符扩展位)。在扩展帧中恒为隐性1,在标准帧中,IDE位于控制段,且恒为显性0。且扩展帧IDE位和标准帧IDE位位置对应,这就保证了: 在前11位ID号相同的情况下,标准遥控帧的优先级一定高于扩展遥控帧。
总结:
在ID号前11位相同的情况下:
RTR:保证数据帧优先级高于遥控帧;
SRR :保证标准数据帧的优先级高于扩展数据帧。
IDE :保证标准遥控帧的优先级高于扩展遥控帧。
4.2.2报文过滤
在CAN总线中没有地址的概念,CAN总线是通过报文ID来实现收发数据的。CAN节点上都会有一个验收滤波ID表,其位于CAN节点的验收滤波器中,如果总线上的报文的ID号在某个节点的验收滤波ID表中,那么这一帧报文就能通过该节点验收滤波器的验收,该节点就会接收这一帧报文。
Node_A发送了一帧ID号为ID_1的报文Msg_1,Node_B的验收滤波ID表中恰好有ID_1,于是乎Msg_1就会被Node_B接收。
- 报文过滤机制体现了CAN通信的两条特点:
- 1)一对一、组播和广播
2)系统的柔性:正是因为CAN总线上收发报文是基于报文ID实现的,所以总线上添加节点时不会对总线上已有的节点造成影响。
4.3 控制段
上图中, r0 和 r1 为保留位,必须全部以显性电平发送,但是接收端可以接收显性、隐性及
任意组合的电平。 DLC 段为数据长度表示段,高位在前, DLC 段有效值为 0~8,但是接收方接
收到 9~15 的时候并不认为是错误。
数据帧和遥控帧的控制段结构相同:
**
- 标准帧中IDE位对应扩展帧中的IDE位,保证在前11位ID号相同的情况下,标准帧的优先级一定高于扩展帧;
- 然后是保留位r0和r1(扩展帧),保留位r0和r1必须以显性电平发送,但是接受方可以接受显性、隐性及其任意组合的电平;
- 最后是4个字节的DLC(DLC3、DLC2、DLC1、DLC0)代表数据长度,指示了数据段中的字节数。对于没有数据段的遥控帧,DLC表示 该遥控帧对应的数据帧的数据段的字节数。
4.4 数据段
数据段可以包含0~8个字节的数据,从MSB(最高位)开始输出。
4.5 CRC段
CRC 段,该段用于检查帧传输错误。由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用
于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的。
CRC段包含CRC校验序列和CRC界定符。
此段 CRC 的值计算范围包括:帧起始、仲裁段、控制段、数据段。接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。
CRC界定符恒为隐性1。
4.6 ACK段
ACK 段,此段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位组成。
标准帧和扩展帧在这个段的格式也是相同的。
ACK段包含ACK槽和ACK界定符两个位
发送节点在ACK段发送两个隐性位,即发送方发出的报文中ACK槽为隐性1;这个过程叫发送 ACK/返回 ACK。发送 ACK 的是
在既不处于总线关闭态也不处于休眠态的所有接收单元中.
接收节点在接收到正确的报文之后会在ACK槽发送显性位0,通知发送节点正常接收结束。所谓接收到正确的报文指的是接收到的报文没有填充错误、格式错误、CRC错误。
.我们以标准数据帧为例来分析ACK段的工作方式:如图所示,Node_A为发送节点,Node_B为接收节点。Node_A在ACK段发送两个隐性位1。Node_B正确接收到这一报文后,在ACK段的ACK槽中填充了一个显性位0。注意,这个时候Node_A回读到的总线上的额电平为显性0,于是这个时候,Node_A就知道自己发出去的报文至少有一个节点正确接收了。
4.7 帧结束
这个段也比较简单,标准帧和扩展帧在这个段格式一样,由 7 个位的隐性位组成。
五、位时序
由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。
同步段(SS)
传播时间段(PTS)
相位缓冲段 1(PBS1)
相位缓冲段 2(PBS2)
这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。
1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定
位时序,多个单元可同时采样,也可任意设定采样点。
采样点,是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。
根据这个位时序,我们就可以计算 CAN 通信的波特率了。
前面提到的 CAN 协议具有仲裁功能,下面我们来看看是如何实现的。
在总线空闲态,最先开始发送消息的单元获得发送权。
当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程,如图
上图中,单元 1 和单元 2 同时开始向总线发送数据,开始部分他们的数据格式是一样的,
故无法区分优先级,直到 T 时刻,单元 1 输出隐性电平,而单元 2 输出显性电平,此时单元 1
仲裁失利,立刻转入接收状态工作,不再与单元 2 竞争,而单元 2 则顺利获得总线使用权,继
续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。