基于USB接口的数据采集系统设计
驱动开发工具有DDK和第三方开发工具。其中DDK开发难度最大,第三方开发工具有DriverStudio和Windriver等。DriverStudio难度适中,而Windriver则属于应用层驱动开发,难度小,但效率低,并存在发布问题。
DDK驱动程序开发工作包括:开发环境设置(VC编译环境)[5]、驱动程序设计[6]、安装文件(INF文件)设计。
驱动程序设计采用WDM(Windows Drive Mode)。WDM设备驱动程序提供了一个参考框架,大大降低了由DDK书写驱动程序带来的难度。
D12驱动使用的例程包括:DriverEntry、AddDevice、DispatchPnp、DispatchRead、DispatchWrite和DispatchDeviceControl例程, 以下是D12的WDM驱动程序函数:
DriverObject->MajorFunction[IRP_MJ_CREATE] = D12_Create;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = D12_Close;
DriverObject->DriverUnload = D12_Unload;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL;
=D12_ProcessIOCTL;
DriverObject->MajorFunction[IRP_MJ_WRITE] = D12_Write;
DriverObject->MajorFunction[IRP_MJ_READ] = D12_Read;
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL;
DriverObject->MajorFunction[IRP_MJ_PNP]=D12_Dispatch;
DriverObject->MajorFunction[IRP_MJ_POWER]=D12_Process-PowerIrp;
DriverObject->DriverExtension->AddDevice=D12_PnPAddDevice;
驱动程序与应用程序和硬件之间通信都是IRP(I/O请求包)完成的。IRP_MJ_PNP主要是实现USB即插即用,例如设备的添加、删除和资源的分配;IRP_MJ_POWER实现电源管理,例如设备的挂起和唤醒;IRP_MJ_CREATE(创建)、IRP_MJ_CLOSE(关闭)、IRP_MJ_
DEVICE_CONTROL(设备控制)、IRP_MJ_WRITE(读)和IRP_MJ_READ?穴写?雪是主要完成数据通信的函数,实现管道的创建、关闭和数据读写。其中设备控制具有输入输出缓冲区,可实现读和写功能;AddDevice和DriverUnload实现设备管理,在设备添加和卸载时,创建和删除设备,以及管理资源分配。
驱动程序通过安装文件(.inf文件)中PID(产品识别号)和VID(厂商识别号)识别USB设备。
2.4.3 应用程序设计
主机应用程序的编写使用VC编译环境中的API函数实现。
应用程序的编程方法与串口编程类似。首先必须查找设备,打开设备的句柄;然后进行读写和控制操作;最后是关闭设备句柄。为了提高效率,可使用多线程技术实现读写。
应用程序通过GUID(注册表驱动唯一识别号)查找驱动程序。javascript:window.open(this.src);" style="cursor:pointer;"/>
2.5 调 试
首先是固件调试,可用仿真机完成,驱动开发工具Windriver也是很好的固件调试工具,例如测试标准请求、厂商请求和管道读写。其次是驱动调试,这是USB接口开发最困难的部分,调试工具可用DriverStudio中Softice工具和文献[6]中DebugPrint跟踪工具,监视工具Bus Hound可监视USB的实际数据传输情况。需要注意的是,驱动调试必须在应用程序正确调用的前提下。
2.6 USB传输速度
主机每过1ms发出一个SOF(起始帧),四种USB传输类型都分布在1ms的帧内。所以为了提高传输速度,可加大端点缓冲区的大小和使用双缓冲(有些芯片还有四缓冲),在1ms内尽量多传输数据;采用DMA传输方式,USB设备不通过微控制器直接完成数据传输,当然相应硬件和软件开发的难度增加;如果单片机数据加载速度较慢,则可考虑使用高速指令的单片机;如果速度要求在1MB/s以上,则考虑采用USB2.0接口芯片。
本文以USB接口程序在16路温度采集系统中的应用为例,介绍了USB的接口标准和程序设计。该系统经过一段时间运行,稳定可靠,目前已广泛应用于航空电子设备的测温系统。