wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
阅读:1494回复:4

高手请进!请教fx2的同步数据采集的问题

楼主#
更多 发布于:2007-02-13 09:14
  各位大虾,本人最近研究CY7c68013做一个实时数据采集模块,跟原来的系统连接,使用的cy7c68013+fpga
     数据量是16word/ms
       配置如下:ep2  bulk out autoout=0  实现pc的命令输出,控制Fx2(已实现)
                      ep8  iso   in   autoin=0     实现同步数据采集

     fpga产生 slwr , fifoadr1\0=11,异步写,我的思路是用fpga连续写,1ms每次,fx2中设置可编程标志,当大于我设置的阈值时触发pf,我在sof中断中查询ep68fifoflg的pf标志,一旦有数就发送,并把前两个字节替换成数据包计数。
void ISR_Sof( void ) interrupt 0
{
   if((EP68FIFOFLGS&0X40))  // programable bit trigle
   {     FIFORESET=0X80;
         SYNCDELAY;    

          EP8FIFOBUF[0] = Framecnt;
          EP8FIFOBUF[1] = Framecnt;
          Framecnt++;
          //commet
          EP8BCH=0X00;
          SYNCDELAY;
          EP8BCL=0X20;
          SYNCDELAY;
         //INPKTEND=0X82;
         //SYNCDELAY;


          FIFORESET=0X08;
          SYNCDELAY;
          FIFORESET=0X00;
          SYNCDELAY;


     }
  
   EZUSB_IRQ_CLEAR( );
   USBIRQ = bmSOF;        // Clear SOF IRQ
}

    但事实是从pc上读到的数据只有包头,其他数据似乎不见了,另外还有少许丢包现象(大约1包missed/1500包),请大虾帮忙分析一下原因


  另外在程序运行时,我用示波器观察 pf输出引脚,确实每毫秒一次的高电平,但是高电平在20微秒
到120微妙之间变化
mcu_boy
bennydice
驱动牛犊
驱动牛犊
  • 注册日期2006-09-20
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望48点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-02-13 12:02
你 PC控制那块怎么做的?
我现在做的是BULK
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
板凳#
发布于:2007-02-13 13:22
控制命令通过ep2(bulk)控制fpga来开启关闭采样
fpga实现spi的数据采集控制,将采集的数据16word/ms通过ep8(slave fifo)同步传递给主机



采集部分没有问题,因为我用bulk模式调试通过了,已经能够猜到数据,现在要改成同步模式

fpga 每1ms送16word(32byte)数据给fx2, 这个时间在100uS-200uS之间

