阅读:2400回复:1
BULK数据传输数据老是错位
硬件采用CPLD+68013。用SLAVE FIFO模式。我要采集的是每一帧5120个数据。
在调试过程中,上位机VC++测试程序偶尔运行,偶尔无法正常运行。 一、VC++测试程序不正常时候出现的是:内存不能为“read”错误。无法正常运行VC++测试程序. 二、VC++测试程序正常运行的时候也要出问题:长时间的将每帧数据都写入到EXCEL文件中,我比较了连续采集的一千多个文件。我在测试的时候,每一帧的起始数据都给强制写0,末尾数据写F。但第一帧压根找不到这两个数据。在后面的数据中会出现这2个数据,但不会在起始与末尾。且数据会开始错位前移。 不知为什么,请教! VC++程序部分如下: USBDevice->BulkInEndPt->TimeOut=0; inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN"); UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(pRec, 5120, &inOvLap); USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,600); USBDevice->BulkInEndPt->FinishDataXfer(pRec,num_read, &inOvLap,inContext); CloseHandle(inOvLap.hEvent); 固件程序如下(我采用AUTOIN=1模式): void TD_Init( void ) { BREAKPT&=~bmBPEN; Rwuen = TRUE; CPUCS = 0x12; // CLKSPD[1:0]=10, for 48MHz operatio,clkoe(cpucs[1]=1),Enable clkout IFCONFIG = 0xEB; //IFCONFIG[7]=1,内部时钟,IFCONFIG[6]=1,48MHZ;IFCONFIG[5]=1,IFCLKOE引脚输出使能 //IFCONFIG[4]=0,IFclk信号不反向;IFCONFIG[3]=1,异步; //IFCONFIG[2]=0,GSTATE状态;IFCONFIG[1:0]=11,SLAVE FIFO 工作模式 REVCTL=0x03; SYNCDELAY; EP6CFG=0xE0; SYNCDELAY; 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 SYNCDELAY; EP6FIFOCFG = 0x09; // AUTOIN=1, ZEROLENIN=0, WORDWIDE=1 PINFLAGSAB = 0x00; // 定义FLAGA为可编程标志,FLAGB为FIFO满标志, SYNCDELAY; PINFLAGSCD = 0x00; // 定义FLAGC为FIFO空标志 PORTACFG = 0x40; // PA7,PORTACFG[7]=0;PORTACFG[6]=1,slcs=1;PORTACFG[1:0]=00,INT1:0=00 FIFOPINPOLAR = 0x00; // all signals active low SYNCDELAY; EP6AUTOINLENH=0x02; // SYNCDELAY; EP6AUTOINLENL=0x00; //端点EP6包长度为512个字节 SYNCDELAY; EP6FIFOPFH=0x82; //这里的含义不是很明白 SYNCDELAY; EP6FIFOPFL=0x00; SYNCDELAY; EP6BCL = 0x00; SYNCDELAY; EP6BCH = 0x20; SYNCDELAY; OEE=0xff; //打开PORTE的输出缓冲区 OEC=0xff; //打开PORTC的输出缓冲区 SYNCDELAY; IOE=0x00; //使端口E区输出为0 IOC=0x00; //使端口c输出为0 SYNCDELAY; AUTOPTRSETUP |= 0x07; } |
|
沙发#
发布于:2009-03-19 21:14
仙子啊基本解决了原来的问题,这里我用在第5119个数据通过CPLD嵌入0XFF的结束表征标签。了现将代码贴出如下。希望大家交流,提出更好的方法:
USBDevice->BulkInEndPt->TimeOut=0; inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN"); UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(pRec, 5120, &inOvLap); USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,600); USBDevice->BulkInEndPt->FinishDataXfer(pRec,num_read, &inOvLap,inContext); CloseHandle(inOvLap.hEvent); if((pRec[5119]&0xf0)!=0xf0) { num_read=512; inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN"); UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(pRec, num_read, &inOvLap); USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100); USBDevice->BulkInEndPt->FinishDataXfer(pRec,num_read, &inOvLap,inContext); CloseHandle(inOvLap.hEvent); return false; } return true; |
|