CAN总线2(位时序 硬同步 再同步)

4. 接收方数据采样与同步

接收方数据采样与同步问题

  • 接收方以约定时长进行采样,但是采样点没有对齐数据位中心附近:(解决:硬同步)
  • 接收方刚开始采样正确,但是时钟有误差,随着误差累积,采样点逐渐偏离原来的数据中心位置(解决:再同步)

5.位时序

  • 为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分 ,分为同步段(SS)传播时间段(PTS)相位缓冲段1(PBS1)和相位缓冲段2(PBS2) ,每个段又由若干个最小时间单位(Tq)构成最小时间单位由自己确定

    • 目的:是为了确定采样点的位置,为了同步
  • 介绍

  • 其中SS段为同步段,如果数据跳变沿正好出现在SS段,说明当前设备与波形达成同步 ,如果数据跳变沿不在SS段,说明要调整当前设备的位时序,使跳变沿正好出现在同步段。例如,有个波形的数据跳变沿刚好在同步段,又因为定义的位时序就是一位的时间 ,所以下一位数据如果再跳变的话,它肯定会在下一个位时序的同步段,如果每次波形跳变沿都在同步段,那就说明当前设备的位时序与波形是同步的,即我在当前设备定义的一位时间正好与波形的一位时间重合,这样当前设备如果是接收方,那它直接在PBS1和PBS2之间采样。如果跳变沿出现在SS段之外,就需要通过后续的硬同步和再同步来调整当前设备的位时序,使跳变沿再次出现在SS段

  • PTS,意为传播时间段,用于吸收网络上的物理延迟 。网络的物理延迟指发送单元的输出延迟、总线上信号的传播延迟和接收单元的输入延迟,PTS的时间为以上各延迟时间的和的两倍。(由于硬件电路的限制,这个信号输出到总线,总会有那么一点延迟,同理,数据输入和数据在总线上传输都会有一点延迟)。

  • PBS1和PBS2意为相位缓冲段,这两段的作用就是确定采样点的位置采样点会在PBS1和PBS2中间,如果PBS1给长点, PBS2给短点,采样点就会靠后。如果PBS1给短点, PBS2给长点,采样点就会靠前

6.硬同步

  • IIC是共享一个秒表,CAN是每个设备都有一个秒表
  • 每个设备都有一个位时序计时周期 ,可以将位时序周期想象成一个秒表,总线上每个设备内部都有一个秒表,假设现在所有设备的的秒表就是同步转动的,有一个设备想作为发送方开始一段波形,那么发送方会在自己的秒表转到SS段时,开始一个新数据位,接收方内部也有一个秒表,并且它的秒表和发送方同步转动,所以接收方的秒表每次转到SS段,就知道一个新的数据位开始了,之后接收方直接在PBS1和PBS2之间进行数据采样。
  • 如何保证所有设备的秒表同步转动呢?
    • 当某个设备(发送方)率先发送报文,当发送方产生第一个跳变沿时,肯定在发送方自己的SS段,其他所有设备(接收方)收到SOF的下降沿(第一个数据跳变边沿)时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步
  • 硬同步只在帧的第一个下降沿(SOF下降沿)有效。
  • ss就是接收方的时钟,下降沿是发送方的时钟,谁在前吗谁就快

7.再同步

  • 再同步补偿宽度值的最大限值为SJW=1~4Tq,如果SJW=2Tq,但是误差为1Tq,实际补偿1Tq。如果SJW=2Tq,但是误差为3Tq,实际补偿2Tq。
    • 目的:设置SJW的目的是为了防止波形中噪声对位时序造成过大影响,例如在正常的一位波形中出现了电平抖动,如果不对再同步补偿宽度进行限制,则接收方可能认为这是2位甚至是3位数据,只不过这一位时间的误差非常大而已,如果接收方这样判断,那么原本一位的数据,接收方就会收到两位或者更多位,这样接收方解析二进制流数据肯定会出错,所以接收方不能激进调整位时序,位时序补偿必须有最大限制。这样可以避免接收方因为噪声干扰而补偿过度。

波特率计算

  • 波特率 = 1 / 一个数据位的时长 = 1 / (TSS + TPTS + TPBS1 + TPBS2)

  • 例如:

    • SS = 1Tq,PTS = 3Tq,PBS1 = 3Tq,PBS2 = 3Tq

    • Tq = 0.5us

    • 波特率 = 1 / (0.5us + 1.5us + 1.5us + 1.5us) = 200kbps

  • 波特率本来的单位是波特(Baud),意为码元/s,bps是比特率的单位,但是在二进制调制下,波特率的值=比特率的值。

  • 大小都可自己调节

8.仲裁

  • can中:只有响应优先级没有抢占优先级
  • 数据帧和遥控帧ID号一样时,数据帧的优先级高于遥控帧(依靠RTR)
  • CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线[发送数据] 若多个设备同时有发送需求,该如何分配总线资源?

