CAN协议帧结构
一、数据帧的整体结构
┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐
│ SOF │ ID[11]│ RTR │ IDE │ DLC │ Data │ │ │ │ │ CRC │
│(1bit) │(11bit)│(1bit) │(1bit) │(4bit) │(0-8B) │ │ │ │ │(16bit)│
├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
│ 显性 │ ID值 │ 显性 │ 显性 │ DLC值 │ 数据0 │ 数据1 │ 数据2 │ ... │ 数据N │ CRC值 │
│(0) │(决定优先级)│(数据帧)│(标准帧)│(数据长度)│ │ │ │ │ │(校验)
└───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘ └───────┬───────┘ (如果是扩展帧,则ID为29位,且IDE为隐性) │ 扩展ID[18] (仅扩展帧有) EOF (帧结束,通常为一系列隐性位,不在此图中表示)
ACK槽 (确认槽,用于接收节点发送确认信号,也不在此图中表示)
CAN数据帧由多个字段组成,每个字段都承载着特定的信息,以确保数据在CAN总线上的高效、准确传输。
二、开始帧(Start of Frame, SOF)
- 功能:开始帧标志着数据帧的起始,它是一个特殊的位模式,用于同步总线上的所有节点。
- 实现:在CAN 2.0B规范中,开始帧是一个显性位(逻辑0)。
三、ID字段(Identifier Field)
- 功能:ID字段用于标识数据帧的优先级和类型。在CAN总线上,多个节点可能同时尝试发送数据。此时,ID字段的值决定了哪个数据帧将首先被传输。ID值越小,优先级越高。
- 长度:在标准帧中,ID字段为11位;在扩展帧中,ID字段为29位(但前11位与标准帧相同,后18位为扩展部分)。
四、RTR位(Remote Transmission Request Bit)
- 功能:RTR位用于区分数据帧和远程帧。当RTR位为显性(逻辑0)时,表示该帧为数据帧;当RTR位为隐性(逻辑1)时,表示该帧为远程帧。远程帧用于请求发送特定ID的数据帧。
五、IDE位(Identifier Extension Bit)
- 功能:IDE位用于标识帧是标准帧还是扩展帧。在标准帧中,IDE位为显性(逻辑0);在扩展帧中,IDE位为隐性(逻辑1)。IDE位的设置决定了ID字段的长度和帧的格式。
六、DLC(Data Length Code)
- 功能:DLC字段表示数据区的字节数。它告诉接收节点数据区中有多少个字节的数据需要接收。
- 长度:DLC字段通常为4位,可以表示0到8个字节的数据长度(在某些CAN实现中,DLC字段可能更长,以支持更多的数据长度)。
七、数据区(Data Field)
- 功能:数据区是实际传输数据的部分。它包含了节点想要发送给其他节点的信息。
- 长度:数据区的长度由DLC字段决定,最多可以包含8个字节的数据(在某些CAN实现中可能更多)。
八、CRC校验码(Cyclic Redundancy Check)
- 功能:CRC校验码用于检测数据帧在传输过程中是否发生了错误。它通过对数据帧的特定部分(通常是ID字段、RTR位、IDE位、DLC字段和数据区)进行多项式运算来生成。
- 实现:接收节点在接收到数据帧后,会对相同的部分进行相同的多项式运算,并将结果与发送节点发送的CRC校验码进行比较。如果两者相同,则表示数据帧在传输过程中没有发生错误;如果不同,则表示发生了错误,接收节点将丢弃该数据帧。
九、ACK槽(Acknowledgment Slot)
虽然ACK槽不是数据帧的一部分,但它在数据帧的传输过程中起着重要作用。ACK槽位于数据帧和错误帧之间,用于接收节点向发送节点发送确认信号(显性位表示确认,隐性位表示未确认)。如果接收节点正确接收了数据帧,它将在ACK槽期间发送一个显性位作为确认信号。
十、帧结束(End of Frame, EOF)
- 功能:帧结束标志着数据帧的结束。它是一系列隐性位,用于告知总线上的其他节点该数据帧已经传输完毕。