朱 静,钱 敏,杨翠军
(苏州大学 电子信息学院微电子系,江苏 苏州 215006)
通用串行总线是一种高效、快速、双向和支持热插拔的新型接口,可实现 PC机与外设的通信。同时,它使用了一种易于扩展的结构,理论上可接127个设备[1]。当前,越来越多的电子产品中都会涉及到USB接口。因此,对基于USB接口的通信系统的研究是非常必要的。目前USB3.0协议已经制定并将大行其道。
基于USB接口设计了符合USB1.1协议的控制系统。整个系统通过 PC机的应用程序界面控制操作,USB接口负责单片机与PC机的通信。总体设计方案为:选用 Atmel公司的 MCU芯片STC89C52RC和Philips公司的USB控制接口芯片PD12,进行系统的硬件设计和软件编程。硬件设计主要是 PD12与单片机间的接口电路及外围电路单元(如LCD、按键),软件分为3部分:①固件,控制PD12识别USB数据流、输入输出等;②USB功能设备驱动程序,介于硬件和应用软件之间,提供桥梁作用;③客户应用程序,完成顶层软件对底层硬件的控制。
USB是一种数据传输总线协议。首先,USB系统被定义为3部分: ①USB的连接;②USB的主机;③USB的设备。主机在USB通信中居于核心地位,它与USB设备的通信模型如图1所示。主机和设备都被划分成不同的层次[2],每个层次的实现对USB有不同的要求。
图1 USB通信模型之间的基本信息流
USB数据流是协议中的重点内容。从逻辑上讲,USB数据的传输是通过虚拟管道进行的。实际上,主机与设备的通信过程如下:设备驱动程序首先调用USB驱动接口(USB Driver Interface)发出I/O请求(IRP, I/O Request Packet);USB驱动程序收到该请求后,调用主控制器接口,将IRP转化为USB的基本传输;通过主控制器将该传输解析成总线操作并以数据包(Packet)的形式输出。
USB发展经历了1.0、1.1、2.0、3.0版本,由于本项目中数据传输速率要求不高,故采用符合USB1.1的PD12芯片。它是USB控制接口芯片,集成了SIE、FIFO存储器、收发器及电压调整器[3]。是一款带有并行总线的USB器件,支持本地DMA传输。这些特点在系统实现时能节约成本,外设能实现更高级的USB功能。PD12需单片机配合才能完成USB通信,单片机利用读写外部存储器方式来执行该芯片的通信功能命令。
基于 USB接口的控制系统硬件组成包括单片机、USB接口芯片及一些外围电路元件(如数码管、LED发光管、蜂鸣器等)。如图2所示是系统硬件设计框图,主要由5个部分组成:PC主机用于对后台的控制;USB接口是主机和外设之间连接的桥梁;USB接口芯片完成数据通信功能,并读入微控制器中处理;微控制器选用STC89C52RC芯片,完成各部分控制功能和USB传输协议;外围电路元件用来检验系统的通信是否成功。
图2 系统的组成框
固件是运行于单片机中的前台控制程序,采用KeilC51编译生成。为了使PD12在USB上的数据传输速率尽可能大,固件被设计成完全的中断驱动模式,前后台分开工作,并通过事件标志和 Setup包数据缓冲区来实现数据的交换[4]。通常,USB固件程序包含3部分:①初始化整个电路;②主循环部分;③中断服务程序。
固件软件系统结构模块[4]如图3所示。
图3 系统固件的结构
硬件提取层:它是固件最低层的代码,完成对单片机I/O口和硬件接口进行操作。
PD12命令接口:对PD12的所有功能进行访问并操作,简化PD12编程。
中断服务程序:对 PD12发出的中断请求进行处理,从 PD12内部读数据到存储器,并设置事件标志,以便主循环进一步处理。
标准请求和厂商请求:对协议中各种标准请求以及用户添加的特殊请求进行处理。
主循环:首先初始化微控制器单元的所有端口、存储器和中断服务程序,然后进入循环,轮询各种状态并进行相应的处理。
该程序结构具有高度的可移植性以及很好的可扩展性,它按功能将复杂的过程分成多个简单的模块处理,采用事件标志和缓冲存储,有效地将各个模块联系起来,能够完成微控制器和 PC机之间的USB通信。
由于Windows中没有现成的驱动程序支持设备的使用,因此必须编写与 PD12数据通信相匹配的功能层设备驱动程序。
设备驱动程序提供操作系统与硬件的接口,支持用户与应用程序间的信息交换。软件程序在Visual C++6.0的环境下完成,使用Compuware公司的 DriverStudio工具生成驱动程序框架[5],用户对其进行修改并加入自己的功能代码,大大缩短了开发的时间。
采用 Windows驱动程序模型(WDM, Windows Driver Model),其架构如图4所示。它是一种基于Windows平台的设备驱动程序模型,采用灵活的分层处理方法,不仅可以接收来自其上层驱动程序提供的相关服务,而且可以通过发送IRP请求与其他驱动程序进行通信[6]。
图4 WDM型的USB驱动程序架构
USB驱动程序的工作流程如下:首先,用户应用程序调用Windows API函数,向驱动程序发出请求,并将相关数据打包成IRP,IO管理器捕获IRP并进行相应处理;然后,IO管理器向USB功能设备驱动程序发送IRP包,请求功能设备驱动程序进行相应处理;最后,功能设备驱动程序处理完接收到的 IRP,设好相关环境后将其传给更底层的驱动程序,由总线驱动程序完成对硬件的操作,并将结果返回。中间层驱动程序相当于过滤器,可不做任何事,只是向下传递IRP。
USB设备应用程序的作用是为主机与 USB外设提供通信桥梁,实现主机对 PD12的管理与操作,为用户提供友好的人机交互界面。它是系统与用户的接口,不能直接去访问USB设备,必须通过调用驱动程序来完成对外围设备的控制和通信。
应用程序在Visual C++6.0环境中开发实现,使用它提供的微软基础类(MFC, Microsoft Foundation Class)来编写程序,MFC对Win32 API函数进行封装,提供了大量的类库和代码支持[7],可实现大部分API功能,大大简化了应用程序的编程。
应用程序主要向硬件发送数据或命令。它与驱动程序的通信主要是通过驱动程序提供的函数来实现的,过程如下:应用程序首先调用 CreateFile函数打开 USB设备,获得设备句柄;然后利用该句柄,应用程序调用DeviceIoControl函数与WDM驱动程序进行通信;最后在退出应用程序之前,应调用CloseHandle函数来关闭该USB设备[8]。
图5为PC机与USB设备进行通信的应用程序简单界面。首次将前台被控端与 PC机相连需安装驱动程序,用户基于该界面在 PC端进行各功能的操作,如在文本框中输入字符、点击相关按钮等,设备端可以作出相应的反应。调试结果表明,数据在该系统中传输无误,程序运行正常可靠。
图5 应用程序简单界面
提供了一种基于USB接口的控制系统的设计方法,通过实际的硬件实现和软件调试,数据能够在该系统中快速无误地传输,可应用在各种电子产品中实现与PC机进行准确的数据传输[9]。但在硬件通信协议方面,可以选用符合 USB2.0协议的接口芯片,加快通信的速度,使图像传输等高速通讯成为可能。在软件方面,设计的方式和源代码的实现可以采用更优化的方法。相信随着USB总线技术的不断发展,它的应用领域会越来越广阔。
[1] 边海龙, 贾少华. USB2.0设备的设计与开发[M]. 北京:人民邮电出版社,2004.
[2] 胡晓军, 张爱成. USB接口开发技术[M]. 西安:西安电子科技大学出版社,2005.
[3] 胡凯, 龚莉萍, 陈云榕. 基于 USB2.0的数字高速采集设备设计[J]. 通信技术, 2009, 42(07):45-47.
[4] 周立功. PDIUSBD12固件编程与驱动开发[M]. 北京:北京航空航天大学出版社,2003.
[5] 陈亚娟. USB广播播放控制系统设计[J]. 通信技术,2009, 42(02):292-294.
[6] 武安河. Windows2000/XP WDM设备驱动程序开发[M].北京:电子工业出版社,2005.
[7] 张岳新. Visual C++程序设计[M]. 苏州:苏州大学出版社,2002.
[8] 鄢斌. 基于USB接口密码模块的可信计算平台设计[J].信息安全与通信保密,2011(05):107-109.
[9] 张建军, 杜莉. 防跟踪 USB接口加密狗的设计[J]. 信息安全与通信保密,2010(10):58-59,62.