8.1 规则1 - 先占先得(不同时开始)

  • 当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(可以发送错误帧/过载帧破坏当前数据)。

  • 任何设备检测到连续11个隐性电平,即认为总线空闲只有在总线空闲时,设备才能发送数据帧/遥控帧

  • 一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送。

  • 若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求。前一帧的1位ACK界定符 + 前一帧的7位帧结束 + 3位帧间隔 = 11位

  • 3位帧间隔主要是给过载帧准备的,如果这个数据帧的接收方过载了,想要延迟发送方的数据传送,那么接收方就会在帧间隔的第一位拉开总线,产生过载帧。

  • 11位隐性电平1也可以是错误界定符8位 + 3位帧间隔

8.2 规则2 - 非破坏性仲裁(同时开始)

  • 若多个设备的发送需求同时到来或因等待而同时到来,则[CAN总线协议] 会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送。

  • 实现非破坏性仲裁需要两个要求:

    • 线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1。

    • 回读机制每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1。

  • 标准格式11位ID号和扩展格式29位ID号的高11位一样时,标准格式的优先级高于扩展格式(SRR必须始终为1,以保证此要求)。
  • 标准遥控帧优先级高于扩展数据帧

9.错误处理

  • 错误共有 5 种: 位错误、填充错误、 CRC 错误、格式错误、应答错误
    • 位错误:当接入总线的CAN控制器处于发送的阶段(发送报文已经仲裁成功),检测到总线上的位状态与发送的不相符,则发生位错误(ACK SLOT的隐性位除外)
    • 填充错误:数据帧以及遥控帧,均通过位填充的方法编码。无论何时,发送器只要检测到位流里有5 个连续识别值的位,便自动在位流里插入一补码位。如果在通过NRZ编码过的帧部分,出现了连续相同的位电平,则产生填充错误。
    • CRC错误:CRC 序列包括发送器的CRC 计算结果。接收器计算CRC 的方法与发送器相同。如果计算结果与接收到CRC 序列的结果不相符,则检测到一个CRC 错误(CRC ERROR)。
    • 形式错误:当一个固定形式的位场含有1 个或多个非法位,则检测到一个形式错误(FORM ERROR)。比如说帧结尾固定为隐性位,却检测到了显性位。
    • 应答错误 :只要在ACK 间隙(ACK SLOT)期间所监视的位不为"显性",则发送器会检测到一个应答错误(ACKNOWLEDGMENT ERROR)。

错误状态

  • 错误帧:总线上所有设备都会监督总线的数据,一旦发现"位错误"或"填充错误"或" CRC 错误"或"格式错误"或"应答错误" ,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备(详见can总线1)
  • 在开始的时候全部设备都是默认为主动错误状态的 ,对于错误状态之间的切换是要根据当前设备TEC和REC的值来去判断的,如果这个设备发送出现错误的时候那么TEC就会向上增加,如果接收错误的时候REC也会向上增加,如果发送数据没问题或者接收没问题那么TEC或者REC就减少,当TEC或者REC其中的一个大于临界值127的时候就会进入到被动错误状态,这说明这个设备问题有点大,那就不能在主动错误状态,不然老是破坏其他设备的数据(说白了就是自己出问题不爽了就去影响别人),如果这个设备在处于被动状态的话TEC还是一直往上涨(被动错误状态接受REC是不影响的,这里就不需要去考虑),知道突破下一个临界值255的时候,这时候这个设备的CAN总线就会关闭,不参与通讯了,也就是关小黑屋,当然CAN总线还是给他留条后路的,假如这个设备的相关信息很重要那还是得回来通讯的,也就是如果总线上检测到128次连续的11位隐性1,那经过这个时间段就可以回归到主动错误状态继续通讯。

错误计数器

错误示例

  • 设备处于主动错误状态,发送标准数据帧,正常传输(七位EOF隐性+3位帧间隔隐性)
  • 设备处于主动错误状态,发送标准数据帧,检测到ACK错误(ACK槽不为显性状态,6错误标志显性+8错误界定符隐性+3帧间隔隐性)
  • 设备处于被动错误状态,发送标准数据帧,检测到ACK错误(ACK槽不为显性状态,6错误标志隐性+8错误界定符隐性+3帧间隔隐性+8位延迟传送隐性)
相关推荐
振鹏Dong6 小时前
超大规模数据场景(思路)——面试高频算法题目
算法·面试
uhakadotcom6 小时前
Python 与 ClickHouse Connect 集成:基础知识和实践
算法·面试·github
uhakadotcom6 小时前
Python 量化计算入门:基础库和实用案例
后端·算法·面试
uhakadotcom7 小时前
使用Python获取Google Trends数据:2025年详细指南
后端·面试·github
uhakadotcom7 小时前
使用 Python 与 Google Cloud Bigtable 进行交互
后端·面试·github
uhakadotcom7 小时前
使用 Python 与 BigQuery 进行交互:基础知识与实践
算法·面试
uhakadotcom7 小时前
使用 Hadoop MapReduce 和 Bigtable 进行单词统计
算法·面试·github
独行soc8 小时前
2025年渗透测试面试题总结- 某四字大厂面试复盘扩展 一面(题目+回答)
java·数据库·python·安全·面试·职场和发展·汽车
uhakadotcom9 小时前
Google Cloud Dataproc:简化大数据处理的强大工具
后端·算法·面试
拉不动的猪9 小时前
react基础2
前端·javascript·面试