汽车网络LIN总线协议分析
LIN协议适用于汽车内进行低成本、短距离、低速网络通信,其用途是传输开关设置状态以及对开关变化响应。本文详细分析了LIN总线协议的特性、消息协议的组成、检错机制等,并介绍如何基于PICmicro器件来实现LIN总线从节点。
LIN协议是由欧洲车辆制造商协会开发用来进行低成本、短距离、低速网络通信,其用途是传输开关设置状态以及对开关变化响应,因此通信事件是在百毫秒以上时间内发生,而不像引擎管理等其它速度快得多的汽车应用。此协议支持在单根线上进行双向通信,使用由RC振荡器驱动的低成本微控制器,这样可以省去晶振或陶瓷振荡器的成本。另外,此协议实际上是以时间和软件上的代价换取硬件上成本的节约。LIN协议的每一条消息都包含自动波特率步进的数据,最高可以支持波特率为20k,同时低功耗睡眠模式可以关断总线,以避免产生不必要的功耗。总线可以由任意一个节点提供电源。
LIN总线特性
LIN总线融合了I2C和RS232的特性:像I2C总线那样,LIN总线通过一个电阻上拉到高电平,而每一个节点又都可以通过集电极开路驱动器将总线拉低;像RS232那样通过起始位和停止位标识出每一个字节,每一位在时钟上异步传输。
图1给出了典型的LIN协议配置。当任意一个节点将总线拉低时,总线处于低电平,标识着总线进入占用状态;而当所有节点都使总线浮空时总线处于电池的电压(9-18V),则意味着总线处于非占用状态(Recessive state);在空闲状态下浮空的总线通过电阻被上拉到高电平。
总线工作在9到18伏的电压下,但所有连接到总线上的器件必须能承受40V的电压。一般情况下,微控制器通过线路驱动器或接收器与总线隔离。总线在每一个节点上被端接到Vbat,主节点通过一个1kΩ的电阻端接而从节点则通过一个20kΩ到47kΩ的电阻端接。总线最大长度为40米。
总线上传输的每一个字节都是与起始位和停止位一起组成帧。起始位的状态与空闲状态相反(即为0),而停止位则与空闲状态同为1。在每个字节中,首先传输的是最低有效位。
消息协议
主节点控制总线的方式是轮询各个从节点并与总线上其余部分共享从节点的数据。从节点仅在接到主节点的命令时才进行数据传输,这样就可以进行双向传输并且无需进一步的仲裁。消息传输是以主节点发出一次同步中断开始,紧接着是消息的同步字段和消息字段。通过在每条消息的起始处传送的同步字段还设定了整个总线的时钟,每个从节点用该字节来调整其波特率。
同步中断使总线进入占用状态,该状态保持时间为13位数据的传输时间,紧接着是一个停止位(非占用状态),这告知从节点即将有消息传输。主节点与从节点的时钟漂移最大允许在15%,因此从节点接收的同步中断可能只有11位或长达15位数据位的传输时间。
每一条消息的第二个字节是标示字节,用来告知总线在该字节后面传输的是什么数据和哪一个节点应该应答,以及应答的长度(标示字段如图2所示)。一条命令仅会有一个从节点对其进行响应,从节点仅在主节点的指示下才发送数据。数据只要出现在总线上,每一个节点都可以接收到。因此,无须主节点专门控制从节点之间的通信。
由于设计中采用廉价的RC振荡器,从节点必须在每一次传输时检测主节点的波特率并调整其自身当前的波特率。因此,每一次通信都由一个由交替的"0"和"1"组成的同步字节开始。标识字段紧跟在同步字段的后面,它告知总线后面传输的内容是什么。标识字段又分为三个子字段,最低4位(0-3位)是寻址总线上的器件,中间两位(4-5位)是后面传输的消息的长度,最高两位(6-7)用作奇偶校验位。
除了睡眠命令,LIN协议并没有定义每一条消息的内容。其它命令是由具体应用来定义的。
检错机制
下面描述的错误必须被检测出,并且在每个节点内进行计数。
位错误-传输节点必须将它认为应该传输的数据位与总线上实际出现的数据位进行比较。由于总线需要响应时间,控制器必须在检测数据位之前等待足够长的时间。假设最小的电压翻转速率为1V/μs,而总线最高电压为18V,则发送器必须等待18μs才能检测总线上的数据位是否正确。
校验和错误-每一条消息的内容都是由校验和字节进行保护。
奇偶校验错-命令字节的6个数据位由两个奇偶校验位进行保护,需要重新进行计算这些位并比较。如果错误出现,应当忽略当前命令并且记录下错误。LIN协议中没有直接的错误报告机制,但每一个从节点应当跟踪其自身的错误,主节点可以要求从节点将错误状态作为正常消息协议的一部分来传输。
LIN总线与CAN总线
LIN协议并不直接与CAN总线兼容,但人们期望两者进行相互操
- 另类传感器观念:汽车传感器(3)(11-30)
- 如何解决汽车车身控制设计的三大挑战 (09-29)
- 基于LIN总线的车灯控制系统(07-10)
- 以灯光控制为例说明LIN总线在车身控制中的应用(05-24)
- 有限状态机在LIN总线开发中的应用(03-01)
- LIN主从节点设计与实现(03-19)