CAN总线的五种帧

2、CAN总线的帧格式

        CAN协议规定了以下5种类型的帧,用于对数据流的每一位解析,明确每一位所传达的信息:

2.1 数据帧

        显性(0):Dominant(D);隐性(1):Recessive(R)

        这里波形中间的数字1,表示的是这一段波形占1位,并不表示这一位需要发隐性电平(1),隐性/显性电平在图中通过颜色表示。

        红线部分是将标准和扩展的不同部分画出来了,前后都是一样的。

标准格式分析:

        在发送数据帧之前,总线必须处于空闲状态,空闲状态时,总线是隐性电平(逻辑1),所有设备都不去碰总线,随后,数据帧开始,数据帧第一位是帧起始(SOF),作用是“打破宁静(打破总线空闲),开始一帧数据,同时也告诉接收方,接下来的一段时间内,我要是再释放总线,总线处于隐性1,那就不是空闲,而是我要发送的就是1”,所以必须以显性0开头。

        1位帧起始之后,首先发送的是报文ID,标准格式是11位,例如,想要发的报文ID是101 0101 0101,那么这一段时序就是隐显隐 显隐显隐 显隐显隐。报文ID可以表示后面数据的功能,还可以区分优先级。标准格式ID一共是11位,所以变化范围是0x000-0x7FF。

        报文ID后就是RTR(远程请求标志位,用于区分数据帧还是遥控帧),RTR占据一位,在数据帧里必须为显性0,遥控帧必须为隐性1。报文ID+RTR可以称为仲裁段。

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

        接着是r0(保留位),必须为显性0,没有使用,为设计者后续的设计升级保留。

        接着是DLC(数据段的长度),CAN总线的一帧数据可以有1-8个字节有效载荷,并且可以灵活指定,就靠这个DLC。如果想发一个字节DLC就给0001(显显显隐),如果想发八个字节DLC就给1000(隐显显显)。

        接着的数据段就是有效载荷的数据了,DLC指定几个字节,数据段就发几个字节。数据段的长度是0-64位,且必须为8的倍数,数据段长度可以给0,但是没有意义。

        之后进入CRC段,CRC是一种高效的校验算法,它会对前面所有的数据位进行CRC算法计算,从SOF到Data计算得到一个校验码附在后面,接收方收到数据和校验码后也会调用CRC算法进行计算,看看计算的校验码是否一致,以判断传输是否有误,接着是CRC界定符,1位,必须是隐性电平。

        接着是ACK段,分为ACK槽和ACK界定符,都是一位。ACK槽的作用就是应答,判断发送方发出一帧数据,到底有没有接收方收到。基本思想:当发送方发完一帧数据的主要内容后,在CRC界定符这一位时,发送方释放总线,总线回归默认状态隐性1。如果接收方收到数据了,它就会在ACK槽这一位,主动出击,把总线再拉开,使总线呈现显性0的状态。发送方释放总线后,在ACK槽会读取总线状态,如果发送方读取为显性0,比较之前释放总线,总线变为隐性1,说明必有接收方,数据被正确接收了。

        ACK槽这一位,发送方要发隐性1,如果接收方存在,则接收方要发显性0,如果接收方不存在,则没有显性0。所以在ACK槽之前都是发送方操作总线,在ACK槽这一位时,变为接收方操作总线,为了给权力交接留出时间,ACK槽前后就要留两个界定符,在CRC界定符时,发送方必须发隐性1,第一为了一个分隔,第二为了在ACK槽之前,发送方必须发送隐性1,释放总线。在ACK槽的时间点,接收方会拉开总线,ACK槽接收后,接收方不能一直拉着不放,所以在ACK界定符时,接收方必须及时释放总线,交出控制权。

        注意:第一,ACK槽时,可以允许多个接收方共同拉开总线,因为一个报文消息,可以被多个设备同时接收;第二,并不是发送方把一段波形完整发出去,然后再接收应答的,而是发送方和接收方共同完成一整个波形,发送方每发出一位,接收方就立刻收到这一位,所以这条时序的最后,整个数据帧还没结束,接收方其实已经收完了。应答之后,发送方的整个数据帧才结束。应答是夹在发送过程之中的。

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

扩展格式分析:

        首先,前面的11位ID仍然保持不变,另外在后面额外加上18位ID,中间还夹着两位一个是SRR(代替RTR的位),标准格式这一位是RTR,仲裁是先比较ID,后比较RTR的,所以RTR必须在所有的ID位后面,然而在扩展格式下RTR已经被移到了2最后,原来属于RTR的位置就空出来了,空出来的位置必须保证仲裁规则中,标准格式的优先级高于扩展格式,这一位SRR虽然没用但是必须给隐性电平1。拓展格式ID一共是29位,所以变化范围是0x0000 0000-0x1FFF FFFF。

        接着IDE就是扩展格式标志位,标准格式为显性0,扩展格式为隐性1,当接收方收到了一段波形,他就会从前往后开始判断,收到IDE后,就会按照对应格式来对应解析(在收到IDE之前,接收方并不知道是哪种格式,因为在此之前两者没有区别)。

        RTR和SRR只是命名名称不一样,但是都是表示一位数据,所以如果这个位置上为1,可以是扩展帧的SRR,也可以是标准帧的遥控帧标志位RTR。如果这个位置上为0,只能是标准帧的数据帧标志位RTR。所以这一位不能作为标准帧和扩展帧的区分位。

        随后的都是一样的,r1和r0都是保留位,为后续升级留位置。开始的时候标准格式IDE也是保留位r1,只是设计出拓展格式后,把这一位变成了IDE用来区别标准格式还是扩展格式。

