微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > 利用USB2.0技术的高速双路数据采集系统

利用USB2.0技术的高速双路数据采集系统

时间:03-05 来源:互联网 点击:

MAX1195的两路输入信号是同时被采样的,十六位的数据输出总线使两路数据可以同时输出,分别占八位,即:D0A~D7A和D0B~D7B;SN74V235输入为18位,根据CMOS技术的要求,将未使用的D16和D17引脚接地。MAX1195采集到的数据首先送进FIFO里, FIFO的写时钟(WCLK)和AD的转换时钟反相,这样可以充分满足MAX1195输出数据的建立时间,避免发生数据丢失或者数据重复写入现象。 SN74V235的 (Programmable Almost Full)可编程几乎满信号经74LVC04反相后接MAX1195的Sleep和 引脚,以免FIFO发生溢出而丢失数据。SN74V235的数据输出引脚Q0~Q15与CY7C68013的GPIF模式下的数据线FD[15:0]即端口B和端口D组成的十六位数据总线相连,数据SN74V235到EZ-USB FX2的时序过程由CY7C68013的GPIF 控制。FX2采用了“量子FIFO”结构,在FX2里面,数据可以分为两个域:USB域和GPIF接口域。这两个域是独立的,允许分别使用不同的时钟和逻辑控制数据的传输,USB域是由SIE控制的,SIE通过USB口接收或者发送端点FIFO的数据。FX2的“量子FIFO”能够几乎不花时间在这两个数据域中的转移数据,因为这两个域用的FIFO在物理上是同一个。所以根据“量子FIFO”原理,实际上数据已经存在于属于USB域的端点FIFO里面了,采用USB的BULK传输方式,使该数据完全不经过低频CPU干预,而是采用FX2提供的AutoIn模式,即一旦FX2端点缓冲区的数据达到指定字节数,数据将自动被打包从USB口上传到主机。

3.3 GPIF波形及程序介绍:

GPIF是FX2的端点FIFO的片内控制器,可以完全代替片外的控制器而实现FX2与外围FIFO的“无胶”连接。GPIF的核心是一个可编程状态机,可以产生六个“控制”(CTL)和九个“地址”(GPIFADR[8:0])信号,可以接收六个外部(RDY)“准备好”输入,八位或者十六位数据总线,时钟可以用FX2的IFCLK,也可以由外围提供。本文GPIF接口的详细硬件连接如图2所示。

  图2 GPIF与SN74V235详细连接图

GPIF状态机可以定义四个波形描述符,一般情况下是:FIFO读,FIFO写,单字/字节读,单字/字节写。Cypress提供了图形化的波形描述工具GPIF Designer,用户只需要给出GPIF波形,GPIF Designer会自动生成C语言的波形代码Gpif.c,可以直接链接到用户的固件程序中。本文中用到了FIFORd描述符,波形如图3所示。

  图3 GPIF Designer设计的 FIFORd波形

4.系统软件编写

系统软件主要包括三个部分:下位机CY7C68013的固件,USB驱动程序和上位机主机应用程序。

4.1 固件程序编写

对于下位机CY7C68013的固件编写,Cypress公司给出了在Keil C51下的固件程序框架,固件框架完成EZ-USB FX2的初始化、USB标准设备请求处理、USB挂起模式下的电源管理服务和USB中断处理。Cypress还提供了函数钩子来加速用户代码的添加。用户只需要简单地提供一个USB描述符表和执行外围功能的代码即可。

4.2 驱动程序编写

Windows系统下的USB驱动包括三层,从高到低依次是:USB客户端设备驱动(USB Client Device Driver)、USB总线驱动(USB Hub(Bus) Driver)、主机控制器驱动(Host Controller Driver)。后两者由Windows系统提供,用户只需要开发USB客户端设备驱动程序,Cypress公司提供了一个通用的驱动程序 (General Purpose Driver),即ezusb.sys,一般情况下,该驱动程序可以满足FX2开发者的需要。本文使用了Cypress公司的通用驱动 ezusb.sys。为了使用ezusb.sys,用户必须编写对应的inf文件,inf文件将特定的USB设备绑定给相应的驱动程序,该inf文件参照 ezusbw2k.inf编写。

4.3 主机应用程序编写

通用驱动程序GPD即ezusb.sys提供了基本USB设备请求和数据传输的用户模式接口,用户模式应用程序通过Win32函数 DeviceIoControl()给设备驱动器发送请求。Ezusb.sys提供了基本设备请求、批量读写、同步读写等一系列IOCTL函数。这里以 IOCTL_EZUSB_BULK_READ(EZUSB批量传输)为例加以介绍。

批量传输模式下读FX2的端点FIFO的关键代码如下:

DWORD ioctl_val=IOCTL_EZUSB_BULK_READ; //设置从设备中读数据

Bresult=DeviceIoControl ( hDevice , ioctl_val , //从设备读数据

bulkControl , //端点号

sizeof ( BULK_TRANSFER_CONTROL), //传入参数的大小

buffer , //读数据的缓冲区

length , //读数据的长度

(unsigned long *)nBytes , //驱动返回的数据的实际长度

NULL);

限于篇幅,其他程序代码从略。

6.结束语

本文的创新点是充分发挥了CY7C68013的优势,利用FX2的内部可编程状态机GPIF实现了与外围FIFO“无胶”连接,避免了使用外围ASIC或者CPLD、FPGA等的麻烦,系统升级方便。整个电路结构紧

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top