沈万松
(同济大学汽车学院,上海 200092)
汽车中的LIN(Local Interconnect Network)总线网络又被称为局部互连网络,它是在汽车CAN总线网络出现后的又一种分布式车辆电子控制网络系统。LIN总线具有结构简单,开发成本低廉等特点,为现有多种汽车网络提供了功能上的补充,同时简化了多种现存的多点解决方案,因此,它在当今汽车电子业中被广泛使用。在车辆电器的网络布置结构中,LIN总线主要被运用在仪表系统、空调、座椅、雨刮器、后视镜、雨量/光照传感器、天窗等汽车电器零部件中,它担负着在各个汽车电器零部件与智能车载控制器之间传递数据的任务。
对于一个优秀的汽车电子工程师来说,在设计开发基于LIN总线的车辆电器部件及电器网络的时候,需要始终了解LIN总线中传递的动态数据信息,并能够及时准确地捕捉到LIN总线中所传递的数据信息,为此,具备对LIN总线上实施信号捕捉的数据信号监视设备是一个必不可少的工具。本文将围绕如何设计一个有效的LIN总线数据监视器并实现LIN信号的捕获而进行一系列阐述。
为了能够满足更加精确地监听LIN总线上的信号,更加快速地把接收到的数据传递到PC电脑,支持不同版本的LIN总线协议规则以及低功耗等设计要求,本设计选用了由埃尔姆(ELM)电子电器公司所提供的ELM633器件作为LIN总线数据监视器的硬件主芯片,该芯片具有持续监视一个LIN网络的数据传输、持续转换LIN信息帧信息以标准 ASCII代码输出、重复发送数据至RS232接口等功能,这使得在PC或是PDA等终端设备上可以轻松实现LIN总线的数据读取及后续数据分析等工作。此外,ELM633芯片支持固定的LIN总线数据通信波特率速度19200BPS,符合目前各大汽车厂商所采用的高速LIN总线数据通信的速度要求。ELM633芯片共有8个针脚,根据不同的需要有PDIP和SOIC两种封装方式可供设计人员进行选择,图1为PDIP插入式封装形式的ELM633芯片以及针脚示意图。
图1 ELM633芯片PDIP封装形式和芯片元件针脚示意图
根据图1所示,针脚PIN1(VDD)为正电源引脚,在电路中总是与电路的正极端连接,该ELM633芯片的正常供电电压范围在4.5伏至5.5伏之间。针脚PIN2(XT1)和PIN3(TX2)用于连接晶体振荡器并对内部时钟操作电路提供定时信号,使用3.57954MHZ频率的晶体振荡器被连接在这两个针脚之间,同时再使用2个推荐值为27pF的晶体负载电容分别连接在PIN2、PIN3与电路的负极之间,这样可以保证LIN总线上有正常的数据传送速率。针脚PIN4(Rxmode)是用来控制在RS232接收输入端上的信号电平转换,这为各种不同的RS232接口连接方法提供更加灵活的设置。如果在RS232接口与本芯片的PIN5(RS232Rx)引脚之间仅仅使用一个电阻连接来减少硬件成本,在这种情况下该引脚就可直接连接到电路负极,内部逻辑电路会自动转换信号极性。如果使用一些标准的电平转换接口电路,如MAX232系列转换芯片或是SN75189/MC1489等电子元器件。在这些情况下ELM633芯片的内部转换电路就可不被使用,通过将该针脚PIN4(Rxmode)与系统供电正极相连接来屏蔽内部转换的电路。外围RS232接口可以直接和ELM633芯片的RS232接收输入端进行连接。针脚 PIN5(RS232Rx)是该器件RS232接口的数据接收输入端口,它可以通过一个电阻或是一个电平转换器件和PC电脑上的RS232发送信号端口相连接。如果ELM633芯片发现该针脚处于一个激活状态,特殊的上电监控模式被启用以使系统进入完全启动阶段,在这个模式下,ELM633芯片会显示ID字符串并立即执行相关命令来监视整个LIN总线上信号活动状态。针脚PIN6(Txmode)是RS232接口的发送数据输出引脚,在空闲阶段,即没有数据被传送的时候,这个针脚将输出一个高电平。针脚PIN7(LIN)是一个输入端口,用于接收LIN总线的信号,由车辆LIN总线上传来的信号被转换和进行缓冲后被传递到该引脚,注意该引脚的输入信号仅限于在零伏至系统电压之间,因此,该引脚不可以直接连接到车辆LIN总线上。针脚PIN8(Vss)是整个器件的接地点,它应该和整个电路的接地点相连接。为了更加快速地把LIN总线上读取的信号传递到外部设备上,ELM633器件与外部PC电脑之间串口通信的速度被定为每秒57600个比特位,这个速度远远大于ELM633器件监视LIN总线上数据传输速度19200BPS,这样就可以保证该器件能够足够快地捕捉到LIN总线上的信号。
为了使用一个标准可靠的RS232接口数据传输方式,本设计选用一个MAX232电平转换芯片连接在ELM633和PC电脑的RS232接口之间,同时为了使芯片内部电平转换电路不被启用,PIN4端口必须被设置为逻辑高电平。由于测试车辆上LIN总线中的信号要用到车辆上的蓄电池电压,一般车辆蓄电池的供电电压为12伏,而用于监控LIN总线数据的ELM633主芯片又需要5伏的外界电压维持其工作,那么可以借用车辆蓄电池的电压给ELM633芯片进行供电。为此,在电路中需要设计一个12伏转换成5伏的电压转换电路,78L05是一个被广泛使用的3端正电源电压调节器,它可以输出5伏的固定电压,适用于100mA电源供给的场合,另外在78L05器件的电压输入和输出端口处安装电容器进行过滤,并在电路中使用LED小灯作为可视的反馈信号,以显示有可供使用的正极供电电源信号。图2为LIN总线数据监视设备的供电系统原理图。
图2 LIN总线数据监视系统供电原理图
在车辆LIN总线与ELM633的用于接收LIN总线的信号的针脚PIN7之间需要按图3所示连接一个PNP晶体管,用于输入信号的电平转换,一个典型的CMOS输入将电平状态转换为系统供电电压的一半左右,即2.5伏,这可能会导致在汽车使用的环境中出现噪音问题。通过提供一个晶体管缓冲,信号输入阀值被有效地提高到4伏左右,在增加了信号增益、电平固定和转换的同时提高了抗噪性能。同时在LIN信号的输入端需要使用二极管,这可以防止破坏性的反馈信号进入电路,并保护晶体管和其他电子元器件。
图3 LIN总线数据监视设备电路连接原理图
由此可见,将LIN总线数据监视设备中的系统供电电压线Vbat、接地线GND和LIN总线,分别与车辆上的12伏蓄电池正极导线、接地线以及车辆LIN总线相连接,而RS232接口上的数据接收线、数据发送线和接地线分别连接到RS232的标准9针插口的2、3和5号插孔上,再与PC电脑上的9针串行口相连接,这样便完成了LIN总线数据监视设备的硬件连接设置,在PC电脑端上安装相关的应用软件后,就可以实时获取LIN总线上的动态数据了。
LIN标准使用的是一种串行通信协议,在很多方面和个人电脑所使用的RS232标准一样。而在标准的RS232通信标准和LIN总线通信协议之间的区别在于LIN总线中还使用了一个“同步”信号。LIN总线的同步信号由至少13个连续位时间组成,并且都以激活状态“0”来表示,这个至少13个连续状态“0”位时间长度在普通的RS232系统标准中从来没有出现过,而普通的标准RS232协议中只会出现一个起始位和8个数据位总共最多9个激活状态“0”位。由此,这13个连续状态“0”位时间长度信号就被称为“同步”信号,它总是由LIN总线系统中的主控制器所产生,该“同步”信号的出现也意味着一组数据帧信息传递操作将要被实施。因此,一旦同步信号发生,信息帧字节信息将与RS232标准相同的方式被全部发送出去。被发送出去的每个信息帧由两部分组成,即信息头部分和应答信息部分。LIN总线系统中的主控制器(主节点)总是发出信息头部分,而应答信息部分可根据主控制器是发送数据还是获得数据的状态分别由主控制器和LIN总线上的子控制器(子节点)来完成。
信息头中的第一个字节被认为是“同步字节”,该字节的数值总是被定为0x55,这是因为该字节的信息创建了一个比特位“0”和比特位“1”之间的替换模式,它可以被子控制器用来执行一个内部定时标定工作,这样子控制器就可以使用廉价的RC振荡器来实现,硬件成本可以得到大幅降低。跟随着同步字节之后的是“标识字节”信息,它总是由主控制器发出,用来表述该信息的具体用途,因此,它也可以被认为是一个命令字节。应答信息部分出现在标识字节信息之后,它通常有2个、4个、6个或是8个字节所组成,此外,在其最后还有一个“校验和”字节。图4显示的是一个完整的LIN总线信息帧结构。
图4 LIN总线信息帧结构示意图
ELM633器件凭借一个标准的RS232串口与用户界面进行通信联系,串口通常也是计算机与外部设备之间的数据传输通道,其通信方便易行,应用广泛,因此本设计在Visual C++6.0下利用WINDOWS API所提供的通信函数来完成串行通信程序的编制。
在WIN32中,串口和其他通信设备均被作为文件处理,串口的打开、关闭和读写等操作所有的API函数与操作文件的函数相同。利用CreateFile()函数可以打开串口,获得串行设备句柄并对其进行通信参数设置,包括设置输出、接收缓冲区、超时控制和事件监视等;GetCommState()函数可以获取当前串口所设定的波特率数值、有无奇偶校验、数据位和停止位信息。由于ELM633和外界设备串口通信的数据传输波特率设为固定值57600波特,通信参数被定为八位数据位,一位停止位、没有校验位以及没有握手信号,因此,如果当前设备与ELM633器件相连接的串口通信参数数据不符合要求,可以通过BCD结构体并使用SetCommState()函数命令来设置当前串口的通信参数,以满足ELM633器件串口通信的参数要求。
在串口通信参数设置好以后,就可以编写发送给ELM633器件指令的相关程序。在ELM633器件中规定了使用两个字母“AT”开头的指令集,比如有询问当前监视LIN总线的数据通信波特率速度,设置 ELM633器件默认状态值,显示当前ELM633器件的ID标识信息字符串,复位整个ELM633器件,监视总线上的所有信息帧以及监视单个特定标识信息帧等指令。在VC中要实现串口数据的发送可以使用WriteFile()函数,对于使用异步输入输出的操作方式,可以同时对一个串行设备进行读写操作,在使用该发送指令的时候,最后一个参数必须是一个指向&overlapped结构的指针,可通过&overlapped结构来获得当前的操作状态。因此可以先根据要求定义一个用于存放发送命令字节的数组,对数组中的每个数组元素进行赋值,然后再运用WriteFile()函数将特定的AT指令发送给ELM633器件。数据接收的任务由ReadFile()函数来完成,该函数从串口接收缓冲区中读取数据,在读取数据前,先用ClearCommError()函数获得接收缓冲区中的字节数。另外,在程序中还要开一个用于接收数据的线程对串口接收数据事件进行监视,当监视事件发生时,该线程可将这个事件登记到对事件进行处理的窗口类中。在整个应用程序结束或不再使用串行设备的情况下应该将串行口关闭,可以利用CloseHandle()函数来关闭串口以及事件句柄操作。图5为汽车LIN总线数据监视器软件设计流程图。
图5 汽车LIN总线数据监视器软件设计流程图
针对ELM633器件,本设计通过使用Visual C++6.0编程软件开发了LIN总线数据监视设备的应用软件LIN-BUS-Monitor。在该软件的主界面上可以实现对串行口及其通信参数的设置,开始或停止接收数据按钮发送针对硬件的操作命令,包括版本信息查询,监视整个总线上的动态数据以及只监视特定标识信息帧数据等功能。
开启软件后首先要完成串口号的选择和正确波特率参数的设置。在串口号输入框中输入串口号“COM1”数据,然后点击“COM Config”按钮后,在串口配置显示框中会显示出当前串口的波特率、停止位、数据位和校验位信息,如果此时的波特率信息不符合要求,可以在波特率设定输入框中输入波特率数值信息,并按“Set Baud”按钮对其进行设定,然后再次点击读取串口配置信息按钮后,新状态的波特率参数会显示在串口配置显示框中。
在正确设置了串口配置信息之后,就可以选择发送设置区域中的按钮选项来对ELM633器件发送指令了。如果要监视当前LIN总线上所有的信息帧数据,可以点击发送设置中的监视全部信息(Monitor ALL)按钮,此时在发送指令信息框中就会出现“Monitoring ALL Frame Status……OK!”的字样,同时在接收数据区域中立刻会显示出当前LIN总线上所有被监视到的LIN总线数据信息,如果想要监视固定单个信息帧数据变化的情况,可以通过输入所需要特别监视的信息帧识别号ID(十六进制),然后单击“Monitor ONE”按钮来监视特定单个识别号的信息帧数据,这个功能可以满足使用者对单个LIN总线信息帧数据内容进行测试分析,操作显示界面如图6所示。
图6 LIN总线上所有信息帧显示和LIN总线识别号为0xE2的单个信息帧数据显示
本设计通过对ELM633芯片及外围电路的搭建,创建了适用于监视车辆LIN总线数据的硬件环境,配合PC电脑终端上安装的LIN总线数据监视应用软件,实现了对LIN总线上所有信息帧的监视或指定单个标识符信息帧的监视操作。该LIN总线数据监视工具的实现有助于车辆设计开发工程师对LIN总线信号测试和数据分析,也有助于对车辆LIN总线感兴趣的工程人员更快、更直观地学习LIN总线的相关知识。LIN总线数据监视器的实现具有一定的实用价值。
[1]侯俊杰.深入浅出Windows MFC程序设计[M].武汉:华中理工大学出版社,1998.
[2]李景峰.Visual C++串口通信技术详解[M].北京:机械工业出版社,2010.
[3]刘俊萍.汽车电脑与总线技术[M].武汉:武汉理工大学出版社出版,2009.
[4]周韧研,商斌.Visual C++串口通信开发入门与编程实践[M].北京:电子工业出版社,2009.
[5]李朝青.PC机及单片机数据通信技术[M].北京:北京航空航天大学出版社,2000.