CAN总线位同步
挂载在CAN总线上的所有设备,初始都默认为接收方,当某一个设备想要广播自己的数据时,它就会主动出击,变成发送方,拉开或释放总线,使总线产生这样一段波形。这时,其他的所有接收方该如何准确地采样,得到每一个数据位是1还是0呢,这就是这次要研究的问题。
接收方数据采样
- CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长
- 发送方以约定的位时长每隔固定时间输出一个数据位
- 接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位
- 理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近
接收方数据采样遇到的问题
接收方以约定的位时长进行采样,但是采样点没有对齐数据位中心附近
假设现在约定数据位传输速率是1Mbps,那么发送方每隔1us发出一个数据位,接收方也每隔1us进行一次数据采样。这里就会涉及一个同步问题,就是如何让采样点对齐数据位中心附近呢?如果你不进行对齐,就会出现图示这种情况。虽然发送位间隔和接收采样位间隔都是一样的,但是接收方的采样点好巧不巧都采到了数据位跳变沿这里,那这个采样是1还是0就不好确定了。即使采样点不是正好在跳变沿上,如果太靠远跳变沿了,那采样得到的数据也是非常容易错的。
这个问题的关键在于采样点的初始位置没对齐。如果能以第一个跳变沿为参考,适当延迟半个数据位左右的时间进行第一次数据采样,后续再按照固定的采样间隔进行采样,这样就可以解决采样位置没对齐的问题了。这实际上是一种硬件同步(硬同步)。
接收方刚开始采样正确,但是时钟有误差,随着误差积累,采样点逐渐偏离
处理方式就是再同步(重新同步)。再同步的核心思想就是以正常数据位的跳变沿为参考,如果已经察觉到采样点偏离的苗头了,就适当缩短或延长一次的采样间隔以弥补时钟误差。
位时序
为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每个段又由若干个最小时间单位(Tq)构成。
位时序是为了同步的
如果每次波形跳变沿都在同步段,那就说明当前设备的位时序与波形是同步的。
这样当前设备如果是接收方,就可以在这PBS1和PBS2之间进行采样。如果跳变沿出现在SS段之外的地方,就需要用到我们后续学的硬同步和再同步来调整当前设备的位时序,使得跳变沿再次出现在SS段,这个过程就是同步过程。
硬同步(硬件同步)
硬同步的核心思想是以第一个跳变沿为参考,对齐第一次的数据采样点。
- 每个设备都有一个位时序计时周期。当某个设备率先发送报文时,其他所有设备会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步。
- 硬同步只在帧的第一个下降沿(SOF下降沿)有效。
- 经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近。
再同步(重新同步)
再同步的核心思想是如果已经察觉到采样点偏离的苗头了,就适当缩短或延长一次的采样间隔以弥补时钟误差。
- 若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段。此时接收方可以根据再同步补偿宽度值(SJW)通过加长PBS1段或缩短PBS2段来调整同步。
- 再同步可以发生在每个数据位的跳变边沿。
SJW可以自己指定,配置为14Tq,当位时序周期这个秒表有误差时,可以选择加14个Tq,或者减1~4个Tq。
波特率计算
波特率 = 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