can帧格式 dlc_是时候聊一下CAN总线了(下)——CAN总线帧格式

2023-05-16

文/Edward

1

通讯速率和通讯距离

CAN总线是一种串行的差分总线,并且这种差分总线只传递数据信息,因此关于时钟信号收发两方是没有信号进行传递的。因此,CAN总线与绝大多数异步串行总线一样,需要收发双方约定好数据传输的波特率(bit/s)才可以确保数据的正常收发。常用的CAN总线波特率有125Kbits/s,250Kbits/s,500Kbits/s,1MKbits/s等,ISO11898中所定义的CAN总线的波特率最高为1Mbits/s。

尽管CAN总线的纠错能力很强,但是为了数据的准确收发,具体选择CAN总线的波特率应该以具体的工况来选择,选择波特率的主要依据为传输线的距离。具体传输距离和CAN波特率的关系可以参考表1。

表1 传输距离和CAN波特率的关系

2CAN总线的通讯模型

前面我们说了,CAN总线是一种可以允许多主机存在的半双工差分总线,所有节点可以自由地挂载在同一根CAN总线上,组成一个理想中的控制局域网络。在CAN总线传输过程中,所有节点都可以根据自身当前的状态来发送数据,先占据总线者则在当前时间向总线上的所有节点发送数据。而每个CAN节点都有一个叫做CAN ID的唯一标识符,当某个节点发现当前总线上的CAN数据是发给自己的,则将这一帧CAN数据接收后进行处理。当某个节点的CAN数据发送完成后,即释放CAN总线,同时允许别的节点占用总线。另外,现在绝大多数CAN总线控制器都自带硬件地址过滤器,因此,我们可以省去CAN总线的ID软件判断。

3CAN总线的帧类型

CAN总线上的数据被称为CAN报文,CAN报文有四种消息类型:

数据帧:从发送端携带数据到接收端。

远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。

错误帧:任何单元检测到一总线错误就发出错误帧。

过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供一附加的延时。

3.1

数据帧

CAN总线上面的报文绝大多数都是数据帧,一个完整的数据帧由七个部分组成,依次为:帧起始(SOF)、数据场(Data Field)、校验场(CRC Field)、应答场(ACK Field)、帧结尾(EOF)。具体数据场的排列如图1所示。需要注意的是,这个标准是CAN2.0A中规定的标准帧。

图1 数据帧格式

帧起始是数据帧和远程帧开始的标志,它是一个显性位。一个CAN节点只有在总线处于空闲状态时才可以发送帧起始。

帧起始发送完成之后,紧接着发送出的就是仲裁场,CAN2.0A的仲裁场一共有12位,如图2所示。在这12位中,前11位表示的是11位标识符,第12位是远程发送请求RTR。在数据帧中RTR为显性,在远程帧中RTR为隐性。所以如果相同标识符的数据帧与远程帧发生冲突,数据帧优先。CAN2.0B的仲裁场一共有32位,它在原有的CAN2.0A的基础上,将CAN ID扩展到了29位,并且向CAN2.0A兼容,如图3所示。

图2 CAN2.0A的12位仲裁场

图3 CAN2.0B的32位仲裁场

仲裁场之后便是控制场。控制场的头两位为保留位,为隐性。后面是数据长度代码DLC(Data Length Code)。数据长度代码指示了数据场中有效的字节个数。DLC的长度为4位二进制数,虽然可以最大范围可以表示到0~15,但是由于CAN总线的数据域长度最大为8个字节,所以DLC的大小最大为8。如果在设置CAN消息时,将DLC错误地设置成了大于8的数,其产生的后果各家的控制器都不相同,有些厂家的控制器会直接将其最大值限定在8,有些厂家的控制器则不会发送任何消息,直接判定为错误传输。如图4所示。

图4 控制场的格式

控制场传输完成之后,紧接着传输的就是数据场了,数据场里面传输的就是我们想要传输的数据,长度为8个字节,如图5所示。

图5 数据段的格式

CAN数据每次发送的时候,都会将CAN数据帧里面的有效数据进行CRC校验,并且将最终生成的CRC信息一起包含在数据帧中的CRC域内进行发送。接收端接收到一帧CAN总线数据后,会将接收到的数据进行CRC计算,并且同发出端的CRC校验码进行比较,如果相同,则代表当前接收到的信息是正确的。CRC校验域的格式如图6所示。

图6 CRC域

在经典CAN中,使用15位CRC,在硬件可使用移位和异或运算完成CRC的计算,而CAN FD规范中对帧数据长度进行了扩展,对于数据长度小于等于16字节的CAN FD帧,采用17位CRC,对于数据长度大于16字节的CAN FD帧采用21位CRC。CAN总线中使用的若干版本CRC生成多项式g整理如图7所示。

图7 常用的CAN总线CRC校验算法

接下来的两位数据域是ACK区域,即为CAN总线的应答场。应答场长度为2个位,包含应答间隙(ACK SLOT)和应答界定符(ACK DELIMITER)。在应答场里,发送站发送两个“隐性”位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK SLOT)期间(发送ACK信号)向发送器发送一“显性”的位以示应答。

应答间隙:所有接收到匹配CRC序列(CRC SEQUENCE)的站会在应答间隙(ACK SLOT)期间用以“显性”的位写入发送器的“隐性”位来作出回答。

ACK界定符:ACK界定符是ACK场的第二个位,并且是一个必须为“隐性”的位。因此,应答间隙(ACK SLOT)被两个“隐性”的位所包围,也就是CRC界定符(CRC DELIMITER)和ACK界定符(ACK DELIMITER)。CAN总线的应答场如图8所示。

图8 CAN的应答场

最后的7位数据是CAN总线的结束帧,为7位连续的1。如图9所示。

图9 帧结束

以上就是CAN总线数据帧格式的详细内容,我们可以看这一个CAN数据帧排列的所有数据域。如图10所示。

图10 CAN总线的完整数据帧

3.2远程帧

作为数据接收器的站,通过发送远程帧,可以启动其资源节点传送它们各自的数据。远程帧和数据帧非常类似,只是远程帧没有数据域。

上图就是远程帧的帧格式,它相对与数据帧没有远程帧,但是要注意发送远程帧的时候RTR位要置1,表示发送的是远程帧。图11更加清晰了呈现了这种结构。

图11 远程帧的结构

看Edward C语言视频,来点零食效果更佳啊。

正好又是双12,优惠享不停,小伙伴们赶紧选购吧。

详情点击下方链接👇👇👇

对于CAN总线,如果你想有个全面深入的认识,可以购买以下推荐书籍↓↓↓

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

can帧格式 dlc_是时候聊一下CAN总线了(下)——CAN总线帧格式 的相关文章

随机推荐