bsu_bsu
驱动牛犊
驱动牛犊
  • 注册日期2008-10-13
  • 最后登录2009-04-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望45点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2400回复:1

BULK数据传输数据老是错位

楼主#
更多 发布于:2009-01-05 22:09
硬件采用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;
}
bsu_bsu
驱动牛犊
驱动牛犊
  • 注册日期2008-10-13
  • 最后登录2009-04-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望45点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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;
游客

返回顶部