本文主要介绍CAN总线的帧类型及结构。
CAN总线定义五种帧类型,分别为数据帧、远程帧、错误帧、过载帧和帧间隔。数据帧就是总线上传输用户数据的帧,其最高有效载荷是8字节(CAN FD为64字节),除了有效载荷外,数据帧还包括必要的帧头帧位部分以执行CAN标准通信,比如消息标识符(Identifier)、数据长度代码、校验信息等。远程帧是用来向总线上其它节点请求数据的帧,它的帧结构与数据帧相似,只不过没有有效载荷部分;错误帧是表示通信出错的帧;帧间隔是用来隔离数据帧或者遥控帧的。
数据帧和远程帧有标准格式和扩展格式两种格式。标准格式有11位的标识符,扩展格式有29位标识符。
帧类型 | 帧用途 | 备注 |
数据帧 | 用于发送单元向接收单元传送数据的帧 | 分为标准格式和扩展格式,标准格式有11位标识符,扩展格式有29位标识符 |
遥控帧 | 用于接收单元向具有相同ID的发送单元请求数据的帧 | |
错误帧 | 用于当检测出错误时向其它单元通知错误的帧 | |
过载帧 | 用于接收单元通知其尚未做好接收准备的帧 | |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开来的帧 | 过载帧和错误帧前不能插入帧间隔 |
数据帧
数据帧的帧结构如下图所示:
各个字段定义及长度分别为:
SOF:表示数据帧开始;(1bit)
Identifier:标准格式11 bit,扩展格式29 bit包括Base Identifier(11bit)和Extended Identifier(18bit),该区段标识数据帧的优先级,数值越小,优先级越高;
RTR:远程传输请求位,0时表示为数据帧,1表示为远程帧,也就是说RTR=1时,消息帧的Data Field为空;(1bit)
IDE: 标识符扩展位,0时表示为标准格式,1表示为扩展格式;(1bit)
DLC:数据长度代码,0~8表示数据长度为0~8 Byte;(4bit)
Data Field:数据域;(0~8Byte)
CRC Sequence:校验域,校验算法G(x) = x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1;(15bit)
DEL:校验域和应答域的隐性界定符;(1bit)
ACK:应答,确认数据是否正常接收,所谓正常接收是指不含填充错误、格式错误、 CRC 错误。发送节点将此位为1,接收节点正常接收数据后将此位置为0;(1bit)
SRR:替代远程请求位,在扩展格式中占位用,必须为1;(1bit)
EOF:连续7个隐性位(1)表示帧结束;(7bit)
ITM:帧间隔,Intermission (ITM),又称Interframe Space (IFS),连续3个隐性位,但它不属于数据帧。帧间空间是用于将数据帧和远程帧与前面的帧分离开来的帧。数据帧和远程帧可通过插入帧间空间将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间空间。
远程帧
一般情况,数据是由发送单元主动向总线上发送的,但也存在接收单元主动向发送单元请求数据的情况。远程帧的作用就在于此,它是接收单元向发送单元请求发送数据的帧。远程帧与数据帧的帧结构类似,如下图所示。
远程帧与数据帧的帧结构区别如下表所示:
帧起始 | 仲裁段 | 控制段 | 数据段 | CRC段 | ACK段 | 帧结束 | |
意义 | 表示帧开始 | 表示数据优先级 | 表示数据段的字节数 | ||||
数据帧 | 1位显性位 | 11位或29位(RTR位为显性) | 6位 | 0~8个字节 | 15位CRC值和1位CRC界定符 | 1位ACK槽和1位ACK界定符 | 7位隐性位 |
遥控帧 | 1位显性位 | 可请求具有相同ID的数据帧(RTR位为隐性) | 6位 | 无 |
当总线上具有相同标识符的数据帧和远程帧同时发送时,由于数据帧的 RTR 位是显性的,数据帧将在仲裁中赢得总线控制权。
错误帧
用于在接收和发送消息时检测出错误时,通知错误的帧。错误帧由错误标志和错误界定符构成。错误帧的帧结构如下图所示。
错误标志:6-12 个显性/隐性重叠位
主动错误标志(6个显性位):处于主动错误状态的单元检测出错误时输出的错误标志
被动错误标志(6个隐性位):处于被动错误状态的单元检测出错误时输出的错误标志
错误界定符:8 个隐性位
过载帧
过载帧是用于接收单元通知发送单元它尚未完成接收准备的帧。在两种情况下,节点会发送过载帧:
接收单元条件的制约,要求发送节点延缓下一个数据帧或远程帧的传输;
帧间空间(Intermission)的 3 bit 内检测到显性位
每个节点最多连续发送两条过载帧。过载帧由过载标志和过载界定符(8 个隐性位)构成。过载帧的结构如下图所示。
帧间隔
帧间隔是用来隔离数据帧(或者遥控帧)的,也就是说,数据帧(或者遥控帧)通过插入帧间隔可以将本帧与先行帧(数据帧、遥控帧、错误帧、过载帧)分隔开来。但是过载帧和错误帧的前面不能插入帧间隔。
帧间隔有两种不同的形式:
主动错误状态的帧间隔
被动错误状态的帧间隔
间隔段:连续三个隐性位;间隔段期间,所有节点不允许发送数据帧或遥控帧,只要在这期间监听到显性位,接收节点就会发送过载帧。
空闲段:连续隐性位,个数不一定,0个或者多个都可以。总线空闲的时间是任意长的,只要总线空闲,节点就可以竞争总线。
暂停段:又叫做延迟传送段,只有处于被动错误状态的节点在发送帧间隔的时候,才会在帧间隔中插入8个连续隐性位的暂停段。
以上就是针对CAN总线的帧结构的介绍。
全部0条评论
快来发表一下你的评论吧 !