CAN总线学习笔记--数据帧与遥控帧
最近在学习can总线协议,想写一些关于接触can总线的想法,文章会参考部分正点原子的资料,但是会使用自己在notability里面做笔记时画的图来代替can手册中的图片。(文中的红色代表显性电平,绿色代表隐性,黄色代表不一定)
第一次写博客,写的不好大家见谅。
一、帧类型
CAN总线的通讯协议中有5种类型的帧
今天主要学习的是数据帧和遥控帧。
数据帧
数据帧是协议中用来发送数据的帧,在是整个协议的核心帧
如上图所示是数据帧的组成总览,can总线的数据帧有2中格式,扩展格式和标准格式的主要差别在于仲裁段和控制段。
数据帧主要由7个段组成:
1.帧起始 2.仲裁段 3.控制段 4.数据段 5.CRC段 6.ACK段 7.帧结束
下面我们来逐一分析
帧起始
在CAN总线没有信息发送和接受的时候,总线上表现为隐性电平。那么,器件是怎么知道数据段的开始呢?
在CAN总线的协议中,用一个显性电平(SOF)来表示数据帧的起始。当别的期间读到总线上有一个显性电平时,就知道一个帧要开始啦。
仲裁段
仲裁段跟在帧起始之后,里面包含着ID信息。仲裁段中包含的信息是CAN总线的灵魂,CAN总线作为一个没有地址信息的总线协议,仲裁段中的ID信息就承担着代替地址信息的使命。
由图中所示,仲裁段有两种类型
标准格式
在标准格式中,前11位表示ID信息,最后一位是RTR位,是数据帧与遥控帧的主要区别。在数据帧中,RTR位一定为显性。
前11位的ID信息位按道理来说有2048(2^11)种组成的可能,但是CAN总线规定了高7位不能劝为隐性电平,那么这样,在标准格式中,只有(2^11-2^4)=2032种ID的组成可能。
其中的RTR位,在数据帧中一定为显性电平,在遥控帧中一定为隐性电平,这决定了数据帧在和遥控帧争总线的时候,数据帧的优先级要高于遥控帧的优先级。
扩展格式
其实扩展格式和标准格式的主要功能并没有差别,但是扩展格式包含了29位的ID信息
在11位标准帧发送完毕后,扩展格式的仲裁段会发两个连续的隐性电平,来告诉别的器件这是扩展格式。同时,相比较标准格式的数据帧来说,标准格式的RTR位是显性电平,扩展格式的SRR位是隐性电平,这也意味着在扩展格式的数据帧和标准格式的数据帧争抢总线的时候,标准格式的数据帧拥有更高的优先级。
在发完两个隐性电平之后,会急剧发送扩展的18位ID,同样,扩展格式29位ID的高七位不能全为隐性电平,那么,扩展格式下有(2^18-2^4)*(2^11-2^4)=532644096种ID组合。
对比
总的来说,扩展格式能携带的ID种类很多,比标准格式大了很多个数量级,但是优先级不如标准格式。
ps.不知道各位小伙伴在看仲裁帧的时候有没有感觉奇怪,为什么高7位就不能全为隐性电平呢,继续看下去,看到最后就会知道答案了,这里先卖个关子。
控制段
控制段的主要作用是表示数据段中有几个字节的数据
控制段主要由六位组成,前两位是保留为,在发送时一定为隐性电平。
后四位是数据长度码,用来表示数据段的数据字节数。有意思的是,数据段最多只有8个字节的数据,但是控制段留了4位给数据长度码,这就意味着DLC为9~15时是没有意义的,但是接收方对DLC=9~15的数据并不会认为这是错误的。
DLC0~DLC3数值对应的数据长度如下图
数据段
数据段是包含数据信息的段落,他的长度不定,在0~64位之间。
值得注意的是,数据段的传输不同于其他段的传输,数据段是由MSB最高位开始的。
CRC段
CRC段是CAN总线实现纠错的一个非常重要的段。具体CRC的原理就不在此赘述了,要讲清楚可能要再开一个专栏了。
简单的来说,CRC段会根据前面的数据段(帧起始、仲裁段、控制段、数据段)的数值来计算生成CRC顺序。在此计算方式下,相同的被计算数值会输出相同的数值,当接收方接受到CRC段后,会计算CRC顺序和前面的数据段是否吻合,如果不吻合就会报错。是一个非常有效的纠错机制。
CRC段的组成是由15位的CRC顺序和1位的CRC界定符构成的。CRC界定符一定为隐性电平。
对CRC界定符的意义,我认为是留给接收方计算CRC顺序与之前的数据段能否吻合的一个机制。
ACK段
ACK是通信协议中非常常见的一种回应方式。通俗来讲,就是发送方问:“听到了吗?”,然后接收方回答:”我听到啦!”。如果发送方询问之后接收方没有回答,那么就是有可能在传输过程中出现了错误。
对于CAN总线通信协议来说,ACK段有2位,分别是ACK槽和ACK界定符。发送方会在连续发送两个隐性电平,而接收方会在ACK槽的地方发送一个显性电平以示受到。
这个CAN总线数据手册中的解释相对比较模糊不好理解,我看了别的论坛上用示波器抓到的通信信号来看,具体的ack过程是这样的
看到这里可能有小伙伴要问了,CAN总线不是可以一对多发送的吗,如果有一个出错,其他都是对的,那么出错的隐性电平就会被其他的显性电平覆盖。关于这个问题,会在后面的错误帧部分讲到,敬请期待啦~
帧结束
就像电视剧中军人的通信一样,最后要说一句“over”,发送机也要告诉接收机我说完了,于是这边是帧结束段的作用了
帧结束由七个隐性电平组成。
看到了这里是不是想到了什么呢? 就是之前为什么仲裁段的高7位不能全为隐性的原因。
数据帧总结
对于数据帧来说,仲裁段中的ID可供接收方筛选,控制段中的DLC来表明自己携带了多少字节的数据,CRC段用来纠错
遥控帧
CAN总线协议中的器件不单单能发送数据,也可以向别的设备请求数据。
遥控帧的大体结构和数据帧非常相似,两点最大的不同就是,遥控帧的RTR为隐性、遥控帧没有数据段。
对于遥控帧来说,仲裁段中的ID就是被请求数据的ID,控制段中的DLC代表着请求的数据的字节数。
下面是数据帧和遥控帧的对比
总结
这次数据帧和遥控帧的学习笔记就做到这里啦,我是第一次写blog。我在看数据手册的时候经常会觉得“他说的我都看得懂,但是连起来我就是不知道他在干什么”。所以我在写blog的时候想尽量多的写出自己的理解,同时用notability的笔记来直观的表现。限于本人技术,有讲错的地方请大家在评论区指正,有别的建议或者不懂的也可以在评论区告诉我呀~
谢谢观看