CAN总线上传输的信息称为报文,CAN通信是通过以下5种类型的帧进行的:
- 数据帧:用于发送单元向接收单元传送数据的帧
- 遥控帧:用于接收单元向具有相同ID的发送单元请求数据的帧
- 错误帧:用于当检测出错误时向其他单元通知错误的帧
- 过载帧:用于接收单元通知其尚未做好接收准备的帧
- 帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧
数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下简称 ID), 扩展格式有 29 个位的 ID。
一、数据帧
数据帧由7个段构成,如下所示:
- 帧起始:表示数据帧开始的段
- 仲裁段:表示该帧优先级的段,根据仲裁段ID码长度的不同,分为标准帧(CAN 2.0A)和扩展帧(CAN 2.0B);
- 控制段:表示数据字节数及保留位的段
- 数据段:数据的内容,可以发送0~8个字节的数据
- CRC段:检查帧的传输错误的段
- ACK段:表示确认正常接收的段
- 帧结束:表示数据帧结束的段
1.1、数据帧-帧起始
帧起始由1个显性位组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。
总线上的电平有显性电平和隐性电平两种。总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。
1.2、数据帧-仲裁段
表示数据优先级的段,标准格式和扩展格式的构成有所不同。
仲裁段用于写明需要发送到目的CAN节点的地址、确定发送的帧类型(当前发送的是数据帧还是遥控帧),并确定发送的帧格式是标准帧还是扩展帧。
仲裁段在标准格式帧和扩展格式帧中有所不同。标准格式帧的仲裁段由11位标识符和远程发送请求位RTR组成,扩展格式帧的仲裁场由29位标识符和远程发送请求位RTR组成。
1.3、数据帧-控制段
控制段由 6 个位构成,表示数据段的字节数。标准格式和扩展格式的构成有所不同。控制段包括数据长度代码和两个将来作为扩展用的保留位,数据长度代码指示了数据段中的字节数量。数据长度代码为4个位,在控制段里被发送,数据帧长度允许的字节数为0、1、2、3、4、5、6、7、8,其他数值为非法的。
- 保留位 (r0、r1)
保留位必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。 - 数据长度DLC
数据长度码与数据的字节数的对应关系如下表所示。数据的字节数必须为 0~8 字节。但接收方对DLC = 9~15 的情况并不视为错误。
D是显性电平 R是隐性电平
1.4、数据帧-数据段
数据段由数据帧中的发送数据组成,它可以为0~8字节,每字节包含了8位,首先发送最高有效位MSB,依次发送至最低有效位LSB。
1.5、数据帧-CRC
CRC段是检查帧传输错误的帧,包括:15 个位的 CRC序列(CRC SEQUENCE)和1 个位的CRC界定符(CRC DELIMITER用于分割的位)构成。
CRC序列是根据多项式生成的CRC值,CRC的计算范围包括帧起始、仲裁段、控制段、数据段。接收方以同样的算法计算CRC值并进行比较,不一致时会通报错误。
1.6、数据帧-ACK
ACK段用来确认是否正常接收。由ACK 槽(ACK Slot)和ACK界定符(ACK DELIMITER)两个位构成。
- 发送单元的ACK段
发送单元在ACK段发送2个位的隐性位 - 接收单元的ACK 段
当接收器正确地接收到有效的报文时,接收器就会在应答间隙(ACK SLOT)期间(发送ACK 信号)向发送器发送一个“显性”位以示应答,通知发送单元正常接收结束,这称作“发送 ACK”或者“返回 ACK”。 - 发送 ACK/返回 ACK是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元 (发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。
1.7、数据帧-帧结束
帧结束是由每一个数据帧和远程帧的标志序列界定的,这个标志序列由7个“隐性”位组成。
作者: 千里和他的软件测试