各部分总述:

        SOF(Start of Frame):帧起始,表示后面一段波形为传输的数据位

        ID(Identify):标识符,区分功能,同时决定优先级

        RTR(Remote Transmission Request ):远程请求位,区分数据帧(0)和遥控帧(1)

        IDE(Identifier Extension):扩展标志位,区分标准格式(0)和扩展格式(1)

        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 ):帧结束,表示数据位已经传输完毕

2.1 遥控帧

        遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同。

        发送方不主动广播数据,如果有设备需要的话,首先接收方发出一个遥控帧,遥控帧包含报文ID,广播遥控帧后被每个设备接收,如果其中某个设备有这个ID的数据,它就会在通过数据帧,广播出来。这样接收方就能及时获取这个数据了。

        当接收方收到RTR是1后,后续就按照遥控帧的格式解析,遥控帧的DLC之后,没有数据段,直接跟的CRC,当某个设备发出遥控帧时,代表它想请求这个数据,请求自然不需要数据段,一次完整的请求需要遥控帧和数据帧的配合,请求方发出遥控帧,遥控帧的ID表示要请求的数据,响应请求的一方,通过相同ID的数据帧反馈数据,当请求和反馈数据同时发生时,数据帧拥有更高的优先级。

2.3 错误帧

        总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧,错误帧可以叠加在数据帧上,并可以破坏数据帧的数据,同时终止当前的发送设备。

        设备默认处于主动错误状态,处于主动错误状态的设备,检测出错误时会连续发6个显性位,发显性位就是拉开总线,总线只要有一个设备拉开了,就必然处于显性状态(0和1相遇时,总线总是处于0状态,这就是“线与”特性)。所以主动错误标志的6个显性位,必然会破坏正常传输的数据,其他设备检测到错误标志就会抛弃这个数据,那主动错误产生太频繁了,说明这个设备不太靠谱,设备就会进入被动错误状态,处于被动状态的设备,检测出错误时会连续发6个隐性位,发送隐性位就是不去碰总线,不碰总线就不会破坏别人发的数据,但是会破坏自己发的数据,自己的数据有问题,自己破坏掉,不会影响别的设备发的数据。

        错误标志为6位,发完错误标志后再跟8个隐性1,作为错误界定符。中间还有0-6位的延长时间,这是因为一个设备发出的错误标志可能会引发其他设备连带产生错误标志,多个错误标志叠加起来这个标志位的时间长度可能就不止6位了。

2.4 过载帧

        当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失。

        过载帧是在发送方发太快的时候,由接收方处理不了时发出。因为数据是发送方主动发出的,接收方无法直接调整发送发的发送频率,只能产生一个和错误帧类似的过载帧将数据破坏掉,发送方不发出就会重试,在这个破坏和重试的过程中,发送数据被延误了,也同时间接告诉发送方,接收方收不了,如果发送方有相应的处理逻辑,它就会降低一点发送频率。

2.5帧间隔

        将数据帧和遥控帧与前面的帧分离开。连续发送数据帧时其中间会有一小段帧间隔就行。帧间隔也分为主动错误状态和被动错误状态,主动错误状态的帧间隔是3位,被动错误状态的帧间隔是3位,另加8位延迟传输。被动状态表示设备不太靠谱,不靠谱就先别着急发送数据,延迟传送,会将设备置于仲裁不利的处境,尽量减少此设备干扰总线。

2.6 位填充

        数据帧和遥控帧在最终发送到总线之前,还要经过位填充的处理。位填充是发送方的最后一步处理,接收方的第一步处理,真正收发的有效数据,发送方和接收方都是一致的,、数据传送不会有错,只是最终呈现在CAN总线上的波形时会遵守位填充的规则。

        位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据。位填充只发生在SOF到CRC之间,帧结束没有位填充。

例如:

          即将发送: 100000110     10000011110    0111111111110

          实际发送: 1000001110    1000001111100    011111011111010

          实际接收: 1000001110    1000001111100    011111011111010

          移除填充后: 100000110      10000011110    0111111111110

位填充作用:

        增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精确掌握数据采样时机。

        将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性(错误帧和过载帧都包含了超过5个的相同电平,而正常的数据流结果位填充以后,不可能出现连续5个以上的相同电平,所以当有错误帧或过载帧叠加在数据帧之上时,就能立刻被发现)。

        保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲,CAN规定,当总线出现连续11个隐性1后,即认为总线空闲,所以没有位填充,数据段就会最多出现64个隐性1,这波形没有变化,别的设备就可能认为当前是空闲的,如果别的设备也发数据,那就产生冲突了。

2.7 波形实例分析

        标准数据帧,报文ID为0x555,数据长度1字节,数据内容为0xAA,黄色数字为填充位。

        标准数据帧,报文ID为0x666,数据长度2字节,数据内容为0x12, 0x34。

        扩展数据帧,报文ID为0x0789ABCD,数据长度1字节,数据内容为0x56。

        标准遥控帧,报文ID为0x088,数据长度1字节,无数据内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值