打印

大小有限制吗

[复制链接]
980|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houcs|  楼主 | 2017-8-13 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
cyusb3014的上位机编程,对于固件的配置完全不熟,这几天利用官方提供的cyusbAPI进行读写usb测试,现在遇到一个问题无法解决,想求教一下xferdata(buf,len)这个函数用于usb数据上行时len的大小有限制吗
沙发
stly| | 2017-8-13 15:32 | 只看该作者

你是怎么用的

使用特权

评论回复
板凳
houcs|  楼主 | 2017-8-13 15:35 | 只看该作者
本人利用这个函数下行数据时len大小可以从1开始,而上行时的len必须设为16384的整数倍。否则就会出错

使用特权

评论回复
地板
liuzaiy| | 2017-8-13 16:34 | 只看该作者

错误代码是啥

使用特权

评论回复
5
houcs|  楼主 | 2017-8-13 16:50 | 只看该作者
usb control centrol显示错误代码为997

使用特权

评论回复
6
pangb| | 2017-8-13 16:52 | 只看该作者

没太看明白

使用特权

评论回复
7
houcs|  楼主 | 2017-8-13 16:54 | 只看该作者

我可能没表达清楚,我利用usb在FPGA和上位机之间进行通信,上位机读USB的数据量不定,最少是一个字节,最多有上G的数据,但是xferdata()函数的len参数随意设置回出错,请问这是硬件配置的问题吗

使用特权

评论回复
8
houcs|  楼主 | 2017-8-13 16:56 | 只看该作者

可是上位机往USB写又可以随意设置,谁能解释一下

使用特权

评论回复
9
ousj| | 2017-8-13 16:58 | 只看该作者

读写是不一样的,写的时候你可以控制写了多少个字节

使用特权

评论回复
10
ousj| | 2017-8-13 19:47 | 只看该作者
读写是不一样的,写的时候你可以控制写了多少个字节

使用特权

评论回复
11
morrisk| | 2017-8-13 19:49 | 只看该作者
这个没问题。读的时候,要看硬件能返回多少字节,这个由不得你。

使用特权

评论回复
12
zyf部长| | 2017-8-13 19:50 | 只看该作者
CY把这个函数包的太严实了,搞不清下边的机理,我没敢用。

使用特权

评论回复
13
houcs|  楼主 | 2017-8-13 19:53 | 只看该作者
我做过测试,FPGA持续往USB里发送一组递增的数,上位机调用xferdata()函数时,当len=1024的整数倍时可以正确读取USB数据,当len为其他的数时xferdata函数的返回值一直是false。

使用特权

评论回复
14
houcs|  楼主 | 2017-8-13 19:54 | 只看该作者
在实际应用中,要求FPGA返回多少数上位机都能从USB里读出来,所以不知道有什么好的办法。

使用特权

评论回复
15
zyf部长| | 2017-8-13 20:01 | 只看该作者
你说的read()函数,我看了cyusb.net手册,上面介绍read()函数只在cycontrolEndPoint里,而且read()函数貌似也是调用xferdata()函数。

使用特权

评论回复
16
xxmmi| | 2017-8-13 20:08 | 只看该作者

你把xferdata前后的程序发上来

使用特权

评论回复
17
houcs|  楼主 | 2017-8-13 20:12 | 只看该作者

//////////////////////定义
  USBDeviceList^ user1;
  CyUSBDevice^ myDev;
  CyBulkEndPoint^ inendpoint;
  CyBulkEndPoint^ outendpoint;
  Int32  rd_bytes;
  bool success;

/////////////////////////初始化
  user1 = gcnew USBDeviceList(CyUSB::CyConst:EVICES_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"lease 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字节,我对固件配置不熟,不知道能不能把一次传输的数据量大小改小一些

使用特权

评论回复
18
kangzj| | 2017-8-13 20:16 | 只看该作者
按你的说法,应该是固件凑够了1024才传上来一次。长度小于1024时,固件没传,超时死那了,返回0。

使用特权

评论回复
19
zwll| | 2017-8-13 20:20 | 只看该作者
分析固件的行为,应该首先采用CyConsole(USB2.0用这个),用它读不是1024的数据长度,如果它读不出来,上层软件再忙活也白扯。如果确实是如此,就该问下固件工程师,下边是怎么工作的。

使用特权

评论回复
20
chuxh| | 2017-8-13 20:27 | 只看该作者
cypress有c#的例子,在它的基础上改一下,如果它也不工作,说明固件不支持。

使用特权

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

本版积分规则

743

主题

8382

帖子

5

粉丝