目录
1. 位同步
1.1 位时序
1.2 硬同步
1.3 再同步
1.4 波特率计算
2. 仲裁
2.1 先占先得
2.2 非破坏性仲裁
1. 位同步
CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长,发送方以约定的位时长每隔固定时间输出一个数据位,接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位,理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近。接收方数据采样需要注意的是:
问题一:接收方以约定的位时长进行采样,但是采样点没有对齐数据位中心附近如绿色所示部分,假如刚好对应跳变沿,可能就无法区分此时信号是“0”还是“1”,解决方法也很简单,首先这个问题的关键,就是采样点的初始位置没对齐,如果我们以第一次跳变沿位信号,延迟半个数据位左右的时间,进行第一次的数据采样,这样后续就会正常,这样的解决方法也叫“硬同步”(下面会有详细介绍):
问题二:接收方刚开始采样正确,但是时钟有误差,随着误差积累,采样点逐渐偏离。开始的采样点正常,但是二者的时钟有偏差,这样将会导致开始的时候数据还能正常采集,但是随着时间的累计,偏差越来越大,这将会导致采样点严重偏离预定位置,解决方法,我们可以看到如果数据偏离太过严重,这一次的采样时间,距离数据跳变过于久了,那么我们可以根据这缩短采样时间,同理要是采样时间过快造成的偏差,我们也可以延长采样时间(再同步):
1.1 位时序
为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为:同步段(SS)
传播时间段(PTS)
相位缓冲段1(PBS1)
相位缓冲段2(PBS2)
每个段又由若干个最小时间单位(Tq)构成。
段名称 | 段的作用 | Tq数 | |
同步段(SS: Synchronization Segment) | 多个连接在总线上的单元通过此段实现时序调整,同步进行接收和发送的工作。由隐性电平到显性电平的边沿或由显性电平到隐性电平边沿最好出现在此段中。 | 1Tq | 8~25Tq |
传播时间段(PTS: Propagation Time Segment) | 用于吸收网络上的物理延迟的段。 所谓的网络的物理延迟指发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟。 | 1~8Tq | |
相位缓冲段 1 (PBS1: Phase Buffer Segment 1) | 当信号边沿不能被包含于 SS 段中时,可在此段进行补偿。 由于各单元以各自独立的时钟工作,细微的时钟误差会累积起来,PBS 段可用于吸收此误差。 通过对相位缓冲段加减 SJW 吸收误差。SJW 加大后允许误差加大,但通信速度下降。 | 1~8Tq | |
相位缓冲段 2 (PBS2: Phase Buffer Segment 2) | 2~8Tq | ||
再同步补偿宽度(SJW: reSynchronization Jump Width) | 因时钟频率偏差、传送延迟等,各单元有同步误差。SJW 为补偿此误差的最大值。 | 1~4Tq |
采样点:所谓采样点是读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。
1.2 硬同步
每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步,硬同步只在帧的第一个下降沿(SOF下降沿)有效,经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近。
这个可以理解为谍战剧中,进行秘密行动前的对表工作,无论发送方还是接收方都有一个秒表(时钟),开始行动了发送方和接收方进行校时,如上图,接收方发现发送方说出(SS)时,自己不是,自己马上将秒表纠正,当发送方说开始行动(SS位置)跳变数据开始新的一位(新的动作),接收方在自己秒表转到PBS1和PBS2之间进行采样数据:
不过再好的表,也会出现随着时间的推移,不准的情况,这就需要进行再次校准(再同步)。
1.3 再同步
若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW)通过加长PBS1段,或缩短PBS2段,以调整同步,再同步可以发生在第一个下降沿之后的每个数据位跳变边沿。
这里需要注意的是,如下图,SJW=2所代表的不是每次出现误差都需要补偿2Tq,这里的2代表补偿的最大值:
实际补偿大小是误差大小和SJW共同决定的。如上图,SJW=2Tq,刚好误差也是2Tq,因此刚好补偿2Tq;如果这里误差只有1Tq,且SJW=2Tq,这时实际上只会补偿1Tq;若是误差3Tq,且SJW=2Tq,那么也只会补偿2Tq(只会补偿SJW指定的Tq数)。
1.4 波特率计算
波特率 = 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
2. 仲裁
CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源?
解决问题的思路:制定资源分配规则,依次满足多个设备的发送需求,确保同一时间只有一个设备操作总线。
对于多设备发送也有不同的表现形式,首先若是一个数据先发送,已经发送一半了,突然又又一个发送方想要发送数据,要如何解决这个问题呢?
2.1 先占先得
我们可以规定先占先得,若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(不过这里需要注意的是,根据错误帧/过载帧的特性,别的发送方也是可以发送错误帧/过载帧破坏当前数据)。
CAN总线数据帧格式详细介绍-CSDN博客
任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时,设备才能发送数据帧/遥控帧。一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送。(根据位填充的作用,总线在正常状态下,根本不可能出现11连续的隐性电平,可以看上面链接有关位填充的介绍)
若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求。
这只是错位多个设备发送,若是多个设备同时发送又应当如何解决呢?
2.2 非破坏性仲裁
若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送。
实现非破坏性仲裁需要两个要求:
线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1
回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1
在总线空闲态,最先开始发送消息的单元获得发送权。
多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平(逻辑0)最多的单元可继续发送。
数据帧和遥控帧的优先级:具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。
标准格式和扩展格式的优先级:标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送。
CAN总线数据帧格式详细介绍-CSDN博客
CAN总线_时光の尘的博客-CSDN博客