LIN总线作为一种辅助的总线网络也是存在同步机制的,但是LIN在作为接收节点接收数据时是有自动修正总线上通讯的波特率偏差的能力的。那这是怎么做到的呢?本文将与大家深入探讨。
LIN(Local Interconnect Network)是一种低成本的串行通讯网络,用于实现汽车中的分布式电子系统控制。LIN的目标是为现有汽车网络(例如CAN总线)提供辅助功能,因此LIN总线是一种辅助的总线网络。在不需要CAN总线的带宽和多功能的场合,比如智能传感器和制动装置之间的通讯使用LIN总线可大大节省成本。LIN 通讯是基于SCI(UART)数据格式,采用单主控制器/多从设备的模式。仅使用一根12V信号总线和一个无固定时间基准的节点同步时钟线。
LIN帧结构
LIN帧(frame)包含帧头(Header)和应答(Response)两部分。帧头包括同步间隔段、同步段以及PID(Protected Identifier,受保护ID)段,应答包括数据段和校验和段,如图1所示,其中值“0”为显性电平(Dominant),值“1”为隐性电平(Recessive)。
图1 LIN帧结构
UART的基本时序
再介绍LIN同步机制之前,我们需要介绍一下UART的基本时序,了解一下底层信号是怎么传送的。
以波特率9600为例,可以理解为将1s分解为9600等份,对于发送端来说,每bit电平的维持时间是1/9600s,对于接收端来说,在1/9600s内要完成数据的采样。因此对于不同时间源的设备,如何实现这个发送“节拍”以及设置接收采样频率非常重要。
图2 波特率示意图
UART的基本时序:
发送端:
图3 发送端
接收端:
图4 接收端
UART的每一帧数据一般有10位,分别为初始位、8位数据和结束位。对于发送端,将待发送的数据存入发送寄存器,产生起始位,即将电平拉低,随后每1/9600s将寄存器中的数据一位一位的发送出去。当数据发送完毕后,将电平拉高等待下一次的发送。对于接收端来说首先要检测是否有数据来,它采用下降沿检测的方式来检测起始位。对于数据位的采样,选取数据位的中点位置的电平作为采样数据,因为中点位置的电平较为稳定。假设采样间隔为N,那么当采样8N后,就可以停止采样了。
LIN同步机制
LIN总线协议规定,LIN网络主机节点必须采用较高精度时钟,作为LIN网络时间基准,保证位速率的准确性,而从机节点可以使用较低精度时钟,所以主从节点的时钟就会有频率偏差,需要进行调整同步,否则难以保证数据的正确收发。若不进行LIN同步会有多大的影响呢?我们可通过控制器对同步间隔段识别的阈值来量化。
图5 同步间隔段
同步间隔段由同步间隔(Break)和同步间隔段间隔符(Break Delimiter)构成,如图5所示。同步间隔是至少持续13位(以主机节点的位速率为准)的显性电平,由于帧中的所有间隔或总线空闲时都应保持隐性电平,并且帧中的任何其它字段都不会发出大于9位的显性电平(LIN报文以字节域格式通讯),因此13位的同步间隔可以标志一个帧的开始,而能否识别这13位的同步间隔段就显得尤为重要,这完全依赖于节点的一个参数-识别阈值,其计算方法如下: