基于LabVIEW的USB无线通信接口的设计
2008-07-23
作者:刘改梅, 韩慧莲
摘 要: 结合LabVIEW软件开发平台和USB总线的优点,提出了以LabVIEW为应用程序" title="应用程序">应用程序开发平台的USB无线串行通信系统的设计方案,介绍了USB无线通信设备与PC机接口的软硬件设计方法,重点阐述了USB驱动程序和应用程序的设计方法以及在LabVIEW环境下如何调用动态链接库" title="动态链接库">动态链接库完成应用程序与驱动程序的链接,从而实现在LabVIEW应用软件下进行USB无线通信。该接口界面简单灵活、接口便捷可靠,为进行实验室研究和工业测试提供了很好的利用价值。
关键词: USB LabVIEW 无线数据传输
通用串行总线USB具有即插即用、通用性强、易于扩展等优点,可以支持Windows、Linux等多种操作系统,为PC机与其外设之间大容量的数据通信提供了高速、可靠的传输协议。而LabVIEW是NI公司开发的一种图形化的软件开发平台,在虚拟仪器技术快速发展的今天,很多工业控制和测试系统的数据采集、处理应用程序都采用LabVIEW软件来完成,它具有界面友好、易学易懂、系统开发周期短、维护调试简单、无需繁琐代码的编写等优点,为测试及工程开发人员使用带来了很大方便。因此,本文结合USB总线和LabVIEW软件开发平台两者的优点,提出了以LabVIEW为应用程序开发平台的USB无线串行通信系统的设计方案,将LabVIEW语言和USB总线技术紧密结合起来,为实现数据的采集、传输和处理一体化提供了灵活的用户界面和便捷的接口功能。
1 USB无线串行通信系统设计方案
随着测试领域的扩展,将采集的数据以无线方式传输出去已经成为测试系统发展的一种趋势。传统上PC机与传输模块之间大多采用RS232接口实现数据传输,这种接口存在接口传输速率低、可靠性差、不易扩展等问题。本文采用nRF401射频收发器、AT89C51单片机和PDIUSBD12 USB接口芯片" title="接口芯片">接口芯片构建无线串行接口电路部分,以LabVIEW软件为应用程序开发平台,设计基于LabVIEW的USB无线通信系统,以解决传统的无线串行通信系统所存在的问题。其结构框图如图1所示。
本无线通信系统工作过程:将无线传输" title="无线传输">无线传输模块通过USB接口芯片连接到主机上,系统上电后,主机通过PDIUSB D12与USB无线传输设备进行通信并且管理其设备状态的变化。用户要进行数据传输时,首先在用户界面设置传输参数及收/发模式。当系统处于发射状态时,AT89C51从PDIUSBD12的Buffer中读取数据并送至nRF401发射出去;当系统处于接收状态时,AT89C51从nRF401中读出数据并通过USB接口芯片PDIUSBD12送入主机。主机通过总线枚举方式识别USB设备,应用程序采用调用动态链接库的方式实现与设备驱动的链接。
2 USB无线串行通信接口电路及总线枚举
PDIUSBD12是PHILIPS公司开发的一款高性能并行USB接口芯片,通常用作与单片机进行通信的高速通用并行接口,符合USB1.1版本规范和大多数器件的分类规格,并且PDIUSBD12具有挂起功耗以及LazyClock输出,可以满足使用ACPI、OnNOW和USB电源管理设备的要求,其较低的操作功耗可以适合于使用总线供电的外设。此外,PDIUSBD12还集成了许多特性,包括SoftConnetTM、GoodLinkTM、可编程时钟输出、低频晶振和终止寄存器集合[1]。所有这些特性都为系统节约了成本,同时使USB功能在外设上的应用变得容易。
PDIUSBD12与AT89C51控制的无线传输模块及PC机间的接口电路如图2所示(无线传输模块连接图略)。
PC机的USB接口的D-和D+与PDIUSBD12的串行数据线D+和D-相连,AT89C51的P0口接入PDIUSBD12的8位并行数据,地址线P2.7作为PDIUSBD12的片选,地址线P2.6作为PDIUSBD12的命令/数据的选择线。当P2.7=0片选有效时,若P2.6=1,则PDIUSBD12将总线上的内容作为命令指令;若P2.6=0时,则给PDIUSBD12写数据或从PDIUSBD12的Buffer中读取数据。设计中PDIUSBD12与AT89C51的数据交换采用中断处理方式。
在设备第一次连接到主机上之后,首先要接受主机枚举和配置,目的是让主机知道该设备的功能、类型、所占资源、传输方式及数据量大小等。主机确认了这些信息后,设备才能开始工作。总线枚举的过程如下: (1)接入态。USB设备接入USB总线,主机通过检测其信号线上电平变化发现设备接入。(2)供电态。主机通过询问连接事件细节确定设备接入端口,然后进行总线供电,激活该端口并发出复位命令。(3)缺省态。端口在激活状态下,设备处于缺省态,通过地址0与主机通信。(4)地址态。主机获取设备描述符和缺省管道上一系列信息后,给设备分配一个总线上唯一地址,以后设备就用这个地址与主机通信。(5)配制态。主机依照读取的设备描述符来对设备进行配置。(6)挂起态。当总线保持空闲状态超过3ms时, 设备就自动进入挂起状态。当设备完成以上除挂起的几个步骤后即被主机配置成功,就可以开始USB设备所希望的各种数据传输。
3 USB软件设计
USB系统软件设计主要包括三部分:USB设备固件、USB设备驱动程序和应用程序。
设备固件是指将程序固化在AT89C51的内部ROM中的程序,其主要功能:控制nRF401进行数据的发射/接收和控制PDIUSBD12接口芯片与主机间进行通信。而AT89C51系统对USB控制器的操作是严格按照USB协议1.1进行的。当USB无线串行设备连接到主机上时,主机通过PDIUSBD12端点0发送请求的控制命令,PDIUSBD12产生一个中断给AT89C51(INT0),AT89C51通过读PDIUSBD12中断寄存器和最后处理状态寄存器对每个请求做出响应,并通过PDIUSBD12端点0回送请求信息,主机从返回的信息中读取描述数据,分配和载入一个设备驱动程序并对设备进行配置,设备被配置好后,就可以使用配置中支持的端点来传输数据。固件程序设计可以采用C51语言编写,具体结构可见参考文献[2]。下面介绍USB驱动和应用程序的编写方法。
3.1 设备USB驱动程序的编写
由于目前Windows操作系统都不带自主开发的USB设备驱动程序,因此开发者需要用专门的驱动程序编写工具编写USB设备端驱动程序。Windows DDK 2K是Microsoft公司提供的一个在Windows2000下开发USB驱动程序的工具包,其中包含了驱动程序的编译器和调试工具,但使用起来难度较大。而DriverStudio是由第三方软件厂商Compuware提供的驱动程序生成工具,用于开发Windows NT、Windows 2000和Windows 98 WDM设备驱动程序,其优点是DriveWrorks工具对DDK函数进行了封装,大大简化了编程,且改进的DriverWizard可以引导开发者完成程序开发的全过程。
由于DriverStudio要与DDK结合使用,因此编写前首先要安装VC6.0和Win2k DDK,然后依据DriveWrorks下的DriverWizard提示设置USB设备的相关属性参数,随后会在VC6.0下生成相应的.dsw工作平台,其中包含驱动程序入口、初始化以及各种例程的.cpp源文件及.h头文件等,在所有文件中添加相关代码,将编好的程序在VC6.0和DDK中经过编译,生成.sys文件,最后把该驱动程序拷入系统盘drivers目录下,并配合. inf 安装文件即可以完成驱动程序的安装使用。
USB驱动程序符合Win2000下内核模式驱动的分层体系结构,其工作过程:当应用程序想对USB设备进行I/O" title="I/O">I/O操作时,必须调用Win API函数,I/O管理器将此请求构成一个合适的请求包(IRP)并把它传递给USB功能驱动程序;USB功能驱动程序接收到这个IRP后,根据IRP中包含的具体操作代码构造相应USB请求块(URB),并把此URB放到一个新IRP中,然后把它传递给USB底层驱动程序;底层驱动程序根据IRP中所含的URB执行相应操作,并把操作结果返给USB功能驱动程序,USB功能驱动接到返回的IRP后,将操作结果通过IRP返还I/O管理器,最后I/O管理器将此IRP操作结果传给应用程序。至此,应用程序对设备进行了一次I/O操作。
3.2 动态链接库函数的生成及调用
在LabVIEW下要实现PC机与无线传输模块通过USB总线通信,方式主要有两种:通过LabVIEW中提供的调用动态链接库模块(CallLibraryFunction)或通过VISA (Virtual Instrument Software Architec-ture)提供的USB控制函数节点来实现。本文只对前一种方式进行研究。
在LabVIEW下要进行USB通信前,首先LabVIEW函数库中必须有USB节点函数,此节点函数能将LabVIEW软件与USB底层驱动连接,可以读写USB设备并对其进行操作。虽然LabVIEW中没有包含能直接被LabVIEW所应用的USB接口节点和程序,但在LabVIEW的Advanced高级应用子模版中的CallLibraryFunction模块提供了对外部函数调用功能,可以很容易地实现对其他公司或自主开发的硬件设备的驱动。因此,可以借助调用动态链接库的方法实现在LabVIEW下USB通信功能。其步骤如下:
(1)VC++下动态链接库文件的生成。USB接口函数主要由Open_USB、Read_USB、Write_USB和Close_USB函数组成,分别表示打开设备、读/写设备和关闭设备。编好的接口函数存放在特定目录下,供以后应用程序的调用。DLL需要的文件有:h函数声明文件、c源文件、def定义文件。h函数声明文件的作用是声明DLL要实现的函数原型,供DLL编译使用,同时还提供给应用程序编译使用。C源文件是实现具体文件的源文件,它有一个入口点函数,在DLL被初次调用时,做一些初始化工作。一般情况下,用户无须做什么初始化工作,只需保留入口点函数框架即可。def定义文件是DLL项目中比较特殊的文件,它用来定义该DLL项目将输出哪些函数,只有该文件列出的函数才能被应用函数调用。要输出的函数名列在该文件EXPORTS关键字下面[3]。
(2)通过LabVIEW中的CallLibraryFunction模块实现对USB接口函数的调用。在DLL文件生成后,在LabVIEW框图程序窗口打开FunctionPalette(功能模板),在Advanced模块中选CallLibraryFunction模块,然后在快捷栏选Configure,出现对话框,根据LabVIEW与DLLs的参数对应关系填写好DLL文件的路径、被调用函数名、参数的类型及返回类型,然后LabVIEW将自动生成各参数的入口及出口状态,这样就实现了LabVIEW与DLLs的调用。
(3)实现在LabVIEW应用程序下PC机与无线传输模块通过USB接口通信。由于本设计中应用程序采用调用动态链接库形式,主要操作已由动态链接库文件完成, 所以应用程序部分主要完成无线通信输入/输出参数及通道设置、错误操作提示、数据格式转化及显示等功能[4]。
以上方案的分析结果表明:在LabVIEW软件开发环境下调用动态链接库,进行应用程序接口设计,其界面简单、易懂,并且采用USB接口芯片PDIUSBD12构建无线USB 串行通信接口,电路结构简单、系统性能良好。无论是进行实验室研究还是工业测试,本设计方案都具有较大的推广价值。
参考文献
[1] 周立功. PDIUSBD12 USB固件编程与驱动开发[M].北京:北京航空航天大学出版社, 2002.
[2] 苏涛, 张海峰, 张登福. 基于USB总线的实时数据采集系统设计与实现[J]. 电子技术应用, 2004,30(1):
12-14.
[3] 兰文武,付桂翠,高泽溪,等. 基于USB接口的数据采集系统设计[J]. 电子技术应用, 2004,30(2):21-23.
[4] 吴鹏, 陶正苏. 基于单片机USB接口的PC主机驱动程序和应用程序设计. 电子器件, 2005,(3).