3 软件设计
1553B设备测试软件首先要实现USB接口与PC之间的通信,然后,再对设备进行性能检测。因此,需要对USB芯片进行固件、PC驱动程序和测试程序设计。
3.1 USB固件设计
AT89C52中的固化程序可采用C51 设计,主要功能是:控制PDIUSBDl2接受USB驱动程序的请求;控制PDIUSBDl2接受应用程序的控制指令;通过PDIUSBDl2存储数据并实时上传PC机。PDIUSBDl2的固件设计成完全的中断驱动,当CPU处理前台任务时USB的传输可在后台进行,确保了最佳的传输速率和更好的软件结构,简化了编程和调试。单片机通过PDIUSBDl2与主机通信的过程简述如下::当PDIUSBDl2接收到主机发来的令牌包后就给单片机发中断,单片机进入中断服务程序。它将数据从PDIUSBD12的内部FIFO取回到CPU存储器并根据中断寄存器判断USB令牌包的类型从而建立正确的事件标志以通知主循环程序进行处理,主循环检查事件标志并进入对应的子程序进行进一步的处理,固件程序流程如图2所示。系统上电后,先检测PDIUSBD12,如检测不成功则报错,要使用者重插USB接口,再次检测。检测成功则根据PDIUSBD12的中断类型设定中断标志位的值,再根据中断位的值调用相应的功能子程序[3]。
图2 固件框架流程图
在本设计中,功能子程序主要包括两部分:
1)通过AT89C52的P0端口从FPGA接收1553B设备数据,重新打包,再经过P0端口写入PC机;
2) 通过P0端口接收PC数据,重新打包,通过AT89C52的P0端口从FPGA写入1553B设备。
3.2 驱动程序
完成驱动程序设计的方法一般有三种:基于DDK开发、基于Windrive开发和基于DriveStudio开发。由于Windrive和DriveStudio开发对DDK中的函数进行了一定程度的封装,它们开发的难度比直接用DDK开发要小,但开发的灵活性不如DDK。本设计使用的驱动是DriveStudio与DDK配合进行开发,开发驱动程序的效率较高。
在驱动程序开发平台搭建成功后,我们利用驱动程序生成向导Driver Wizard,根据硬件设置生成USB设备驱动程序的大体框架。设置如下:①选择 WDM的驱动程序类型和Windows 2000运行平台。②选择 USB总线类型,填写它的VID(供应商ID)和PID(设备ID),这些信息由芯片的供应商提供。③增加端点 1和端点2,它们分别具有IN 和OUT属性。④根据需要选择对设备的操作有:Read、Write、Device Control和CleanUp。⑤选择给端点2产生 BULK Read和Write的代码, 向导会自动产生一套对端点2进行读、写的代码。⑥设置驱动程序的属性,采用WDM接口;在选取读写方式时应遵循一条原则:需要快速传送大量数据时,用 Direct I/O,反之用 Buffer I/O,本设计数据量不大,故选用Buffer I/O;由于无特殊的电源需求,故选用系统默认的Manage Power For This Device。⑦增加IOCTL接口,在其生成的代码框架中加入自己的操作,以实现一个完整的USB 设备驱动程序。最后就生成了一个 WDM 型的 USB 设备驱动程序框架和一个测试该驱动程序的测试程序大体框架。然后在其中添加需要的功能代码。
通过DriveStudio初步建立一个驱动程序框架后,我们只要修改TESTFIRMDevice.h和TESTFIRMDevice.cpp就可以了,修改完毕后,可以发现使用DriveStudio向导生成的USB设备驱动程序,不仅不需要对底层的硬件进行编程,甚至可以忽略与硬件控制紧密相关的复杂的Windows数据结构(如,URB、IPR)、API函数(DriveEntry()、IoCreateDevice()、AddDevice())的使用。
用DriveWizard创建USB框架程序自动生成的两个工程(Project)文件:TESTFIRM驱动程序工程和Test_TESTFIRM应用程序工程,将光标定位在其中一个工程上之后,单击右键,选择“set as Acnve Pmiect”即可设置该工程为当前活动工程。对于驱动程序编译,不用进行任何设置,单击Build图标即可生成USB驱动程序TESTFIRM.sys文件。
3.3 通信程序
因为DriveStudio已经替我们把核心驱动程序基本开发完了,在本设计中,只要掌握WriteFile和ReadFile两个函数的使用就可以进行简单的USB通信了。由于DriveStudio所用的类库是对DDK函数一定程度的封装,必须在 VB、VC++等软件开发环境中编译,创建自己的库文件,所以很容易为程序增加了图形界面,使用户操作更加方便。本设计测试软件流程如图3所示。
图3 测试软件主流程图
当USB设备与PC通信时,USB设备是从设备,PC是主设备。PC机通过检测USB总线数据端电平判断是否接入或拔出USB设备。PC检测到USB设备后,调用USB设备函数。如果设备被正确打开,软件开启监听USB设备线程,以20ms周期轮询USB接收数据接口。一旦接收到数据,数据就被分析并且回显到界面上,直到线程被中断。