采用USBN9602的数据采集系统设计
初始化模块提供1个入口函数DriverEntry(),整个驱动程序的入口点为DriverEntry例程。在DriverEntry中,需要提供一个AddDe
vice例程,把驱动程序添加到驱动程序堆栈中去。另外,所有对各种IRP(I/O请求包,如:IRP_MJ_CREATE,IRP_MJ_WRITE,IRP_MJ_CLOSE,IRP_MJ_READ,IRP_MJ_DEVICE_CONTROL等)的处理例程都在此入口函数中作为定义,如:
DriverEntry(IN PDRIVER_OBJECT DriverObject,…) //驱动程序入口
{
DriverObject->DriverExtension->AddDevice=USBAddDevice;
DriverObject->DriverUnload=USBUnload;
DriverObject->MajorFunction[IRP_MJ_READ]=USBRead;
DriverObject->MajorFunction[IRP_MJ_WRITE]=USBWrite;
…
}
图2 USBN9602与89C51接口电路
即插即用管理模块用来实现USB设备的热插拔及动态配置。当硬件检测到有USB设备接入时,Windows98查找响应的驱动程序,并调用它的DriverEntry例程。PnP(即插即用)管理器调用驱动程序的AddDevice例程,告诉它添加了一个设备。在此处理过程中,驱动程序收到一个设备启动请求(IRP_MN_START_DEVICE)的IRP。同理,当要拔除时,PnP管理器会发出一个设备删除请求(IRP_MN_REMOVE_DEVICE)的IRP,由驱动程序进行处理。通过对这些PnP请求的处理,可支持设备的热插拔和即插即用功能。
电源管理模块负责设备的挂起与唤醒。
I/O功能实现模块完成I/O请求的大部分工作。若应用程序想对设备进行I/O操作,它便使用Windows API函数,对WIN32子系统进行WIN32调用。此调用由I/O系统服务接收并通知I/O管理器,I/O管理将此请求构造成一个合适的I/O请求包(IRP)并把它传递给USB设备驱动程序。USB设备驱动程序接收到这个IRP以后,根据IRP中包含的具体操作代码,构造相应的USB请求块并把此URB(USB请求块)放到一个新的IRP中。然后,把此IRP传递到USB总线驱动程序,USB总线驱动程序根据IRP中所含的URB执行相应的操作(如从USB设备读取数据等),并把操作结构通过IRP返还给USB设备驱动程序。USB设备驱动程序接收到此IRP后,将操作结果通过IRP返还给I/O管理器。最后,I/O管理器将此IRP中操作结果返还给应用程序,至此应用程序对USB设备的一次I/O操作完成。
2.3 应用程序设计
用户态的应用程序是数据采集系统的中心,其主要功能为:开启或关闭USB设备、检测USB设备、设置USB数据传输管道、设置A/D状态和数据采集端口、实时从USB接口采集数据、显示并分析数据。
由于USBN9602提供的FIFO不超过64字节,当它存满后,USBN9602自动将数据打包即时请求读入数据,由SIE自动发送数据包。另外,当系统启动A/D模块后,便会创建两个线程:采样线程和显示存盘线程。采样线程负责将采集数据写到应用程序提交的内存;而显示存盘线程负责给应用程序发送显示和存盘消息。当应用程序接收到此消息后,便从它提交的内存读取数据并显示和存盘。此处需要注意的是,采样线程和显示存盘线程在读写应用程序提交的内存时要保持同步。
3 远程数据采集系统设计
传输距离是限制USB在工业现场应用的一个障碍,
《采用USBN9602的数据采集系统设计(第2页)》