CAN总线的数据链路层需要解决很多问题,比如说收发目标选择、总线竞争、数据校验、错误机制等等。而CAN-bus上传输的基本单位是CAN帧,CAN-bus通过传输不同的帧实现以上这些功能,所以下面我们就从CAN-bus的帧开始说起。
CAN总线的报文帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔5种类型。
数据帧:用于发送节点向接收节点传送数据,是使用最多的帧类型。
远程帧:用于接收节点向某个发送节点请求数据。
错误帧:用于当某节点检测出错误时向其他节点通知错误的帧。
过载帧:用于接收节点向发送节点通知自身接收能力的帧。
帧间隔:用于将数据帧或远程帧与前面的帧分离的帧。
一、数据帧
数据帧是使用最多的帧,它由7个不同的位场组成:帧起始、仲裁场、控制场、CRC场、应答场、帧结尾。其中根据仲裁段ID码长度的不同,分为标准帧和扩展帧。数据场的长度可以为0。
1、帧起始和帧结束
帧起始和帧结束用于界定一个数据帧,无论是标准数据帧还是扩展数据帧都包含这两个段。
帧起始标志着数据帧和远程帧的起始,由一个单独的显性位组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。
帧结束由7个连续的隐形位组成。
2、仲裁段
如果多个节点同时发送数据时该怎么办呢?CAN-bus是如何解决总线竞争的问题呢?
该问题由仲裁段给出答案。
CAN-bus并没有规定节点的优先级,但通过仲裁段帧ID规定了数据帧的优先级。根据CAN2.0标准版本的不同,帧ID分为11位和29位两种。
RTR位:该位在数据帧里必须为“显性”,而在远程帧里必须为“隐形”。
TIPS:总线仲裁
CAN控制器在发送数据的同时监测数据线的电平是否与发送数据对应电平相同,如果不同,则停止发送并做其他处理。
假设节点A、B和C都发送相同格式相同类型的帧,如标准格式数据帧,它们竞争总线的过程是:
l 从该分析过程得出结论是:帧ID值越小,优先级越高;
l 对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况同理。
由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平,所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高:
l 节点A仲裁失败退出发送,进入只听模式;
l 节点B获得总线,继续发送剩余数据。
由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐性电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高。
当发送IDE位时,由于线与的原理,总线上出现显性电平,
l 节点B仲裁失败,进入只听模式。
l 节点A获得总线,继续发送剩余数据。
3、控制段
控制段共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成。
4、数据段
一个数据帧传输的数据量为0~8个字节,这种短帧结构使得CAN-bus实时性很高,非常适合汽车和工控应用场合。
与其他总线协议相比,CAN-bus的短帧结构具有以下优势:
l 数据量小,发送和接收时间短,实时性高。
l 数据量小,被干扰的概率小,抗干扰能力强。
5、CRC段
CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。CRC校验段由15位CRC值和1位CRC界定符构成。
6、ACK段
当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平。