SXSBJSXYT

保持热爱,奔赴山海

 

CAN数据帧的标准格式刨析

1. 前言

图1.1-CAN帧的种类

        如图1所示,CAN通信帧的种类主要分为5种,本文主要展开来讲解数据帧的标准格式,数据帧是用于节点向外发送数据的帧。

2. 数据帧标准格式 

图2.1-标准数据帧的构成

       数据帧以一个显性位(逻辑0)开始,以7个连续的隐性位(逻辑1)结束,在它们之间,分别有仲 裁段、控制段、数据段、CRC段和ACK段。

如图2.1所示,数据帧由7个段构成:

(1)帧起始:表示数据帧开始的段。

(2)仲裁段:表示该帧优先级的段。

(3)控制端:表示数据的字节数及保留位的段。

(4)数据段:数据内容,0~8字节。

(5)CRC段:检查帧的传输错误的段。

(6)ACK段:表示确认正常结束的段。

(7)帧结束:表示数据帧结束的段。

2.1. 帧起始

        帧起始表示帧开始的段,1个位的显性位。

图2.2-帧起始

         帧起始信号只有一个数据位,是一个显性电平,它用于通 知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步

拓展:什么是硬同步?

        硬同步:接收单元在总线空闲状态检测出帧起始时进行的同步调整。

        如下图所示,可以看到当总线出现帧起始信号时,某节点检测到总线的帧起始信号不在节点内部时序的SS段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点 采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的SS段平移至总 线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了,这个过程就称之为硬同步。

2.2. 仲裁段

        仲裁段由12个位构成,是表示数据的优先级的段。

图2.3-仲裁段

        当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,仲裁段的内容主要为本数据帧的ID信息(标识符),标准格式的ID为11位,在CAN协议中,ID起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。

        如图2.3,仲裁段除了报文ID外,还有RTR。RTR 位(Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧

拓展:CAN总线“线与”特性?

        线与规则:总线上只要有一个节点发显性位(0),总线即为显性所有节点都发隐性位(1)时,总线才为隐性。

情况节点A节点B总线结果说明
1000正常显性
2010显性优先
3100显性优先
4111共同隐性

        若两个节点同时竞争CAN总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。见下图仲裁过程,在开始阶段,两个设备发送的电平一样,所以它们一直继续发送数据。到了图中箭头所指的时序处,节点单元1发送的为隐性电平,而此时节点单元2发送的为显性电平,由于总线的“线与”特性使它表达出显示电平,因此单元2竞争总线成功,这个报文得以被继续发送出去。

2.3. 控制段

        控制段由6个位构成,表示数据段的字节数。

图2.4-控制段

         IDE 位(Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。

        r0位,在控制段中的r0为保留位,保留位必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。

        DLC(数据长度码),它由4个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC段表示的数字为0~8。

图2.5-数据长度码和字节数的关系

2.4. 数据段 

        数据段包含0~8个字节的数据。从最高位(MSB)开始输出。

图2.6-数据段

 2.5. CRC段

图2.7-CRC段

         为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码(CRC的计算范围包括帧起始、仲裁段、控制段、数据段。),一旦接收节点算出的 CRC码跟接收到的CRC码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。 CRC部分的计算一般由CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。

        在CRC校验码之后,有1个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK 段间隔起来。

2.6. ACK段

        ACK段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位构成。

图2.8-ACK段

        在ACK槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在ACK槽和帧结束之间由ACK界定符间隔开。 

2.7. 帧结束

        帧结束是表示该该帧的结束的段。由7个位的隐性位构成

图2.9-帧结束

3. 实验验证

        下图是我用示波器抓的CAN总线上的一帧数据帧,波特率500KHz,1个bit位的周期是2us。在解码协议的时候需要注意位填充(见图3.3-位填充详解)。

图3.1-CAN数据帧
图3.2-bit位周期为2us
图3.3-位填充详解

 

posted on 2025-06-10 18:14  SXSBJSXYT  阅读(127)  评论(0)    收藏  举报  来源

导航