目录
前言
上一期学习了CAN总线帧格式的发送过程,既然有了发送那就有接收,那CAN总线在接收方是如何完整的接收到数据呢,本期我们接着上一期的内容,继续学习CAN总线位同步、仲裁和错误处理的相关理论知识点。(视频:[1-3] 位同步_哔哩哔哩_bilibili [1-4] 仲裁_哔哩哔哩_bilibili [1-5] 错误处理_哔哩哔哩_bilibili)
一、位同步
1.接收方的数据采样
- CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长
- 发送方以约定的位时长每隔固定时间输出一个数据位
- 接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位
- 理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近
2.接收方数据采样遇到的问题
•第二个问题:接收方刚开始采样正确,但是时钟有误差,随着误差积累,采样点逐渐偏离
那对于上面这些问题怎么去解决呢,怎么样才能实现理想状态下的采样?我们接着往下看。
3.位时序
上面说了我们把采样的每一个位分为若干段,然后在若干段中找到合适的位置来采样,首先跳变沿是在同步段执行的,然后采样是在PBS1和PBS2之间的位置来去采样的。既然分了段之后那就可以开始去解决上面采样的问题了,接着往下看。
4.硬同步和再同步
硬同步
- 每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步
- 硬同步只在帧的第一个下降沿(SOF下降沿)有效
- 经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近
直接说吧,也就是我们给发送方和接收方各自设置一个定时器,当发送方上一个位发送完成之后在EOF状态时,发送方和接收方的定时器都回归到SS的位置 ,这种是对于第一个下降沿有效的,然后就是如果发送方和接收方的“定时器”没问题的话那么后继的采样就不会出错了,会实现一直保持采样的数据位的中心附近。硬同步这里就很好的解决了第一个问题,但是如果出现了第二个问题也就是第一个下降沿对齐好了,但是发送方和接收方的“定时器”对不上,那就要用后面一个再同步的方法来解决了。
再同步
- 若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW)通过加长PBS1段,或缩短PBS2段,以调整同步
- 再同步可以发生在第一个下降沿之后的每个数据位跳变边沿
再同步就是如果出现了第一个下降沿虽然对齐了,但是由于发送方和接受方的时钟出现了误差,那就要去
5.波特率的计算
• 波特率 = 1 / 一个数据位的时长 = 1 / (T SS + T PTS + T PBS1 + T PBS2 )• 例如:SS = 1Tq,PTS = 3Tq,PBS1 = 3Tq,PBS2 = 3Tq
Tq = 0.5us
波特率 = 1 / (0.5us + 1.5us + 1.5us + 1.5us) = 200kbps
二、仲裁
1.多设备同时发生遇到的问题
- CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源?
- 解决问题的思路:制定资源分配规则,依次满足多个设备的发送需求,确保同一时间只有一个设备操作总线
下面就是波形发送过程中可能遇到的问题,其中当一个波形正在发送的时候,另外一个设备也想发送波形,这就会出现冲突,那怎么去解决这个冲突呢,这里就需要用到仲裁的相关方法了。
2.资源分配1——先占先得
- 若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(可以发送错误帧/过载帧破坏当前数据)
- 任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时,设备才能发送数据帧/遥控帧(所以前面规定位填充规则是有原因的)
- 一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送
- 若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求
看完了上面这些说明,其实说白了就是跟排队一样的,先到先得,当有信号在处于发送的过程中,另外一个信号想拿到CAN总线发送就必须等前面那个信号发送完成才可以去发送自己的。这也是很好处理了上面那个图所展示的问题,但还有一个问题就是,如果有多个信号同时发生的话,那该怎么去仲裁呢?往下看。
3.资源分配2——非破坏性仲裁
- 若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送
- 实现非破坏性仲裁需要两个要求:
- 线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1 (虽然还有一个线或特性,不过很多设备基本上都是使用线与特性,电平0是强于电平1的)
- 回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1
过程如下:

