基于USB2.0总线的高速数据采集系统设计
38的典型应用电路。
3.1 Windows驱动程序设计
USB设备驱动程序基于WDM。WDM型驱动程序是内核程序,与标准的Win32用户态程序不同。采用了分层处理的方法。通过它,用户不需要直接与硬件打它道(在USB驱动程序中尤为明显),只需通过下层驱动程序提供的接口号访问硬件。因此,USB设备驱动程序不必具体对硬件编程,所有的USB命令、读写操作通过总线驱动程序转给USB设备。但是,USB设备驱动程序必须定义与外部设备的通讯接口和通讯的数据格式,也必须定义与应用程序的接口。
Cypress公司提供了完整的CY7C68013驱动程序源码、控制面板程序及固件的框架,这大大提高了用户开发的进度。用户只需稍加修改或不需任何修改即可使用所带驱动程序,软件开发者大量的时间主要集中在应用程序和固件的开发。本文所述的数据采集系统驱动程序就在原来的基础上进行了简单的修改来满足我们的需要。根据我们自己的需求,一般只需修改DeviceIoControl例程,如我们主要增加了控制数据传输函数、启动和停止AD、复位FIFO等,即IOCTL_START_AD、IOCTL_STOP_AD、IOCTL_RESET_FIFO。
3.2 底层固件设计
要实现USB2.0的高带宽数据传输,必须使用它特有的GPIF特性,在开发固件前,首先必须根据实际需要对GPIF waveform进行编辑。CY7C68013开发工具中带有一个GPIF Designer,如图5所示,编辑完waveform后,选择Tools->Export to GPIF.c File来输出GPIF.c文件,然后将该文件加入keil c工程进行编译。
由于CY7C68013的EP2、EP4、EP6、EP8四个端点共享4K FIFO缓冲区,所以在该系统中,我们将EP2配置成4K的缓冲区,并设置为IN。用EP1OUT作为AD的控制参数传递,如启动和停止AD数据输出、复位FIFO等。在固件程序中,最重要的就是TD_Init()和TD_Poll()两个函数。
本文链接地址:http://www.oyaya.net/fanwen/view/167695.html
图4 AD8138典型应用电路
3  
; 软件设计
3.1 Windows驱动程序设计
USB设备驱动程序基于WDM。WDM型驱动程序是内核程序,与标准的Win32用户态程序不同。采用了分层处理的方法。通过它,用户不需要直接与硬件打它道(在USB驱动程序中尤为明显),只需通过下层驱动程序提供的接口号访问硬件。因此,USB设备驱动程序不必具体对硬件编程,所有的USB命令、读写操作通过总线驱动程序转给USB设备。但是,USB设备驱动程序必须定义与外部设备的通讯接口和通讯的数据格式,也必须定义与应用程序的接口。
Cypress公司提供了完整的CY7C68013驱动程序源码、控制面板程序及固件的框架,这大大提高了用户开发的进度。用户只需稍加修改或不需任何修改即可使用所带驱动程序,软件开发者大量的时间主要集中在应用程序和固件的开发。本文所述的数据采集系统驱动程序就在原来的基础上进行了简单的修改来满足我们的需要。根据我们自己的需求,一般只需修改DeviceIoControl例程,如我们主要增加了控制数据传输函数、启动和停止AD、复位FIFO等,即IOCTL_START_AD、IOCTL_STOP_AD、IOCTL_RESET_FIFO。
3.2 底层固件设计
要实现USB2.0的高带宽数据传输,必须使用它特有的GPIF特性,在开发固件前,首先必须根据实际需要对GPIF waveform进行编辑。CY7C68013开发工具中带有一个GPIF Designer,如图5所示,编辑完waveform后,选择Tools->Export to GPIF.c File来输出GPIF.c文件,然后将该文件加入keil c工程进行编译。
由于CY7C68013的EP2、EP4、EP6、EP8四个端点共享4K FIFO缓冲区,所以在该系统中,我们将EP2配置成4K的缓冲区,并设置为IN。用EP1OUT作为AD的控制参数传递,如启动和停止AD数据输出、复位FIFO等。在固件程序中,最重要的就是TD_Init()和TD_Poll()两个函数。
图5 GPIF Designer
在TD_Init()中主要完成GPIF相应寄存器的初始化,如下:
void TD_Init(void) // Called once at startup
{
// set the CPU clock to 48MHz
CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1);
SYNCDELAY;
EP2CFG = 0XE8; // EP2IN, bulk, size 1024, 4x buffered
SYNCDELAY;
EP4CFG = 0x00; // EP4 not valid
SYNCDELAY;
EP6CFG = 0x00; // EP6 not valid
SYNCDELAY;