打印

关于xferdatadata()函数,各位大神麻烦帮帮忙

[复制链接]
6982|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Vivien_bit|  楼主 | 2012-11-1 20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人usb开发方面的菜鸟,最近负责cyusb3014的上位机编程,对于固件的配置完全不熟,这几天利用官方提供的cyusbAPI进行读写usb测试,现在遇到一个问题无法解决,想求教一下xferdata(buf,len)这个函数用于usb数据上行时len的大小有限制吗,本人利用这个函数下行数据时len大小可以从1开始,而上行时的len必须设为16384的整数倍。否则就会出错,usb control centrol显示错误代码为997
沙发
Vivien_bit|  楼主 | 2012-11-1 23:23 | 只看该作者
我可能没表达清楚,我利用usb在FPGA和上位机之间进行通信,上位机读USB的数据量不定,最少是一个字节,最多有上G的数据,但是xferdata()函数的len参数随意设置回出错,请问这是硬件配置的问题吗,可是上位机往USB写又可以随意设置,谁能解释一下呢,非常感激!!!

使用特权

评论回复
板凳
dqyubsh| | 2012-11-3 05:06 | 只看该作者
读写是不一样的,写的时候你可以控制写了多少个字节,这个没问题。读的时候,要看硬件能返回多少字节,这个由不得你。

CY把这个函数包的太严实了,搞不清下边的机理,我没敢用。你试一下有单独的read、write函数,这个会简单明晰一些。

使用特权

评论回复
地板
Vivien_bit|  楼主 | 2012-11-3 14:12 | 只看该作者
3# dqyubsh
我做过测试,FPGA持续往USB里发送一组递增的数,上位机调用xferdata()函数时,当len=1024的整数倍时可以正确读取USB数据,当len为其他的数时xferdata函数的返回值一直是false。在实际应用中,要求FPGA返回多少数上位机都能从USB里读出来,所以不知道有什么好的办法。你说的read()函数,我看了cyusb.net手册,上面介绍read()函数只在cycontrolEndPoint里,而且read()函数貌似也是调用xferdata()函数。

使用特权

评论回复
5
dqyubsh| | 2012-11-3 22:31 | 只看该作者
你把xferdata前后的程序发上来

使用特权

评论回复
6
Vivien_bit|  楼主 | 2012-11-4 13:02 | 只看该作者
5# dqyubsh
//////////////////////定义
  USBDeviceList^ user1;
  CyUSBDevice^ myDev;
  CyBulkEndPoint^ inendpoint;
  CyBulkEndPoint^ outendpoint;
  Int32  rd_bytes;
  bool success;

/////////////////////////初始化
  user1 = gcnew USBDeviceList(CyUSB::CyConst::DEVICES_CYUSB);
  myDev =dynamic_cast<CyUSBDevice^> (user1[0x04B4,0x00BC]);
  if (myDev!=nullptr)
    MessageBox::Show(L"link success");
   else
    MessageBox::Show(L"no device");
   bool blssFast = myDev->bSuperSpeed;
   bool blhsFast = myDev->bHighSpeed;   
   if(blhsFast)
   {
    textBox3->Text=L"USB is working at usb2.0 mode!";
   }
   else if (blssFast)
   {
    textBox3->Text=L"USB is working at usb3.0 mode!";}
  ////////////////////////////////////////////////////
   inendpoint=dynamic_cast<CyBulkEndPoint^>(myDev->EndPointOf(0x81));
   if((inendpoint!=nullptr)&&(inendpoint->Attributes==2))
     {
        if (textBox1->Text=="")
    {   MessageBox::Show(L"Please input the bytes you want to read");
        return;
    }
    else
    {
     rd_bytes=Convert::ToInt32(textBox1->Text);
     rd_buffer=gcnew array<unsigned char>(16384);
           
     success=inendpoint->XferData(rd_buffer,rd_bytes); }

    现象是只有rd_bytes是1024的整数倍时success=1,其他情况success都是0,会不会是因为USB3.0一次传输的最小单位是1024字节,我对固件配置不熟,不知道能不能把一次传输的数据量大小改小一些


   }

使用特权

评论回复
7
dqyubsh| | 2012-11-4 19:32 | 只看该作者
按你的说法,应该是固件凑够了1024才传上来一次。长度小于1024时,固件没传,超时死那了,返回0。

分析固件的行为,应该首先采用CyConsole(USB2.0用这个),用它读不是1024的数据长度,如果它读不出来,上层软件再忙活也白扯。如果确实是如此,就该问下固件工程师,下边是怎么工作的。

还有,cypress有c#的例子,在它的基础上改一下,如果它也不工作,说明固件不支持。

读数据的时候可以试试下面的写法,看看ret返回1还是0,实际bytes返回多少?
Long bytes = 1024 * N;
BOOL ret = XferData(buffer, &bytes);

使用特权

评论回复
8
jiadecun| | 2012-12-5 10:04 | 只看该作者
固件和app要协调工作,你只开发app又不知道固件的工作情况,这样很难找问题的,可以看看你GPIF的接口用的多大的位宽,如果是32bit那么你读取的数据必须是4byte的整数倍。

使用特权

评论回复
9
zhan819006027| | 2013-11-5 12:45 | 只看该作者
我记得 GPIF有一个PKTENDx信号线吧 这个信号可以让你的短数据包可以发送到主机啊

使用特权

评论回复
10
wodeyibayizi| | 2016-7-7 11:40 | 只看该作者
楼主,你的问题解决了吗!想和你请教一下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

4

帖子

0

粉丝