CAN Frame是CAN总线通信的基本单位,它有多种类型,其中最常见的是数据帧(Data Frame),用于传输数据。数据帧有标准格式(Standard Format)和扩展格式(Extended Format),它们的字段如下:
-
标准格式的数据帧有七个字段,分别是:
- (1).帧起始(Start Of Frame-SOF),1 bits,显性信号,表示数据帧的开始 。
- (2).仲裁段(Arbitration Field-ARB Field),13 bits,包括标识符位(Identifier field-ID),12 bits,用于表示数据帧的优先级和功能地址 ;远程发送请求位(Remote Transfer Request-RTR),1 bit,用于区分数据帧和远程帧 。
- (3).控制段(Control Field-CTRL Field),7 bits,包括扩展标识符位(Identifier Extension bit-IDE),1 bit,用于表示该帧是标准格式还是扩展格式 ;(FDF event type是指CAN FD帧中的FDF bit(FD帧格式)的值,用于区分经典CAN帧和CAN FD帧。FDF event type有两种可能,分别是:
- FDF = 显性信号(0),表示该帧是经典CAN帧,使用标准的数据段长度和比特率12。
- FDF = 隐性信号(1),表示该帧是CAN FD帧,可以使用更长的数据段长度和更高的比特率
-
FDF event type的作用是让节点可以识别不同的帧格式,从而支持经典CAN和CAN FD的混合网络。CAN FD帧可以传输更高的速率和更长的数据段,提高了网络的效率和性能);数据长度编码位(Data Length Code-DLC),5 bits,用于表示该帧实际发送的数据的长度 。
- (4).数据段(Data Field-DATA Field),77个 bits,用于发送数据的内容 。
- (5).循环校验段(CRC Field),18 bits(这个长度不确定的),包括循环校验序列(CRC Sequence),17 bits,用于校验传输是否正确 ;界定符(Delimiter-DEL),1 bit,隐性信号,表示循环校验序列的结束 。
- (6).确认段(ACK Field),2 bits,包括确认位(ACK SLOT),1 bit,用于表示是否正常接收 ;界定符(Delimiter-DEL),1 bit,隐性信号 。
- 帧结束(End of Frame-EOF),7 bits,隐性信号,表示帧的结束 。
-
扩展格式的数据帧与标准格式的数据帧相比,在仲裁段和控制段有所不同:
- 仲裁段(Arbitration Field),32 bits,包括基本标识符位(Base identifier-Base ID),11 bits,与标准格式的标识符相同 ;替代远程请求位(Substitute Remote Request Bit-SRR),1 bit,隐性信号 ;扩展位(Identifier Extension Bit-IDEA),18 bits,用于扩展标识符的长度 ;远程发送请求位(Remote Transfer Request-RTR),1 bit,与标准格式相同 。
- 控制段(Control Field),6 bits,包括保留位0和保留位1(Reseved bit0-r0 and Reseved bit1-r1),2 bits,保留,以后使用 ; 数据长度编码位(Data Length Code-DLC),4 bits,与标准格式相同
其余字段与标准格式相同。
CAN frame中,IFS和Stuff Bits是两个不同的概念,它们的作用和占用的位数如下:
- IFS(帧间隔)是指在两个连续的CAN frame之间的空闲时间,用于让控制器处理接收到的帧或准备发送下一个帧。IFS由7个隐性信号(recessive bit)组成,占用7 bits。IFS是CAN协议中规定的必要字段,用于保证帧之间的同步和分离
- Stuff Bits(填充位)是指在CAN frame中,为了防止误判帧起始或帧结束,而在数据段和CRC段中插入的额外的位。Stuff Bits的规则是:如果在ARB,CTRL,DATA,CRC段中出现了连续5个相同的位(显性信号或隐性信号),则在这5个位后面插入一个与之相反的位。Stuff Bits不占用固定的位数,而是根据数据段和CRC段中的位模式动态变化。Stuff Bits的作用是保证数据传输的可靠性和正确性
下图中的黄色bit为stuff bits,有17个stuff bits
下图中的黄色bit为stuff bits,有15个stuff bits
CAN Frame中的显性信号和隐性信号是指CAN总线上的两种电平状态,用于表示逻辑0和逻辑1。显性信号是指CAN_H和CAN_L的电压差为2V,用0表示;隐性信号是指CAN_H和CAN_L的电压差为0V,用1表示
例如,如果一个CAN Frame的仲裁段为00000000000(标准格式),那么在CAN总线上,它会表现为11个显性信号,即CAN_H和CAN_L的电压差为2V的状态。如果一个CAN Frame的数据段为10101010(一个字节),那么在CAN总线上,它会表现为交替的显性信号和隐性信号,即CAN_H和CAN_L的电压差为2V或0V的状态