用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

基于USB2.0总线的高速数据采集系统设计

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 22:34:42
道开始进行数据采集并向FIFO写数据。

系统前端的调理电路采用的是AD公司的AD8138,该放大器具有较宽的模拟带宽(320MHz,-3dB,增益1),而且可以实现将单端输入变成差分输出的功能。此项功能在现代高速模数变换电路中非常有用,因为几乎所有的高速A/D芯片都要求模拟信号为差分输入,虽然部分芯片的手册中提到对于单端输入信号也可使用,但这样一来会使A/D转换结果的二次谐波增大,降低信噪比(SNR)。AD8138很好的解决了这个问题,用户可以很容易的将单端信号转换成差分输出而不必使用变压器,并且它的输入阻抗高达6MΩ,可以直接与输入信号相连而省略隔离放大器,大大精简了电路结构。图4为AD8138的典型应用电路。

javascript:window.open(this.src);" style="cursor:pointer;"/>

图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()两个函数。

javascript:window.open(this.src);" style="cursor:pointer;"/>

图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;
  EP8CFG = 0x00;     // EP8 not valid
  SYNCDELAY;
  
  
  FIFORESET = 0x80;  // set NAKALL bit to NAK all transfers from host
  SYNCDELAY;
  FIFORESET = 0x02;  // reset EP2 FIFO
  SYNCDELAY;
  FIFORESET = 0x00;  // clear NAKALL bit to resume normal operation
  SYNCDELAY;

  EP2FIFOCFG = 0x01; // allow core to see zero to one transition of auto out bit
  SYNCDELAY;
  EP2FIFOCFG = 0x11; // auto out mode, disable PKTEND zero length send, word ops
  SYNCDELAY;
  EP6FIFOCFG = 0x09; // auto in mode, disable PKTEND zero length send, word ops
  SYNCDELAY; 
  
  GpifInit (); // initialize GPIF registers
  
  SYNCDELAY;
  EP2GPIFFLGSEL = 0x02; // For EP2IN, GPIF uses FF flag
  SYNCDELAY;
  
  // global flowstate register initializations

FLOWLOGIC = FlowStates[19];      // 0011 0110b - LFUNC[1:0] = 00 (A AND B), //TERMA/B[2:0]=110 (FIFO Flag)
  SYNCDELAY;
  FLOWSTB = FlowStates[23];        // 0000 0100b - MSTB[2:0] = 100 (CTL4), not //used as strobe
  SYNCDELAY;
  GPIFHOLDAMOUNT = FlowStates[26]; // hold data for one half clock (10ns) assuming //48MHz IFCLK
  SYNCDELAY;
  FLOWSTBEDGE = FlowStates[24];    // move data on both edges of clock
  SYNCDELAY;
  FLOWSTBHPERIOD = FlowStates[25]; // 20.83ns half period
  SYNCDELAY;  

  // reset the external FIFO
  OEA = 0x07;     // turn on PA0、 PA1、 PA2 as output pin
  IOA = 0x07;     // pull PA0、 PA1、 PA2 high initially
  IOA &= 0xFB;     // bring PA2 low
  EZUSB_Delay (1); // keep PA2 low for ~1ms, more than enough time
  IOA = 0x04;     // bring PA2 high and exit reset
IOA &= 0xFC;     // bring PA0、 PA1 low and enable AD
  
}
在TD_Poll()中主要完成外部FIFO状态的检测和数据的传输,主要程序部分如下:
void TD_Poll(void)
{
    if ( GPIFTRIG & 0x80 )                  // if GPIF interface IDLE
    { 
      if ( EXTFIFONOTEMPTY )                // if external FIFO is not empty
      {
        if ( !( EP24FIFOFLGS & 0x01 ) )     // if EP2 FIFO is not full
        {      
          if(enum_high_speed)
          {
            SYNCDELAY;    
            GPIFTCB1 = 0x02;                // setup transaction count (1024 //bytes/2 for word wide -> 0x0100)
            SYNCDELAY;
            GPIFTCB0 = 0x00;
            SYNCDELAY;
          }
          else
          {
            SYNCDELAY;
            GPIFTCB1 = 0x00;                // setup transa

上一页  [1] [2] [3]  下一页

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:1,156.25000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号