阅读:1495回复:4
高手请进!请教fx2的同步数据采集的问题
各位大虾,本人最近研究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微妙之间变化 |
|
|
沙发#
发布于:2007-02-13 12:02
你 PC控制那块怎么做的?
我现在做的是BULK |
|
板凳#
发布于:2007-02-13 13:22
控制命令通过ep2(bulk)控制fpga来开启关闭采样
fpga实现spi的数据采集控制,将采集的数据16word/ms通过ep8(slave fifo)同步传递给主机 采集部分没有问题,因为我用bulk模式调试通过了,已经能够猜到数据,现在要改成同步模式 fpga 每1ms送16word(32byte)数据给fx2, 这个时间在100uS-200uS之间 我想用同步似乎更好些 |
|
|
地板#
发布于:2007-02-13 17:08
谢谢bennydice,
谁能解决以下,给点意见也行 |
|
|
地下室#
发布于: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已经搞定,希望给大家有所帮助 关于同步的解决方法,请大家给点意见 |
|
|