大小有限制吗

[复制链接]
1792|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 | 显示全部楼层

错误代码是啥
 楼主| houcs 发表于 2017-8-13 16:50 | 显示全部楼层
usb control centrol显示错误代码为997
pangb 发表于 2017-8-13 16:52 | 显示全部楼层

没太看明白
 楼主| houcs 发表于 2017-8-13 16:54 | 显示全部楼层

我可能没表达清楚,我利用usb在FPGA和上位机之间进行通信,上位机读USB的数据量不定,最少是一个字节,最多有上G的数据,但是xferdata()函数的len参数随意设置回出错,请问这是硬件配置的问题吗
 楼主| houcs 发表于 2017-8-13 16:56 | 显示全部楼层

可是上位机往USB写又可以随意设置,谁能解释一下
ousj 发表于 2017-8-13 16:58 | 显示全部楼层

读写是不一样的,写的时候你可以控制写了多少个字节
ousj 发表于 2017-8-13 19:47 | 显示全部楼层
读写是不一样的,写的时候你可以控制写了多少个字节
morrisk 发表于 2017-8-13 19:49 | 显示全部楼层
这个没问题。读的时候,要看硬件能返回多少字节,这个由不得你。
zyf部长 发表于 2017-8-13 19:50 | 显示全部楼层
CY把这个函数包的太严实了,搞不清下边的机理,我没敢用。
 楼主| houcs 发表于 2017-8-13 19:53 | 显示全部楼层
我做过测试,FPGA持续往USB里发送一组递增的数,上位机调用xferdata()函数时,当len=1024的整数倍时可以正确读取USB数据,当len为其他的数时xferdata函数的返回值一直是false。
 楼主| houcs 发表于 2017-8-13 19:54 | 显示全部楼层
在实际应用中,要求FPGA返回多少数上位机都能从USB里读出来,所以不知道有什么好的办法。
zyf部长 发表于 2017-8-13 20:01 | 显示全部楼层
你说的read()函数,我看了cyusb.net手册,上面介绍read()函数只在cycontrolEndPoint里,而且read()函数貌似也是调用xferdata()函数。
xxmmi 发表于 2017-8-13 20:08 | 显示全部楼层

你把xferdata前后的程序发上来
 楼主| 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字节,我对固件配置不熟,不知道能不能把一次传输的数据量大小改小一些
kangzj 发表于 2017-8-13 20:16 | 显示全部楼层
按你的说法,应该是固件凑够了1024才传上来一次。长度小于1024时,固件没传,超时死那了,返回0。
zwll 发表于 2017-8-13 20:20 | 显示全部楼层
分析固件的行为,应该首先采用CyConsole(USB2.0用这个),用它读不是1024的数据长度,如果它读不出来,上层软件再忙活也白扯。如果确实是如此,就该问下固件工程师,下边是怎么工作的。
chuxh 发表于 2017-8-13 20:27 | 显示全部楼层
cypress有c#的例子,在它的基础上改一下,如果它也不工作,说明固件不支持。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

743

主题

8382

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部