写点什么

详解 CAN 总线:CAN 总线报文格式—数据帧

  • 2022 年 9 月 25 日
    北京
  • 本文字数:1969 字

    阅读完需:约 6 分钟

详解CAN总线:CAN总线报文格式—数据帧

CAN 总线上传输的信息称为报文,当总线空闲时任何连接的单元都可以开始发送新的报文。

CAN 通信是通过以下 5 种类型的帧进行的:

  • 数据帧

  • 遥控帧

  • 错误帧

  • 过载帧

  • 帧间隔

另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下简称 ID), 扩展格式有 29 个位的 ID。

各种帧的用途如下表所示:

​近期打算写 5 篇文章,分别详细介绍这 5 种类型的 CAN 总线报文格式,本篇博文将详细讲解 CAN 数据帧格式,创作不易,请各位朋友多多点赞、收藏、关注支持~

关注公众号:美男子玩编程,优先推送最新技术博文~

数据帧由 7 个段构成,图解说明如下所示:

  • 帧起始:表示数据帧开始的段;

  • 仲裁段:表示该帧优先级的段,根据仲裁段 ID 码长度的不同,分为标准帧(CAN 2.0A)和扩展帧(CAN 2.0B);

  • 控制段:表示数据的字节数及保留位的段;

  • 数据段:数据的内容,可发送 0~8 个字节的数据;

  • CRC 段:检查帧的传输错误的段;

  • ACK 段:表示确认正常接收的段;

  • 帧结束:表示数据帧结束的段。

1、帧起始

帧起始由 1 个显性位组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。

​总线上的电平有显性电平和隐性电平两种。

总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。

“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强。)

2、仲裁段

仲裁段用于写明需要发送到目的 CAN 节点的地址、确定发送的帧类型(当前发送的是数据帧还是遥控帧),并确定发送的帧格式是标准帧还是扩展帧。

仲裁段在标准格式帧和扩展格式帧中有所不同。标准格式帧的仲裁段由 11 位标识符和远程发送请求位 RTR 组成,扩展格式帧的仲裁场由 29 位标识符和远程发送请求位 RTR 组成。

2.1、标准数据帧

标准数据帧基于早期的 CAN 规格(1.0 和 2.0A 版),使用了 11 位的识别域。

CAN 标准帧帧信息是 11 字节,包括帧描述符和帧数据两部分。如下表所列:

​前 3 字节为帧描述部分。字节 1 为帧信息,第 7 位(FF)表示帧格式,在标准帧中 FF=0,第 6 位(RTR)表示帧的类型,RTR=0 表示为数据帧,RTR=1 表示为远程帧。DLC 表示在数据帧时实际的数据长度。

标准数据帧的 ID 有 11 个位。从 ID10 到 ID0 依次发送。禁止高 7 位都为隐性(禁止设定:ID=1111111XXXX)。

字节 2~3 为报文识别码,其高 11 位有效。

字节 4~11 为数据帧的实际数据,远程帧时无效。

2.2、扩展数据帧

CAN 扩展帧帧信息是 13 字节,包括帧描述符和帧数据两部分,如下表所示:

​前 5 字节为帧描述部分。字节 1 为帧信息,第 7 位(FF)表示帧格式,在扩展帧中 FF=1,第 6 位(RTR)表示帧的类型,RTR=0 表示为数据帧,RTR=1 表示为远程帧。DLC 表示在数据帧时实际的数据长度。

扩展格式的 ID 有 29 个位。基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0 表示。基本 ID 和 标准格式的 ID 相同。禁止高 7 位都为隐性(禁止设定:基本 ID=1111111XXXX)。

字节 2~5 为报文识别码,其高 28 位有效。

字节 6~13 为数据帧的实际数据,远程帧时无效。

3、控制段

控制段由 6 个位组成,包括数据长度代码和两个将来作为扩展用的保留位,标准格式和扩展格式的构成有所不同。

数据长度代码指示了数据段中的字节数量。数据长度代码为 4 个位,在控制段里被发送,数据帧长度允许的字节数为 0、1、2、3、4、5、6、7、8,其他数值为非法的。

​保留位(r0、r1)必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。

数据长度码(DLC)与数据的字节数的对应关系如下表所示:

​数据的字节数必须为 0~8 字节,但接收方对 DLC = 9~15 的情况并不视为错误。

4、数据段

数据段由数据帧中的发送数据组成,它可以为 0~8 字节,每字节包含了 8 位,首先发送最高有效位 MSB,依次发送至最低有效位 LSB。

​5、CRC 段

CRC 段是检查帧传输错误的帧,包括:15 个位的 CRC 序列(CRC SEQUENCE)和 1 个位的 CRC 界定符(CRC DELIMITER)构成。

CRC 序列是根据多项式生成的 CRC 值,CRC 的计算范围包括:帧起始、仲裁段、控制段、数据 段。 接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。

6、ACK 段

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

发送单元在 ACK 段发送 2 个位的隐性位。当接收器正确地接收到有效的报文时,接收器就会在应答间隙(ACK SLOT)期间(发送 ACK 信号)向发送器发送一个“显性”的位以示应答,通知发送单元正常接收结束,这称作“发送 ACK”或者“返回 ACK”。

发送 ACK/返回 ACK 是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元 (发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。

7、帧结束

帧结束是由每一个数据帧和远程帧的标志序列界定的,这个标志序列由 7 个“隐性”位组成。


发布于: 刚刚阅读数: 4
用户头像

【研究方向】物联网、嵌入式、AI、Python 2018.02.09 加入

嵌入式工程师,创客爱好者,公众号:美男子玩编程,全网粉丝10万+。 CSDN博客专家、微软MVP、华为云云享专家、阿里云专家博主、知乎认证科学技术领域答主。

评论

发布
暂无评论
详解CAN总线:CAN总线报文格式—数据帧_汽车电子_不脱发的程序猿_InfoQ写作社区