Windows系统对构成一个USB总线主机的不同软件部分进行了明确的划分,如图4所示,其中USB客户软件仅仅包含了用来控制不同的USB外设的设备驱动程序。USB客户软件会通过一个Windows所定义的一个软件接口来同根集线器驱动程序进行通信。而USB根集线器驱动程序则要通过USBDI(通用串行总线驱动程序接口)来实现同USBD通用串行总线驱动程序)的通信。然后,USBD会选择两种主控制器驱动程序(UHCD和OpenHCI)之一来同其下方的主控制器进行通信。最后,在USB总线和主机控制器之间存在一个PCI总线枚举器,它负责在检测到系统中存在一个通用串行总线时,装载适当的USB总线系统软件,主控制器驱动程序会通过PC工枚举器软件直接实现对USB物理层总线的访问。HCD与USBD代表了基于对不同层次的抽象的软件接口,它们能以某种方式共同工作,以满足USB系统的整体要求。
3.2 固件程序开发
设备固件是设备运行的核心,它控制整个硬件系统的运行,并负责处理PC机发来的各种USB请求,以完成它们之间的数据传输。其主要功能包括控制放大模块、实现通道选择;控制A/D模块的数据采集;通过FX2实时上传采集数据给PC;控制FX2芯片接收并处理USB设备驱动程序的请求(如设置USB接口状态等多种USB协议标准请求)等。
Cypress公司提供的EZ-USB FX2软件包为用户开发基于EZ-USB FX2系列芯片的USB设备的编程提供了很大的方便。无论是开发基于外设的8051固件程序,还是开发基于USB主机的设备驱动程序或应用程序,该软件包都提供了较完备的程序框架和例程库。
EZ-USB FX2固件库为用户开发EZ-USB FX2固件提供了底层Keil C函数库。EZ-USB FX2软件开发包提供了该库的目标文件,同时还提供了该函数库的源代码,用户可以利用Keil来重新编写该函数库。
EZ-USB FX2固件是使用EZ-USB FX2程序框架或直接使用EZ-USB FX2固件库开发的程序,这是开发USB外设的重要部分。
FX2在其固件程序中把自己定义为USB大存储类、块传输子类,操作系统(Win98以上)有相应的USB类设备驱动程序来支持这种USB类外设,而不需要另外在操作系统内安装其驱动程序。在FX2的固件程序中写入USB通信模块,就可以实现主机和USB设备的通信。
固件程序必须包括DSCR.A51(A51宏汇编器), USBJmpTb.OBJ(目标文件转换器)和Ezusb.lib ( Ezusb C编译器库文件和启动代码)。
固件程序有两个C文件,一个是FW.C,即框架程序,定义了基本的USB设备的功能,一般不许修改。另一个是FUNCTION.C(FUNCTION为自己命名),本设计要实现的具体功能在此文件中完成。
3.3 应用层程序
应用层程序用Visual C++6.0来开发,它可以直接调用底层的设备驱动程序。利用VC开发的应用软件具有高效、美观、操作方便等优点。
图5 软件流程图
如图5所示,本系统需要通过软件下载固件程序,对ADC、放大模块、采集模块进行控制,同时还要接收或者发送数据。在采集开始前,可以先将命令发送出去,实现在固件程序中定义的相应功能,如通过FX2口线控制前置放大模块等。然后可以读取传送到主机的数据,或者向设备发送数据等。
本文作者创新点: 本文设计的USB2.0为接口的数据采集卡,采样及数据传输速度都达到了24Mb/s,达到国内先进水平。同时该系统具有简单实用,硬件成本低,构造简单,复用性良好,功能强大的特点,也是该系统的优势之处。