4.数据帧和遥控帧的优先级
5.标准格式和扩展格式的优先级
同样的,对于ID相同的扩展数据帧和标准数据帧,标准数据帧的RTR为0的时候,扩展数据帧的SRR(代替RTR)为隐性1,故标准数据帧优先。
看完上面仲裁的过程方式,这里可能就会有人问了,如果有位填充插入的话会不会影响到仲裁结果呢?我可以很肯定的告诉你,不会。因为,比如信号A和信号B在进行对比仲裁的时候,按照原来没有位填充的结果时候,A是优先于B的。但如果A和B都进行了相关位填充之后,我们可以这样子想,在原来的形式A和B出现区分的那个位之前(也就是标红的位),前面的位是一致的,那也就说明就是说有位填充,那填充之后区分位的前面依然是一个月,冲裁到的区分位还是那个位,后面就不需要去管了,都已经仲裁出结果了,后面管他怎么插入填充都无所谓了的。
三、错误处理
1.错误类型
2.错误状态
错误帧:总线上所有设备都会监督总线的数据,一旦发现“位错误”或“填充错误”或“ CRC 错误”或“格式错误”或“应答错误” ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备
- 主动错误状态的设备正常参与通信并在检测到错误时发出主动错误帧
- 被动错误状态的设备正常参与通信但检测到错误时只能发出被动错误帧
- 总线关闭状态的设备不能参与通信
- 每个设备内部管理一个TEC和REC,根据TEC和REC的值确定自己的状态
错误帧如下所示(6位错误标志+8位错误界定符),对于主动错误,当前设备会发送主动错误帧,也就是拿到CAN总线,在上面发送连续6个显性0,这时候就会把其他设备拿到的这个数据给破坏掉;而对于被动错误是设备只能发送被动错误帧,也就是连续6个隐性1,这时候是不会破坏其他设备的数据的。
在开始的时候全部设备都是默认为主动错误状态的,对于错误状态之间的切换是要根据当前设备TEC和REC的值来去判断的,如果这个设备发送出现错误的时候那么TEC就会向上增加,如果接收错误的时候REC也会向上增加,如果发送数据没问题或者接收没问题那么TEC或者REC就减少,当TEC或者REC其中的一个大于临界值127的时候就会进入到被动错误状态,这说明这个设备问题有点大,那就不能在主动错误状态,不然老是破坏其他设备的数据(说白了就是自己出问题不爽了就去影响别人),如果这个设备在处于被动状态的话TEC还是一直往上涨(被动错误状态接受REC是不影响的,这里就不需要去考虑),知道突破下一个临界值255的时候,这时候这个设备的CAN总线就会关闭,不参与通讯了,也就是关小黑屋,当然CAN总线还是给他留条后路的,假如这个设备的相关信息很重要那还是得回来通讯的,也就是如果总线上检测到128次连续的11位隐性1,那经过这个时间段就可以回归到主动错误状态继续通讯。
3.错误计数器
下面可以参考一下TEC和REC在不同情况下的错误计数值。
4.波形示例
- 设备处于主动错误状态,发送标准数据帧,正常传输
- 设备处于主动错误状态,发送标准数据帧,检测到ACK错误
- 设备处于被动错误状态,发送标准数据帧,检测到ACK错误
下面我们可以看出相较于前面的主动错误状态,被动错误的时候在3位的帧间隔紧接着还有8位延迟传送,这里的话,如果一个主动错误状态的设备和一个被动错误状态的设备都想发数据,主动错误设备是可以拿到CAN总线,然后就开始发送数据,另外被动错误是有一个延迟的,本身来说就是赶不上主动错误的脚步,所以这里就不会涉及到跟主动错误设备发送仲裁关系,而是等主动错误设备发送完后被动设备才能发送的优先排队关系。
以上就是本期的全部内容了,我们下次见!
今日壁纸: