CAN总线帧格式(二)

CAN总线帧格式

CAN协议规定了以下5种类型的帧:

帧类型用途
数据帧发送设备主动发送数据(广播式)
遥控帧接收设备主动请求数据(请求式)
错误帧某个设备检测出错误时向其他设备通知错误
过载帧接收设备通知其尚未做好接收准备
帧间隔用于将数据帧及遥控帧与前面的帧分离开

数据帧

数据帧有标准格式和扩展格式两种,CAN总线标准刚制定时,只有标准格式,扩展格式是后来新增的,扩展格式增加了ID位数,能承载更多种类的ID。
在这里插入图片描述

标准格式:
  • 首先看图例,图上灰色部分,表示的是D意思是显性电平0,也就是灰色部分,必须发显性电平0。
  • 图上紫色部分,表示的是D/R,意思就是,这段时序根据你要发送数据的不同可以选择发D,也可以选择发R(隐性电平1)。
  • 之后白色部分,表示的是R,也就是这个位置必须是隐性电平1。
  • 最后这个,白色和灰色各占一半,这个是应答位特有的,在这一位,发送方必须发隐性1,接收方必须发显性0,也就是,发送方释放总线,接收方拉开总线,表示接收方对发送方的应答。
    在这里插入图片描述

在上图中间这里,写的数字表示的是此段时序所占的位数

注意
在这里插入图片描述

CAN总线数据帧分析

在发送数据帧之前,总线必须处于空闲状态。空闲状态时,总线是隐性电平,这里画的是逻辑表示所以是高电平1状态,颜色是白色,隐性。随后,数据帧开始。

数据帧第一位,这里线画的是低电平,颜色是灰色,表示此位必须是显性电平0。它的意思是SOF(帖起始),帧起始的作用是“打破宁静”。因为空闲是隐性1,所有设备都不去碰总线,那你要想开始发数据帧,第一位就必须得张开总线,发送显性0。如果你第一位发隐性1,那这个1就和前面的空闲状态融为一体了,没人知道你开始发数据了,所以,数据帧必须以显性0开头,同时也告诉接收方,接下来的一段时间里,我要是再释放总线,总线处于隐性1,那不是空闲,而是我想要发送的就是1。

继续,1位帧起始之后,首先发送的是报文ID,标准格式是11位。如果你想发报文ID是10101010101,那这一段时序就是:隐显隐显隐显隐显隐显隐。报文ID的用途,它可以表示后面数据data的功能。因为总线上各种报文消息都有,如果没有ID加以区分,那肯定就搞混了。同时,报文ID还用于区分优先级。当多个设备同时发送时,根据仲裁规则,ID小的报文优先发送,ID大的报文等待下一次总线空闲再重试发送。不同功能的数据帧,其ID都不同。否则两个设备同时发相同ID的数据帧,那仲裁规则就没办法判断谁先谁后了。

之后紧跟着的是RTR(远程请求标志位),占据1位。在数据帧里必须为显性0。RTR的意思是远程请求标志位,用于区分数据帧还是遥控帧的。这里是数据帧,所以必须是0。那报文ID加上RTR位,可以称为仲裁段。仲裁主要靠ID来实现,RTR也加入进来的目的是,相同ID的数据帧和遥控帧,数据帧的优先级大于遥控帧,数据帧和遥控帧的ID是可以相同的。这里和I2C很像,I2C也有多主机模式,其仲裁段,也是7位从机地址+1位读写位,12C起始后,首先发7位从机地址,指定从机,+1位读写位,表示写入还是读取,这里也一样,11位报文ID表示报文功能,+1位RTR,数据帧就是写入,遥控帧,其实就可以理解为读取了,只是CAN总线的设计,取消了从机地址的概念,它不对从机地址进行分配,而是对报文消息ID进行分配,这样做的好处就是,同一条报文,可以被多个设备同时接收。

之后进入控制段。控制段首先是IDE(ID扩展标志位),用于区分标准格式还是扩展格式。标准格式固定为显性0。扩展格式这一位就固定为隐性1。

之后下一位是r0(保留位),必须为显性0。r0意思是保留位,目前还没有用到。保留位的意义重大,设计者升级就容易很多。

继续看,后面4位是DLC(数据段的长度),意思是表示CAN总线一帧数据可以有1~8个字节有效载荷,通过DLC来灵活指定。如果想发一个字节,DLC就给0001。当然DLC要配合后面的数据段来使用。数据段就是有效载荷的数据了最大64位(即8个字节)。这里位数要是8的倍数,别说我数据段只给7位,那是不行的。

之后是CRC段,有15位。CRC是一种高效的校验算法,它会对前面所有的数据位进行CRC算法计算。从SOF到Data这些数据位计算得到一个校验码附在这后面。接收方收到数据和校验码之后也会调用CRC算法进行计算看看计算的校验码是否一致以判断传输是否有错误。

