-
根据标识符长度来分类的话,CAN帧有标准帧和扩展帧两种;根据用途来分类的话,CAN帧有数据帧、遥控帧、错误帧、过载帧四种:
帧类型 | 用途 | 差别 |
---|
数据帧 | 向其它节点发送数据 | 扩展数据帧比标准数据帧多20位(1位SRR替代遥控请求位,1位IDE标识符扩展位,18位ID标识符,均在仲裁场内) |
遥控帧 | 请求其它节点发送指定标识符的数据帧 | 扩展遥控帧比标准遥控帧多20位(1位SRR替代遥控请求位,1位IDE标识符扩展位,18位ID标识符,均在仲裁场内) |
错误帧 | 通知其它节点自己检测到总线错误 | 标准错误帧与扩展错误帧相同,因为不含仲裁场 |
过载帧 | 通知其它节点自己尚未做好接收准备 | 标准过载帧与扩展过载帧相同,因为不含仲裁场 |
帧间空间 | 每两帧之间需要有帧间空间,错误帧和过载帧除外 | 标准帧与扩展帧的帧间空间相同,因为不含仲裁场 |
-
一个标准/扩展数据帧(Data Frame)由如下7个部分组成:
帧起始(Start Of Frame)代表着一个数据帧或遥控帧开始传输,CAN设备只能在总线空闲的时候才能发起传输,它仅由一个“显性”位构成,CAN总线上的所有设备在该“显性”位的前沿会进行信号同步。
标准数据帧的仲裁场(Arbitration Field)由11位的标识符(ID,identifier)和1个遥控发送请求位(RTR-BIT,Remote Transmission Request BIT)组成。标识符的长度为11位,这些位以ID-10至ID-0的顺序发送(在支持CAN 2.0 B的设备中为ID-28至ID-18),最低位为ID-0(在支持CAN 2.0 B的设备中为ID-18),其中高7位(ID-10到ID-4)不能全为“隐性”位(在支持CAN 2.0 B的设备中为ID-28至ID-22),因此标识符的逻辑值越小优先级越高(逻辑值“0”代表“显性”位),在支持CAN 2.0 B的设备中标准帧里不存在的标识符低18位ID-17至ID-0可视为充零。遥控发送请求位RTR在数据帧中,必须是“显性”的,而在遥控帧中,遥控发送请求位RTR必须是“隐性”的,因此标准数据帧的优先级高于标准遥控帧。
扩展数据帧的仲裁场(Arbitration Field)由11位的基本标识符(Base ID)、1位的替代遥控请求位(SRR,Substitute Remote Request BIT)、1位的标识符扩展位(IDE,Identifier Extension Bit)、18位的扩展标识符(Extend ID)、遥控发送请求位(RTR-BIT,Remote Transmission Request BIT)组成。基本标识符的长度为11位,这些位以ID-28至ID-18的顺序发送,最低位为ID-18,其中高7位(ID-28到ID-22)不能全为“隐性”位。替代遥控请求位SRR是一个“隐性”位,对应于标准数据帧仲裁场中“显性”的遥控发送请求位RTR的位置,因此标准数据帧的优先级高于扩展数据帧。标识符扩展位IDE也是一个“隐性”位,对应于标准数据帧/遥控帧控制场第1个保留位r1这个“显性”位,因此标准遥控帧的优先级高于扩展数据帧,仅支持CAN 2.0 A的接收端检测到保留位r1是“隐性”位时会丢弃该帧,而支持CAN 2.0 B的接收端则会根据此位将该帧识别为扩展数据帧/遥控帧。扩展标识符包括18位,按ID-17到ID-0的顺序发送。遥控发送请求位在数据帧中,必须是“显性”的,而在遥控帧中,RTR位必须是“隐性”的,因此扩展数据帧的优先级高于扩展遥控帧。
控制场(Control Field)由6位组成,包括2位用作以后扩展的保留位(reserved bits)和4位数据长度码(Data Length Code)。发送端必须将两个保留位设置为“显性”位,若收到2个保留位不全是“显性”位的帧应该丢弃,而不是报错。数据长度码的逻辑值由下面的表格确定(d代表“显性”位,r代表“隐性”位):
数据场(Data Field)由数据帧中被发送的数据组成。它可包括0至8个字节,每个字节包括8位,其中首先发送最高有效位(MSB)。
CRC场(CRC Filed)由15位的CRC序列和1位的CRC定界符组成。CRC序列由由帧起始、仲裁场、控制场、数据场(假若存在)组成的无填充位流计算得出。CRC定界符紧跟在CRC序列后,由一个“隐性”位组成。
应答场(ACK Field)由1位应答槽(ACK Slot)和1位应答定界符(ACK Delimiter)组成。发送端应该将应答槽置为“隐性”位,若接收端的CRC校验结果为成功,则接收端应该在此时将应答槽置为“显性”位,发送端检测到总线状态为“显性”状态时就知道至少有一个接收端成功接受了该帧数据。应答定界符是一个“隐性”位。
帧结尾(End Of Frame)由7个“隐性”位组成。
-
一个标准/扩展遥控帧(Remote Frame)由如下6个部分组成(比数据帧少了数据场,并且仲裁场中的RTR遥控发送请求位为“隐性”,控制场中DLC数据长度码为请求的数据长度,其它部分与数据帧一致):
-
一个标准/扩展错误帧(Error Frame)由如下2个部分组成(连接在CAN总线上的设备总是处于"错误主动"状态或"错误被动"状态或“总线关闭”状态中的一种,状态之间的跳转由发送错误计数值TEC和接收错误计数值REC这两个变量确定):
错误标志(Error Flag)分为主动错误标志(Active Error Flag)和被动错误标志(Passive Error Flag)两种,主动错误标志由6个“显性”位组成(由处于"错误主动"状态的设备检测到错误时发送),被动错误标志由6个“隐性”位组成(由处于"错误被动"状态的设备检测到错误时发送,总线状态可以被其它设备重写成“显性”位),发出被动错误标志的设备检测到总线上有6个相同的逻辑值时即视为被动错误标志发送完毕。因为总线上可能有多个设备产生的错误标志发生重叠(如位错误与填充错误的错误标志相重叠),所以总线上错误标志的实际长度为6到12位。本文第四节会专门讲CAN协议的错误处理。
错误定界符(Error Delimiter)由8个“隐性”位组成,检测到总线上有8个连续的“隐性”位即为定界符传输完毕。
-
一个标准/扩展过载帧(Overload Frame)由如下2个部分组成(接收端在数据帧或遥控帧结束后需要有延迟时,或帧间空间的间歇期间检测到”显性“位后,应立即发送过载帧):
过载标志(Overload Flag)由6个“显性”位组成,与主动错误标志相同,过载标志也可能出现重叠。
过载定界符(Overload Delimiter)由8个“隐性”位组成,检测到总线上有8个连续的“隐性”位即为定界符传输完毕。
-
一个标准/扩展帧间空间(Interframe Space)由如下2个或3个部分组成(紧跟在数据帧或遥控帧后,可被错误帧或过载帧覆盖或打断):
间歇(Intermission)由3个”隐性“位组成,间歇期间所有设备不允许发送数据帧或遥控帧,但可以发送错误帧或过载帧。
暂停发送(Suspend Transmission)由8个”隐性“位组成,处于”被动错误“状态的设备在发送完一个数据帧或遥控帧后,应在帧间空间内多发8个”隐性“位以暂停发送,给其它可能想发送消息设备以抢占总线的时间。
总线空闲(Bus Idle)由任意数量的“隐性”位组成,总线空闲期间任意设备都可以开始发送消息。