LonWorks总线技术在开发与应用中最常用的接口设备为USB-LON适配器,简称LON卡。本文介绍的是如何设计开发一种成本低、可靠性好、通信能力强的LON卡。
LonWorks技术是美国Echelon公司于上世纪90年代初推出的一种现场总线技术。LON(Local Operating Network)的意思为局部操作网络,它是用于开发监控网络系统的一个完整的技术平台,LonWorks现场总线在网络通讯方面具有突出的优点,作为现场总线中的佼佼者在国内各个领域的测控系统中广泛流行。
通用串行总线(Universal Serial Bus,即USB)是一种快速、灵活的总线接口。与其它通信接口相比,USB总线接口最大的特点是易于使用,这主要表现在成本低、适用于多种设备、支持热插拔等方面,并且所有的配置过程都由系统自动完成,无需用户干预。目前,市场上供应的USB控制器主要有两种:带USB接口的单片机(MCU)和纯粹的USB接口芯片。本文采用Cypress公司推出的带智能USB接口的EZ-USB单片机。该单片机极大地降低了USB外设的开发难度,为PC机外设的制造商提供了一个性能优良、价格较低的设计方案。采用USB接口设计开发的LON网互联适配器很好地解决了传统适配器由于RS-232与PC/Laptop互联而造成的速度上的瓶颈。
一、LON卡系统组成及工作原理
(1)LON卡硬件系统组成
LON卡是LON网与PC/Laptop的接口,在通信过程中起着关键的作用,它既完成了LON网与PC/Laptop的互联,又实现了数据的交换。LON卡作为LON网的一个特殊的网络节点——通信处理器,能按照LonTalk协议与LonWorks总线上所有分布在现场的智能节点进行对等的数据通信,起到上传下达的桥梁作用。当现场的测控设备有数据送到LonWorks网络上时,互联适配器负责把所有发送给它的信息接收下来,将测控设备发送来的LonTalk显式报文重新打包装帧,向PC/Laptop发送。同时,它将从PC/Laptop接收来的已解析的数据按LonWorks现场总线通信协议构造LonTalk显式报文,发送给LonWorks网上的测控设备。
相对USB系统而言,PC/Laptop是USB主机,互联适配器只是USB外部设备。在整个USB系统中只有一个主控制器,即主机(PC/Laptop),主机是总线控制者,USB设备响应主机请求。系统软件设计部分也是针对主机和外部设备这两部分展开的。
(2)LON卡工作原理
LON卡中采用Neuron芯片预定义的并口I/O应用模式实现双CPU的通信,并行口的速率可达3.3Mbps,实现了高数据速率。
并行I/O应用模式下利用Neuron芯片的11个I/O口进行通信,其中,IO0~IO7为双向数据线,IO8~IO10为控制信号线,借助令牌传递/握手协议,并行I/O口可用来外接处理器,实现Neuron芯片与外接各类微处理器之间的双向数据通信,在这里采用EZ-USB单片机与Neuron芯片互连。主机PC/Laptop控制USB外部设备,通过LON卡与LON网各现场节点通信,其实质就是LON卡中EZ-USB单片机与Neuron芯片之间的通信。
并行口的工作方式有三种,即主模式、从A模式、从B模式。不同的模式下,IO8~IO10这三根控制信号线的意义不同,这里应用的是从A模式。在从A模式中,认为Neuron芯片为从CPU,EZ-USB单片机为主CPU,主CPU和从CPU之间的数据传输通过虚拟的写令牌传递协议(Virtual Write Token-Passing Protocol)得以实现。主CPU和从CPU交替地获得写令牌(Write Token),只有拥有写令牌的一方可以写数据(不超过255个字节),或者不写任何数据传送一个空令牌。传送的数据要遵从一定的格式,即在要传送的数据前面加上命令码和传送的数据长度,命令码有CMD_XFER(写数据)、CMD_NULL(传递空令牌)、CMD_RESYNC(要求从机同步)、CMD_ACKSYNC(确认同步)四种,最后以EOM字节结束。在从A方式中,整个握手/应答协议以及数据传送的实现过程是自动完成的。在通信以前,主CPU和从CPU之间先建立握手信号,即HS信号有效(这由3150的固件自动实现)。然后,主CPU再送一个CMD_RESYNC命令,要求从CPU同步,而从CPU接收到这个信号以后,则发送CMD_ACKSYNC,表示已经同步、可以通信了。同步以后,虚写令牌就在主CPU和从CPU之间无限地、交替地传递,拥有虚写令牌的一方就可以向数据总线上写数据,即主CPU可以往从CPU写数据,从机也可以将数据传往主CPU。
需要特别说明的是,Neuron芯片的握手及令牌传递的实现是自动的,但是对于非Neuron芯片的微处理器(EZ-USB),就要求编程人员通过编程使非Neuron芯片的微处理器能够执行Neuron芯片的握手/令牌传递算法,也即是复制Neuron芯片的行为,从而实现双方的通信。
二、LON卡硬件设计
LON卡主要由神经元芯片和EZ-USB单片机组成。
神经元芯片(Neuron Chip)是LonWorks技术的核心?熏 芯片中含有Lontalk协议的固态软件(简称固件),使其能可靠地通信。神经元芯片主要包含TMPN3150和TMPN3120两大系列,由日本东芝公司生产。TMPN3150支持外部存储器,适合更为复杂的应用,而TMPN3120则不支持外部存储器,它本身带ROM。所以,在LON卡的设计中选用的是TMPN3150,该芯片内有三个微处理器,即MAC处理器、网络处理器和应用处理器。对神经元芯片进行外围电路的设计和扩展,使之成为LonWorks网上的一个特殊的LON节点,这样它不仅可以与LonWorks网络上的LON节点进行通信,还可以作为适配器的协通信处理器。
TMPN3150片内存储器的地址范围是E800H~FFFFH,包括2KB的RAM、0.5KB的EEPROM、2.5KB保留空间和1KB的用于存储器映象I/O的空间。TMPN3150有16根地址线,可寻址64K空间,可以外接存储器,如RAM、ROM、EEPROM或FLASH等。由于开发Neuron芯片时采用Neuron C语言,内存占用大,另外其作为通信协议处理器使用要求有大量的数据缓冲区进行数据交换,而仅仅利用3150内部的2KRAM空间是远远不够的,因此扩展了外部存储器FLASH和RAM。FLASH选用AT29C512,其地址范围是0000H~7FFFH;RAM选用IS61C256AH-15N,其地址范围是8000H~DFFFH。AT29C512和IS61C256AH-15N的地址范围由Neuron芯片的地址线和控制线E及相关的逻辑门电路来确定。神经元芯片的晶振为10MHz。Neuron芯片与LON的网络介质的接口采用上海工业自动化仪表研究所生产的双绞线收发器。收发器按其传输速率可以分为TPT/XF-78(传输速率为78kbps)、TPT/XF-1250(传输速率为1.25Mkbps)两种型号,用于满足不同的通讯要求。这里选用的是TPT/XF-1250。
EZ-USB单片机采用的是EZ-USB2100系列中具有44个引脚的AN2131S。AN2131S是互联适配器的主CPU,利用其I/O端口足以完成所需的功能。EZ-USB芯片中包含内部程序/数据RAM共8KB?熏不再需要ROM或其它非易失性存储器。主CPU与辅CPU的连接很简单,即与辅CPU的11个I/O口进行连接。单片机的PB口接上辅CPU的IO0~IO7,为两个CPU的并行通讯数据端口。单片机的PC0~PC2分别接神经元芯片IO8~IO10,完成控制功能。AN2131S再通过引脚USBD+和USBD-与主机PC/Laptop互联。
三、LON卡软件设计
LON卡的软件程序设计分为两大块。一块为对主机PC/Laptop程序的软件设计,另一块为对外围USB设备——互联适配器程序的软件设计。
(1)USB主机的软件设计
主机的软件设计主要包括两部分:一是基于USB的LON卡的驱动程序。如图3所示,USB通信使用分层驱动模型,每层处理一部分通信过程,这样可以使不同设备在一些任务上使用相同的驱动。这里使用Microsoft WDM DDK和Microsoft Visual C++6.0来完成。
二是USB通信程序和用户服务程序。用户服务程序通过USB通信程序与系统USBDI(USB Device Interface)通信,由系统完成USB协议的处理与数据传输。从逻辑上讲,USB数据的传输是通过管道进行的。USB系统软件通过缺省管道(与端点0相对应)管理设备,设备驱动程序通过其它的管道来管理设备的功能接口。为了满足不同外设和用户的要求,USB提供了四种传输方式:控制传输、同步传输、中断传输和块传输。本系统使用的是块传输。EZ-USB提供了16个用于块传输的端点,包括7个IN端点(EP1_IN~EP7_IN)和7个OUT端点(EP1_ OUT~EP7_OUT)。每个端点都有一个64字节的缓冲区。块端点无方向控制,一个端点地址对应一个方向,所以端点IN1的地址不同于端点OUT1的地址,本适配器就采用这对端点传输数据。其中,端点0在USB系统中有特定含义,它是EZ-USB芯片中唯一的控制端点,用于传输控制信息。
开发可以访问LON卡的应用程序,可使用任何一个支持win32函数CreateFile()和DeviceIoControl()的编译器。首先调用CreateFile()函数,来取得访问设备驱动程序的句柄,CreateFile()使用设备的链接符作为函数参数。然后调用DeviceIoControl()函数来提交I/O控制码,并且为CreateFile()函数返回的设备句柄设置 I/O缓冲区。最后,还要调用CloseHandle()关闭设备。其中,最重要的函数是DeviceIoControl(),它的功能是完成应用程序与驱动程序之间数据的交换。DeviceIoControl()函数的具体格式为:
BOOL DeviceIoControl(
HANDLE hDevice, //外设句柄
DWORD dwIoControlCode, //I/O操作控制代码
LPVOID IpInBuffer, //输入缓冲区指针
DWORD nInBufferSize, //输入缓冲区大小
LPVOID IpOutBuffer, //输出缓冲区指针
DWORD nOutBufferSize, //输出缓冲区大小
LPDWORD IpBytesReturned, //实际返回的字节数
LPOVERLAPPED IpOverLapped //用于异步操作的结构指针
);
(2)外围USB设备——LON卡的软件设计
这一部分的软件编写也包括两部分。一部分为对主CPU(EZ-USB)的编写。USB内核功能强大,可以自动完成USB协议的转换,从而大大简化了8051的代码。采用C51语言,并使用EZ-USB的固件函数库和程序框架。框架完成了一个简单的任务循环,用户函数TD_Poll()能够实现USB外设的功能。因为从CPU(Neuron Chip)的并行模式是芯片内部定义的,遵从虚拟的写令牌传递协议,所以需要编写芯片EZ-USB的程序来模拟3150的I/O并行口的从A模式。所以TD_Poll()函数主要完成四项工作:与辅CPU同步、握手、令牌的传送以及并行口数据的读写。
另一部分为从CPU的软件程序的编写,用神经元的编程语言即Neuron C语言完成。从CPU主要完成将并口得到的报文解析,再利用Neuron C的消息传送机制,将解析的消息传送给适配器下层的应用节点;同时,还将从适配器下层的应用节点以消息形式传送上来的数据或信息构造成EZ-USB可识别的报文,通过并口传送给EZ-USB。由从机内部定义的与并行I/O对象有关的函数主要有:
io_in_ready():当并口上有数据传送到来时,此函数值为TRUE。此时可调用io_in?穴?雪函数接收数据。
io_out_request():此函数用来向并口总线发出请求以获取令牌。
io_out_ready():当并口总线处于可写状态即3150获取到令牌后,此函数值为TRUE,此时可调用io_out()函数将数据发送到并口。在调用此函数之前应先调用io_out_request()。
io_in(): 将并口上的数据接收到缓冲区。
io_out():将缓冲区的数据发送到并口总线上。
本文设计的LON卡在结构上采用双CPU设计,具有结构简单、小型化的特点,非常适合用于测控系统。在软件设计中,突出模块的灵活性,并且USB内核可以自动完成USB协议的转换,大大简化了8051的代码。总之,本LON卡具有组态灵活、成本低、可靠性好、通信能力强等优点,在工业控制、楼宇自动化等诸多领域有广阔的应用前景。