前言
本期我们就开始学习CAN总线的帧格式,对应帧格式的话,在前面我们学习I2C协议和SPI协议等协议的时候也是类似的学过这些协议在传输过程中是怎么样去实现数据的传输的。那么我们就开始今天的学习(视频:[1-2] 帧格式_哔哩哔哩_bilibili)
一、CAN总线帧格式分类
帧类型
用途
数据帧
发送设备主动发送数据(广播式)
遥控帧
接收设备主动请求数据(请求式)
错误帧
某个设备检测出错误时向其他设备通知错误
过载帧
接收设备通知其尚未做好接收准备
帧间隔
用于将数据帧及遥控帧与前面的帧分离开
1.数据帧(重点)
数据帧是我们主要学习的内容之一,同样的CAN数据帧也是跟其他通信方式类似的,首先是SOF此时是逻辑电平显性,总线被拉开。然后紧接着就是就是11位的ID位,是用来区分当前广播设备的ID,其划分为前三位中间四位后面四位,范围是0~7FF,紧接着就是RTR,用来区分数据帧和遥控帧,数据帧就是表示为显性0,遥控帧就是为显性1。
IDE是扩展位,如果是显性0就表示标准格式,隐性1是表示扩展格式。r0是表示保留位。
然后接着就是DLC这个表示的是后面数据的长度,DLC是4位,范围是0000~1111,但是DCL要跟着后面数据段Data一起的,DLC指定多少那么数据段就要发送多少字节,这里要一一对应的,数据段最大是64位也就是8个字节。
后面就是CRC校验段,当出现错误的时候这里基本上都会被发现的,然后驳回这个帧。
然后就是ACK段应答,这里跟I2C是很相似的,在进入ACK之前刚开始有一个CRC界定符,这时候发送方释放CAN总线,发送一个显性1作为起始标志,然后如果有接收方的话,接收方就会拿到总线,这时候接收方就会把总线给拉开使得为显性0,当此时发送方再次拿到总线的时候就会发现总线上变为显性了,那么就说明有人接收了,所以发送完成,最后就是结束位EOF,长度为7位,均为隐性1。
- SOF(Start of Frame):帧起始,表示后面一段波形为传输的数据位
- ID(Identify):标识符,区分功能,同时决定优先级344
- RTR(Remote Transmission Request ):远程请求位,区分数据帧和遥控帧
- IDE(Identifier Extension):扩展标志位,区分标准格式和扩展格式
- SRR(Substitute Remote Request):替代RTR,协议升级时留下的无意义位
- r0/r1(Reserve):保留位,为后续协议升级留下空间
- DLC(Data Length Code):数据长度,指示数据段有几个字节
- Data:数据段的1~8个字节有效数据
- CRC(Cyclic Redundancy Check):循环冗余校验,校验数据是否正确
- ACK(Acknowledgement):应答位,判断数据有没有被接收方接收
- CRC/ACK界定符:为应答位前后发送方和接收方释放总线留下时间
- EOF(End of Frame ):帧结束,表示数据位已经传输完毕
数据帧的发展历史
CAN 1.2时期,仅存在标准格式,IDE位当时仍为保留位r1
CAN 2.0时期,ID不够用,出现了扩展格式,增加了ID的位数,为了区分标准格式与扩展格式,协议将标准格式中的r1赋予了新功能—IDE
2.遥控帧
遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同
3.错误帧
总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备
4.过载帧
当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失
5.间隔帧
将数据帧和遥控帧与前面的帧分离开
二、位填充
•
位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据•
例如:即将发送: 100000110 10000011110 0111111111110 实际发送: 1000001110 1000001111100 011111011111010 实际接收: 1000001110 1000001111100 011111011111010 移除填充后: 100000110 10000011110 0111111111110
•
位填充作用:
- 增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精确掌握数据采样时机
- 将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性
- 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲
下面看一个有意思的示例:
下面展示的是原始数据11111 0000 1111 0000 1111 0000,那么如果去位填充处理的话就应该会变为 **11111 00000 11111 00000 11111 00000 **这里就是因为第一个连续的5个1而要去插入一个0导致后面的4个0变为5位,然后不得不再插入一个1,后面的4个1还是被新插入的数字影响……以此类推。这样就成了连锁反应了哈,不过这种情况很少出现,但出现了也是按照位填充的方式插入的,不要感到奇怪。
三、波形实例
•
标准数据帧,报文ID为0x555,数据长度1字节,数据内容为0xAA
•标准数据帧,报文ID为0x666,数据长度2字节,数据内容为0x12, 0x34 •扩展数据帧,报文ID为0x0789ABCD,数据长度1字节,数据内容为0x56
•标准遥控帧,报文ID为0x088,数据长度1字节,无数据内容
以上就是本期的全部内容了,我们下次见!
今日壁纸:
版权归原作者 Fitz& 所有, 如有侵权,请联系我们删除。