LIN协议是新出现的一种新型低成本串行通信总线,其全称是Local Interconnect Network,即局部互联网络。它最开始出现于汽车行业,是为解决汽车智能化和网络化的发展要求和降低汽车制造成本的矛盾而提出来的一种串行总线协议,主要用于车门、车灯等需要简单控制但又要求智能控制的场合。它的主要特点是:采用单个主控制器/多从设备通信模式;基于普通UART/SCI接口硬件实现,协议简单;网络传输速率不高,最高可达20kb/s。由于LIN协议的突出特点是协议对硬件的依赖程度低,可以基于普通单片机的通用串口等硬件资源以软件方式实现,成本低廉,因此可广泛应用于汽车行业以外的其他领域,如智能家庭网络内部的数据传输、节点控制等场合。
本文依据对LIN协议的分析,对其协议在普通单片机上的具体实现,即如何利用单片机有限的硬件资源实现LIN的主节点、从节点,进行可行性方案的研究、探讨。 2 LIN协议的简介
LIN协议的最新版本是LIN Specification Package Revision 2.O,包括协议规范、节点诊断配置规范、物理层规范、API规范等几个方面,从硬件配置到节点配置语言都作了详细的规定。下面就其协议规范作一简要介绍和分析。
LIN的数据传输是采用报文帧的形式进行的。一个完整的报文帧由1个主机节点发送的报文头(header)和1个主机或从机节点发送的响应(response)组成,如图1所示。报文头包括1个间隔场(break)、1个同步字节场(synch)和1个保护标识符字节场PID(Protected IDentifier)。间隔场是由持续了至少13个位时的显性电平和至少1个位时的隐性电平组成;由主机节点产生,标志着一次数据通信过程报文帧的开始。同步字节场包含时钟同步信息。同步字节场的格式是0x55,表现在8个位定时中有5个下降沿,即隐性跳变到显性的边沿。 所有从机节点在主机节点发布报文头之后都应能检测到间隔场的存在,并且在正确地接收同步字节场后,准确计算出主机节点将要发送数据的波特率,并以此波特率作为下一步要发送或接收数据的波特率的设定值。这样,经过了间隔场和同步字节场的接收,所有的从机节点达到了与主机节点的同步。
下一步,所有的从机节点以计算得到的波特率来接收报文头的保护标识符字节场。
保护标识符字节场PID(Protected IDentifier)与标准的串行通信数据帧格式相同,由1位起始位和1位停止位及8位数据位组成,属于数据场,如图2所示。
保护标识符字节场由两部分组成:标识符和标识符奇偶校验。ID0~ID5属标识符,确定了标识符的内容,可从0~63取值。其中,0~59(0x3b)用于信号传送帧,60(0x3c)和61(0x3d)用于传送诊断数据,62(0x3e)保留用于用户定义的扩展,63(0x3f)保留用于将来协议升级。奇偶校验位P0和P1则是对标识符位ID0~ID5的奇校验和偶校验,作为对接收到ID的校验措施,以确保接收ID的正确性。
报文帧的响应(response)由3~9个字节场(data field)组成,包括2、4或8字节的数据场(data field)和1个校验和场(checksum)。它们是由要发送数据的节点(主机节点或从机节点)所发送的数据和校验场所组成,都属于数据场。 校验和场(checksum)有两种:一般的校验和场与增强的校验和场。一般的校验和是数据场所有字节数据和的反码。和是按带进位加(ADDC)方式计算,所有数据字节和的补码与校验和字节相加的和必须是“0xFF”。增强的校验和与一般的校验和的区别在于计算数据场和时加上了保护标识符字节场。
3 LlN协议在普通单片机上的实现
现在单片机种类繁多,硬件资源各不相同,功能也千差万别。总体来讲,基于普通单片机软件实现LIN协议的方法可分为两大类:一种是基于单片机通用串口的实现方式,另一种是基于单片机两个普通端口位的位操作实现方法。
3. 1基于单片机通用串口LlN协议的实现
基于单片机通用串口的LIN协议的实现方法主要是针对具有通用串口的单片机来讲的。这类单片机的代表当属最常用的51系列单片机,如ATMEL公司的AT89C51/52。
(1)基于单片机串口LlN主节点的实现
由LIN协议的分析可知,在一次帧通信过程中,主从节点在大部分时间里是以标准的串行通信数据帧的形式交换数据的,这也是LIN协议可以基于单片机通用串口实现的原因。帧通信的关键是要实现主节点和从节点的同步。在同步过程中,主、从节点所执行的操作是不同的:主机节点的任务是要发送报文头,从节点的任务是接收和判断报文头,实现与主节点的同步。报文头的间隔场是一个基于主机节点时钟频率的13个以上位时(bit time)和至少1个位时的间隔界定符。对主节点来讲,这一部分是实现主节点功能的关键。间隔场和间隔界定符的实现可采用改变串口波特率,用串口输出特定数据的方法来实现。例如在一般情况下,单片机采用19.2kb/s波特率的速率传输数据,可先将串口的波特率设置为9.6kb/s,则传输0xc0这样一个数据就可以实现按照19.2kb/s的波特率来计算位时的同步间隔和同步间隔界定符的位时长度要求(因若采用19.2kb/s的传输率传输00数据只能实现10个位时的同步间隔符,无法达到13个位时的要求)。随后的PID场的发送和数据场的发送或接收,可以基于单片机的通用串口以正常的19.2.kb/s的波特率来操作。
基于串口LlN主节点硬件原理如图3所示。
主节点在一次帧通信过程中,要根据通信过程中不同的阶段,将串口设置成不同波特率的发送或者接收状态,以完成报文头间隔场、同步字节场的发送,保护标识符字节场的发送,及下一个阶段的接收或者发送数据过程。
(2)基于单片机串口LlN从节点的实现
从节点实现的关键是能够正确实时地接收报文头,达到与主节点的同步,为下一步的数据交换做好准备。基于单片机通用串口构成的LIN从节点的实现方案有两种:一种是查询方式,另一种是中断方式。两种方法的区别在于报文头接收判断方法的不同。查询方式硬件原理如图4所示。 同样,从节点也要求准确的波特率和计时,对时钟要求较高。建议采用22.1184MHz晶振。 在查询方式的硬件电路中,为了能及时感受到主节点报文头的起始阶段,可以将串口接收数据端,RXD端与单片机的一个外部中断触发端口(INTl或INT0)相连。这样,当主节点发送过来的间隔场的下降沿到来时,就可以实时地触发从节点进入对报文头的接收查询程序段。在报文头的接收查询过程中,从节点自总线电平下降沿到来之际,就对总线显性电平(低电平)持续的时间进行累积计算,直到发现总线恢复为隐性电平(高电平)为止。如果此段持续时间大于11个主节点工作位时时间,那么从节点就断定是一次帧通信的开始。接着从节点对同步字节场的接收作好准备,在同步字节场开始位的第一个下降沿起,连续对同步字节场的后4个下降沿进行计时累加,最后将得到的计时时间除以8,得到主节点发送数据的位时时间,即主节点下一步将要进行数据通信的波特率。从节点以此作为串口波特率设定值,通过串口与主节点交换数据。随后的串口发送或接收数据可采用串口查询或中断 的方式进行。
间隔场和同步字节场的计时方法有两种:一种方法是采用软件模拟一个位时时间,在各阶段通过计算调用位时程序次数间接计算出时间;另一种方法是将定时器TO设定成定时一个位时时间后中断,在各个阶段查询定时器T0中断次数,通过计算TO中断次数的差值,也可以间接算出各个阶段的持续时间长度。
查询方式硬件电路简单,系统中断的种类和次数少,程序运行比较稳定;但不足之处是系统大部分时间都花费在对帧报文头的等待查询上,系统资源利用率低。
中断方式则是对查询方式的不足之处改进和提高,其硬件原理如图5所示。
中断方式对间隔场和同步字节场的接收则完全采用中断方式进行。由于普通单片机的外部中断触发端只有下降沿和低电平两种触发方式,所以报文头间隔场开始阶段和同步字节场的下降沿可以触发从节点,但报文信号的上升沿却无法让从节点感知。改进方法是,让接收数据流分别经过1个三态门和1个三态非门再进入单片机的串口,2个三态门由单片机的两个端口来控制。一般情况下,三态门导通,三态非门截止,数据流正常进入单片机串口。当间隔场的下降沿触发单片机后,程序控制三态门截止,三态非门导通,数据流反相进入单片机,间隔场的上升沿经过三态非门后变成下降沿,同样也可以触发单片机中断。在随后的同步字节场的接收中,可以按照正常中断方式进行,即可由同步字节场的5个下降沿触发单片机中断5次接收。由于采用中断方式,所以各个阶段的计时就只能采用查询定时器T0中断次数的方法来实现。
中断方式的优点是,对主程序运行的影响比较小,系统的资源利用率高。不足之处是增加了单片机的外围电路,硬件稍显复杂。
3.2基于单片机普通端口位LIN协议的实现
对于没有通用串口的单片机来讲,必须采用端口位位操作的方法来实现LIN协议。这类单片机的硬件资源一般很有限,有的只有一个定时器,还不具备外部中断能力,如Microchip的PIC18F200系列。这种单片机的突出特点是价格低廉,做出的LIN节点将具有无可比拟的价格优势。
(1)基于普通端口位LIN主节点的实现
基于单片机普通端口位的1IN主节点,在报文头和数据场的实现上都要采用位操作的方法来实现。其硬件构成原理图和基于单片机通用串口LIN主节点硬件原理图完全相同,区别在于前者数据收发端RXD和TXD端可以是任意的单片机普通端口位,而后者则必须采用单片机通用串口。
报文头间隔场的实现可以将定时器TO设置为定时一个位时中断的工作方式,置LIN数据发送端TXD为显性电平(低电位),启动定时器T0对显性电平持续时间进行计时,当达到13个以上位时后置LIN发送数据端TXD为隐性电平(高电位),这样就完成了间隔场的发送。在随后的间隔场界定符和同步场的实现上,也采用同样的方法。在数据场的接收和发送中,同样需要定时器TO的配合来完成。发送数据时,从待发数据存储区中依次取出一个个数据,转换成10个bit类型的位数据。定时器T0同样是1个位时中断1次,在中断处理程序中改变计时变量值。发送数据程序根据计时变量的差值将lO个bit类型的位数据依次按照持续1个位时时间从数据发送端TXD端发出;接收数据时,则需要先用定时器T0计时半个位时时间,以检测1个字节的开始位,然后恢复定时器TO的一个位时计时中断设定。这样,在随后的数据位检测中就能保证在数据位的中间时刻检测该数据位,从而保证数据位接收的正确性。在10个bit类型的位数据接收完毕后,还要将其转换为一个byte类型的数据,存入相应的数据缓冲区。 (2)基于普通端口位LIN从节点的实现
基于单片机普通端口位LIN从节点硬件电路和基于单片机通用串口查询方式的从节点硬件电路基本相同,区别同样也是没有用到单片机的通用串口。
由于没有外部中断的功能,因此对主节点发送过来的报文头的接收只能靠从节点主动地等待查询。考虑到从节点程序不可能一直在查询等待与主节点同步,因此从节点应该不定时地去查询等待主节点的报文头。开始阶段设置定时器为不定长时间中断方式,时间到后从节点去查询等待主节点发送的报文帧。当检测到同步信息后,设置定时器为标准位时时间中断方式,对从节点接收或发送数据过程进行位时界定。从节点按照上述提到的位操作方法接收PID场,并转换为byte类型的数据,判断下一步数据场的发送或接收方向,接着按照位操作的方法实现数据的发送或接收。定时器的两种工作方式在查询等待和报文通信过程中轮流转换,在报文通信过程结束后,重新设置定时器为不定长时间中断方式,等待下一次的报文通信过程,以此类推。
从节点由于采用不定期查询等待方法与主节点的同步,因此通信成功率不高;但对于数据通信速率和实时性要求不是很高的场合,还可以满足要求。如果单片机有外部中断能力,则可以改从节点不定期查询为从节点用外部中断查询主节点发送来的报文,这样通信的成功率就可以大大提高。
结 语
相对于增强型单片机,普通单片机的功能显得简单多了,资源也很有限,但它有一个价格低廉的优势。而LIN总线的特点是协议简单,可用软件方式实现,特别适合于数据通信速率要求不高、控制简单的场合。如果能以普通单片机有限的资源实现LIN通信协议,无疑会为低端串行通信领域提供一个很好的选择。以普通单片机为硬件基础构成的LIN节点也一定会在生产和生活的相关应用领域大有作为。 |