前言:

年纪大就会发现之前学习过的内容,如果不常使用,不久就会忘个精光,为了方便日后查看,便将其记录起来。不积跬步,无以至千里。本章主要介绍数据链路层的帧格式。

CAN协议中4中类型的帧结构:

数据帧

远程帧

错误帧

过载帧

数据帧(Data frame):

数据帧,顾名思义携带数据从发送节点A到接收节点B,使节点A与节点B能进行数据交互。

数据帧分两种类型:①标准帧②扩展帧

![]()

标准帧使用的是CAN2.0A,CAN ID是11bit,ID最大也就是0x7FF,扩展帧使用的是CAN2.0B,CAN ID是29bit,ID最大可达到0x1FFFFFFFx(一般扩展帧ID后加x表示扩展帧);

数据帧,无论是标准帧还是扩展帧都主要包含七个部分:①帧起始、②仲裁场、③控制场、④数据场、⑤CRC场、⑥ACK场、⑦帧结束

帧起始:

说明:帧的最开始的一位是帧起始,也叫SOF(Star of Frame),固定为显性位,即逻辑0.标志着数据帧的帧开始了。帧起始只有在总线空闲期间节点才能够发送。

作用:用于同步,总线空闲期间的任何隐性到显性的跳变都将引起节点进行硬同步

仲裁场:

说明:标准帧的仲裁场主要有CAN ID和RTR组成,而扩展帧在标准帧的基础上,则多了SRR和IDE

作用:仲裁场主要作用在于区分哪个节点更优先,让更优先的节点掌握发送权,其他节点在静默等待总线空闲再进行下一回合的仲裁。

仲裁过程:在CAN总线中有一种回读机制,指节点在发送到总线报文的同时也对总线上当前的报文进行回读(为了判断自己发出的东西与总线上的东西是否一致);

还有一种线与机制,指总线上接收到多节点报文时,显性位(逻辑0)能覆盖隐形位(逻辑1)

例子:在总线上目前有两节点在发送报文,A和B 在ID8前发送的都一样,回读总线上报文也与自己发送出去的一致,但A节点在发ID8时,发现自己发送出去的和回读总线上的电平不一致,从而判断出总线上有其他比自己优先级高的节点也在发送报文,则A节点会主动退出发送,转换为接收,从而使B节点,掌握了总线的发送权,发送的报文也不存在延时,报文完整不被破坏,这也被称作非破坏性仲裁机制。

节点

SOF

ID10

ID9

ID8

ID7

...

A节点

0

1

0

1

-

-

B节点

0

1

0

0

0

1

总线

0

1

0

0

0

1

CAN ID:可确定唯一标识符,利用CAN ID 可对总线上报文进行仲裁优先级,ID值越小,优先级越高。

RTR:在标准帧中用于区别是数据帧还是远程帧,当RTR位为显性时,即逻辑0,为数据帧,当RTR位为隐性,即逻辑1时,为远程帧。RTR作用:在ID相同的情况下,保证数据帧优先级高于远程帧。

SRR:在扩展帧中(数据帧或远程帧),SRR横为隐性,即逻辑1,扩展帧的SRR位刚好对上标准帧的RTR位。SRR作用:在前11位ID相同的情况下,标准数据帧优先级高于扩展数据帧。

IDE:在扩展帧中恒为隐性,即逻辑1;

在数据帧中IDE位于控制段,且横为显性,即逻辑0;刚好标准帧的IDE和扩展帧的IDE位置对应上,IDE作用:在前11位ID相同的情况下,标准远程帧优先级高于扩展远程帧。

区分:

SOF

ID

RTR/SRR

IDE

区分为

0

XXX

0

0

标准数据帧

0

XXX

1

标准远程帧/扩展数据帧/扩展远程帧

0

XXX

1

0

标准扩展帧

0

XXX

1

1

扩展帧(数据/远程)

控制场:

说明:数据帧和远程帧的控制段结构相同。

IDE:标准帧的IDE对应扩展帧的IDE位置,

r/r1和r0:保留位,必须以显性,即逻辑0发送,但接收方,可接受显/隐性任意组合电平;

DLC:代表数据场的数据长度,对没有数据场的远程帧,DLC表示该远程帧对应的数据帧的数据场的字节数。

数据场:

说明:数据场就是我们节点携带的数据,需要相互交互的数据信息,0-64位,具体数据长度由控制场DLC决定。

数据场里低字节先发(Byte0....Byte7)

每个字节是高位先发(Bit7....Bit0)

超过一个字节的数据可以把低有效位放在前(Intel格式),也可以把高有效位放在前(Motorola格式)

CRC场:

说明:CRC场包含CRC校验序列和CRC界定符(恒为隐形,即逻辑1),通过多项式生成CRC值,比较发送节点与接受节点CRC是否一致,来确保帧的有效性,计算范围包括发送节点【帧起始、仲裁场、控制场、数据场】是否与接收节点【帧起始、仲裁场、控制场、数据场】是否一致。

ACK场:

说明:ACK场包含ACK槽和ACK界定符两位,

节点

ACK槽

ACK界定符

结果

发送节点

1

1

接收节点

0

1

表示接收节点已正确接收报文

帧结束:

说明:固定7个隐性位,即逻辑1构成。

帧间隔:

说明:固定为3个隐形位,即逻辑1构成。

当连续11位为隐性时,总线为空闲状态,节点可发送帧起始来让总线忙碌起来,接着就开始仲裁,又是一个忙碌的小总线~

![]()

远程帧(Remote frame):

当接收节点想快速获取某节点数据时,可向总线发送远程帧,远程帧数据场无内容

节点

ID

RTR

DLC

data

发送A节点(cycle=100ms)

XXX

0

8

xxxx

接收B节点(呀!等不急了,我马上就要数据)

XXX(与A节点ID一致)

1

8(与A节点的DLC一致)

----

发送A节点(收到B节点的远程帧,不等100ms了,马上回传数据)

XXX

0

8

xxxx

接收B节点(呀,收到数据啦~)