我想用同步似乎更好些
mcu_boy
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
地板#
发布于:2007-02-13 17:08
谢谢bennydice,
谁能解决以下,给点意见也行
mcu_boy
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
地下室#
发布于:2007-02-13 17:15
ep2 的bulk接受主机的命令
这是初始化代码
void TD_Init( void )
{ // Called once at startup
  
  //REVCTL=0X03;  
  SYNCDELAY;              
  CPUCS = 0x12;                 // CLKSPD[1:0]=10, for 48MHz operation
  SYNCDELAY;

  // Init port
  PORTECFG=0X00;                // Init all port E as output '1'
  SYNCDELAY;
  OEE=0xff;
  SYNCDELAY;
  IOE=0xff;
  SYNCDELAY;
  // End init port
  
  // Reset all endpoint
  FIFORESET = 0x80;             // activate NAK-ALL to avoid race conditions
  SYNCDELAY;                    // see TRM section 15.14
  FIFORESET = 0x02;             // reset, FIFO 2
  SYNCDELAY;                    //
  FIFORESET = 0x04;             // reset, FIFO 4
  SYNCDELAY;                    //
  FIFORESET = 0x06;             // reset, FIFO 6
  SYNCDELAY;                    //
  FIFORESET = 0x08;             // reset, FIFO 8
  SYNCDELAY;                    //
  FIFORESET = 0x00;             // deactivate NAK-ALL

  // Set the slave FIFO interface to 48MHz
  //IFCONFIG = 0x43;           // fx2 fifo is in iso mode
  IFCONFIG = 0xCB;             // fx2 fifo is in uniso mode  
  SYNCDELAY;

  // Set the flag of ep8's empty & full
  // The fifiafr[1:0] select the fifo
  PINFLAGSAB =0X00;             // FLAGA as Programable, FLAGB as full falg
  SYNCDELAY;                
  PINFLAGSCD =0X00;             // FLAGC as empty flag, FLAGD unused
  SYNCDELAY;
  PORTACFG |= 0x00;             // PA7/FLAGD pin is used as general io
  SYNCDELAY;
  FIFOPINPOLAR = 0x00;          // All signals active low
  SYNCDELAY;


 //modify 20070210
  // Define programable level of FIFO ep8, warning while >32B
  EP8FIFOPFH = 0XC0;
  SYNCDELAY;
  EP8FIFOPFL = 0X20;
  SYNCDELAY;
//modify 20070210 end

  // Config endpoint 2&8
  EP2CFG=0XA2;                  //DIR=OUT, TYPE=BULK, SIZE=512, BUF=2x
  SYNCDELAY;
  EP2FIFOCFG = 0X00;            // Define ep2 as unautoout mode, data width=8
  SYNCDELAY;

/*
     EP8AUTOINLENH = 0x00;   // set core AUTO commit len = 32 bytes
     SYNCDELAY;
     EP8AUTOINLENL = 0x20;
     SYNCDELAY;
*/
  // Init framenum as 0
  USBFRAMEH=0;
  SYNCDELAY;
  USBFRAMEL=0;
  SYNCDELAY;

  // Reconfig Endpoint 8
  EP8CFG=0XD2;                  //DIR=IN,  TYPE=ISO, SIZE=512, BUF=2x
  SYNCDELAY;
  EP8FIFOCFG = 0X01;            // Define ep8 as autoin=0 mode, data width=16
  SYNCDELAY;
  EP8ISOINPKTS=0X01;
  SYNCDELAY;

  // Skip the packet
  OUTPKTEND= 0X82;
  SYNCDELAY;
  OUTPKTEND= 0X82;
  SYNCDELAY;
  OUTPKTEND= 0X84;
  SYNCDELAY;
  OUTPKTEND= 0X84;
  SYNCDELAY;
  INPKTEND=0X88;
  SYNCDELAY;
    INPKTEND=0X88;
  SYNCDELAY;

  // Init the interrupt of ep2 and sof(ISO)
  EPIE=0x10;
  SYNCDELAY;
  EPIRQ =0x10;
  SYNCDELAY;

  EIE=0X01;
  SYNCDELAY;
  USBIE  |= bmSOF ;
  SYNCDELAY;
  Framecnt=0;

  // Clear usb main inttrupt and sof
  EZUSB_IRQ_CLEAR( );          
  SYNCDELAY;
  USBIRQ = bmSOF;
  SYNCDELAY;

}

ep2中断处理如下:
void ISR_Ep2inout( void ) interrupt 0
{
    BYTE i;
    BYTE count;
   // USBIE  &= ~bmSOF ;
    APTR1H = MSB( &EP2FIFOBUF );
    APTR1L = LSB( &EP2FIFOBUF );

    count = (EP2BCH << 8) + EP2BCL;
    if (count>MAX_CMD_BUFFER )
       count=MAX_CMD_BUFFER;
    
    // loop EP2OUT buffer data to EP6IN
    for( i = 0x00; i < count; i++ )
    {
         // setup to transfer EP2OUT buffer to EP6IN buffer using AUTOPOINTER(s)
        CmdBuffer=EXTAUTODAT1;
    }
    Ep2outcmd();


    EZUSB_IRQ_CLEAR( );
    SYNCDELAY;
    EPIRQ = bmBIT4;
    SYNCDELAY;
}

目前bulk已经搞定,希望给大家有所帮助

关于同步的解决方法,请大家给点意见
mcu_boy
游客

返回顶部