然后是CRC界定符(1位),必须是隐性电平。之后跟着就是ACK段(有ACK槽和ACK界定符各占1位)。ACK槽的作用就是应答。它的基本思想就是:当发送方发完一帧数据的主要内容后在应答这一位时发送方释放总线,总线回归默认状态,隐性1。如果接收方收到数据了,就再ACK槽这一位主动出击把总线再拉开,使总线呈现显性0的状态,发送方释放总线后在ACK槽会读取总线状态,如果发送方读取为显性0,说明接收方接收到了知道数据被正确接收了;如果发送方读取为隐性1,说明发送失败可以配置自动重发。

在ACK槽这一位前后,操作总线的权力是有一个短暂的交换的,前面所有波形。都只有发送方有权操作总线,在ACK槽这一位时,变为接收方操作总线,为了给权力交接留出时间,ACK槽前后,就要留两个界定符,在CRC界定符时,发送方必须发隐性1,除了做一个分隔,另一个作用就是,在ACK槽之前,发送方必须释放总线发送隐性1,就是释放总线,之后在ACK槽的时间点,接收方会拉开总线,ACK槽接收后,接收方不能一直拉着不放,所以在ACK界定符时,接收方必须及时释放总线,交出控制权。这就是ACK槽的设计和一前一后两个界定符的用途。

这里有两个注意事项
第一是,ACK槽时可以允许多个接收方共同拉开总线,因为一个报文消息,可以被多个设备同时接受,所以多个设备可以在这里同时拉开
第二是,要知道,并不是发送方把一段波形完整发出去,然后再接收应答的,而是,发送方和接收方共同完成一整个波形,发送方每发出一位,接收方就立刻收到这一位了,所以在这条时序的最后,整个数据帧还没结束,接收方其实已经收完了,所以这里短暂交接权力,让接收方操作一下总线,产生应答,应答之后,发送方的整个数据帧才结束,也就是说,应答是夹在发送过程之中的

最后,应答结束后,发送方再发7个隐性1作为EOF(帧结束)。

扩展格式:
  • 扩展格式出现的原因就是标准格式的11位ID不够用了,需要加一些。

数据帧各部分用途简介

  • SOF(Start of Frame):帧起始,表示后面一段波形为传输的数据位。
  • ID(Identify):标识符,区分功能,同时决定优先级。
  • 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):帧结束,表示数据位已经传输完毕。

遥控帧

用途是,接收设备主动请求数据。
遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同。
在这里插入图片描述

遥控帧请求与数据帧响应

如果某个设备需要数据,首先,接收方会发出一个遥控帧,该帧包含报文ID。遥控帧是广播出来的,因此每个设备都能接收到这个帧。

接着,如果某个设备持有与请求ID相匹配的数据,它将通过一个数据帧来广播这些数据。这样,请求数据的接收方就能及时获取所需的数据。

遥控帧与数据帧的配合

遥控帧实现的是请求式数据传输,它需要数据帧的配合来完成整个传输过程。每次数据传输都需要一个请求和一个响应的两个步骤,这种方式适合使用频率低但偶尔需要集中使用几次的情况。

如果数据的使用频率很高,使用遥控帧请求式传输可能就不太合适了。

遥控帧的结构

遥控帧的数据长度码(DLC)之后没有数据段,直接跟随的是CRC校验码。当设备发出遥控帧时,它表示请求对应ID的数据。响应请求的一方将使用相同ID的数据帧来反馈数据。

值得注意的是,当请求和响应数据同时发生时,数据帧拥有更高的优先级**。

错误帧

总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备
在这里插入图片描述

过载帧

当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失
在这里插入图片描述

帧间隔

将数据帧和远程帧与前面的帧分离开
在这里插入图片描述

位填充

位填充规则

发送方在每发送5个相同电平后,会自动追加一个相反电平的填充位。接收方在检测到填充位时,会自动移除填充位,以恢复原始数据的完整性。
例如

即将发送:100000110100000111100111111111110
实际发送:10000011101000001111100011111011111010
实际接收:10000011101000001111100011111011111010
移除填充后:100000110100000111100111111111110
位填充的作用
  1. 增加波形的定时信息:这有助于接收方执行“再同步”,防止由于波形长时间无变化而导致接收方无法精确掌握数据采样时机。

    例如,如果发送的数据帧中的数据段包含8个字节(64位),且这些字节的内容都是FF(全为1),那么在数据段时,总线就会呈现出连续64位的1。这个时间是非常长的,如果接收方时钟稍有偏差,接收方可能收到的就是65个1,或者63个1,因为你波形一点也不变化,位与位之间就没有分界点了,接收方没法利用数据的跳变沿判定采样点是不是在一位的中间,也无法得知,采样点的位置是不是准确,更没法依据跳变沿,执行再同步,进行误差补偿了。所以,长时间不变的波形容易导致接收出错。

  2. 区分正常数据流与错误帧和过载帧:位填充有助于区分正常数据流与具有特定结构的错误帧和过载帧。

  3. 保持CAN总线活跃:位填充有助于保持CAN总线在发送正常数据时的活跃状态,防止由于总线出现连续11个隐性1(即空闲状态)而被误判为总线空闲。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成了大锦鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值