kevinqiu
驱动牛犊
驱动牛犊
  • 注册日期2005-09-07
  • 最后登录2008-02-01
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:2155回复:5

slave fifo 接收数据问题

楼主#
更多 发布于:2008-01-23 11:38
各位大侠,本人接触USB不长, 在接收数据的时候有些问题请教下大家
我的数据源是一个27M时钟,一个ENABLE线,8位数据线, ENABLE高电平时数据采集有效
FIFOADR[1:0]和SLCS引脚我都接为地, 使用EP2, SLOE和PKTENKD引脚我接为高电平, ENABLE与SLWR引脚接上, 在硬件上我只使用EP2来接收数据.
68013的程序设计如下:
SYNCDELAY;
REVCTL = 0x03;
SYNCDELAY;

IFCONFIG = 0x03;

EP2FIFOCFG = 0x08;

EP2CFG = 0xE8;      // size 1024
EP4CFG = 0x00; // EP4 not valid
EP6CFG = 0x00; // EP6 not valid
EP8CFG = 0x00; // EP8 not valid

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;

PINFLAGSAB = 0x00;
SYNCDELAY;
PINFLAGSCD = 0x00;
SYNCDELAY;
FIFOPINPOLAR = 0x04;
SYNCDELAY;
EP2AUTOINLENH = 0x03;
SYNCDELAY;
EP2AUTOINLENL = 0xAC;
SYNCDELAY;
EP2FIFOPFH = 0x82;
SYNCDELAY;
EP2FIFOPFL = 0x00;
SYNCDELAY;

我在PC端VC接收代码部分如下:
UINT ReadThreadLoop( LPVOID params )
{     //线程处理
     bool okin;
CSJCJVCDlg *dlg = (CSJCJVCDlg *) params;
     CCyBulkEndPoint* BulkIn = NULL;
     OVERLAPPED inOvLap;
     PUCHAR inData = new UCHAR[1024];          //数据缓冲区
     ZeroMemory(inData,1024);
     inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
//     dlg->InEndpt->TimeOut = 0;
     dlg->USBDevice->BulkInEn dPt->TimeOut = 0;

     int nCount = dlg->USBDevice->EndPointCount();
     for(int i=1; i<nCount; i++)
     {
           int bIn = dlg->USBDevice->EndPoints->Address & 0x82;
           if(!bIn)
           {
                continue;
           }
           else
           {
                BulkIn = (CCyBulkEndPoint*)dlg->USBDevice->EndPoints;
           }
     }
     for (;dlg->ReadThreadLooping ;)          //循环
     {
           LONG inlen=1024;

           UCHAR *inContext = BulkIn->BeginDataXfer(inData,inlen,&inOvLap);
           BulkIn->WaitForXfer(&inOvLap,100);
           okin = BulkIn->FinishDataXfer(inData,inlen, &inOvLap,inContext);
          //异步读数据
//            UCHAR *inContext = dlg->USBDevice->BulkInEndPt->BeginDataXfer(inData,i nlen,&inOvLap);
//         &nbs p;dlg->USBDevice->BulkInEndPt->WaitForXfer(&inOvLap ,100);
//            okin = dlg->USBDevice->BulkInEndPt->FinishDataXfer(inData, inlen, &inOvLap,inContext);

           if (okin)                              //如果读取成功,则保存数据
           {
                mFile.SeekToEnd();
                mFile.Write(inData,inlen);
           }
     }
CloseHandle(inOvLap.hEvent);

     delete [] inData;
     dlg->ReadThread = NULL; //线程结束

// dlg->USBDevice->Close();               //关闭USB设备
     mFile.Flush();                              //关闭文件
     mFile.Close();
     return true;
}

现在接收下来的数据发现有数据丢失, 请问各位大侠是不是我设置有问题??
kevinqiu
驱动牛犊
驱动牛犊
  • 注册日期2005-09-07
  • 最后登录2008-02-01
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-23 16:23
没人回答吗??自己顶下
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-25 11:17
BulkIn->WaitForXfer(&inOvLap,100);
上面这句是延时100us?还是什么意思?
我觉得应该用GetOverlappedResult();
另外你应该多发几个读请求下去排队,每收回一个就再发一个下去,这样能保证最快的读取速度
kevinqiu
驱动牛犊
驱动牛犊
  • 注册日期2005-09-07
  • 最后登录2008-02-01
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-01-25 12:15
Thanks,jinghuiren
BeginDataXfer/WaitForXfer/FinishDataXfer是cyusb的一部读取流程, 100是指超时时间, 如果使用GetOverlappedResult(),那怎么实现??
多发几个读请求下去排队,这是怎么实现,要改驱动吗??
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-01-28 10:46
你用的Cyusb提供的驱动和库函数吗?每次提交要求获得的数据是多少?32K?64K?(我刚又看了一下,你读取的是1K)
你做如下的测试:
1,每次读取1K数据,连续循环读取直到读取一定量的数据(比如1M),和原始数据比较看丢失了多少数据
2,每次读取32K,同上
3,每次读取64K,同上
如果结果是1,2,3丢失的数据依次减少,就说明数据丢失发生在两个读取数据命令之间的间隙。那就需要请求排队来填补这个间隙。如下实现:
1,首先发送两个读取数据命令下去,分别是1号命令和2号命令,这个需要驱动程序的支持,如果不支持这样就会有问题
2,用你那个等待函数等待1号命令的返回,返回后立刻再将1号命令发下去,然后再作保存返回的数据之类的操作
3。等待2号命令的返回,返回后同样操作,这样就可以始终保证有一个命令在等待读取数据。
如果上述方法不行,可以多发几个,比如4个,在不行那就可能要改驱动,比较麻烦了。

注意:每个读取数据命令,不管读取多少数据,从发送命令到返回需要大约0.1ms-0.2ms的时间,如果在这段时间内你的数据把2048的端点空间填满了,那么多余的数据就丢失了。
kevinqiu
驱动牛犊
驱动牛犊
  • 注册日期2005-09-07
  • 最后登录2008-02-01
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-02-01 10:31
jinghuiren
Thanks
虽然还有问题, 总算有点入门
游客

返回顶部