基于Spartan-6的高速数据采集、处理和实时传输研究

时间:2016-12-06来源:网络

开0号设备,

  CCyUSBEndPoint *endpt = USBDevice->EndPointOf(0X82); //使用端点2,in传输可以看到,上面的只需要3行代码,比枚举简洁方便多了。至于获取USB其他属性,这里列出经常使用的几个:(1)USBDevice->DeviceCount()//返回连接到电脑的USB设备个数,从0,1,2.开始命名(2)USBDevice->DeviceName()//返回USB设备名称,也就是固件中 StringDscr2:字段字符串。(3)USBDevice->VendorID//返回USB设备VIDUSBDevice->ProductID//返回USB设备PID。具体的可参考cyapi的文档,在CCyUSBDevice和CCyUSBEndPoint这两个类里可查询到。

  4)传输命令控制

  可以说,写USB上位机,要对固件进行自定义命令传输,通常都是用输入输出控制传输进行的,即使用控制传输in或者out方式实现对固件的自定义命令。

  (1)out控制传输发送vendor命令

  采用out方式应该比较符合大家的思维,因为是从上位机发命令到下位机,怎么看都应该是out而不是in。例如你在固件里设置了out的接收buf:

  BOOL DR_VendorCmnd(void)

  {

  switch (SETUPDAT[1])

  {

  case 0xDD:

  { temp=EP0BUF[0];

  EP0BCH=0;

  EP0BCL=1;

  EP0CS |=bmHSNAK;

  break;

  }

  default:

  return(TRUE);

  }

  return(FALSE);

  }

  在VS2008的C++/MFC中:

  CCyControlEndPoint* CtlEndpoint;//定义一个控制端点

  CtlEndpoint->Target = TGT_DEVICE;//不必关注,固定

  CtlEndpoint->ReqType = REQ_VENDOR; //请求类型:自定义请求(标准请求等)CtlEndpoint->Direction = DIR_TO_DEVICE; //传输方向:主机->usb设备(out)

  CtlEndpoint->ReqCode = 0XDD; //自定义请求码

  CtlEndpoint->Value = 0; //这里的设定值将传给setupdat的[2:3]位

  CtlEndpoint->Index = 0; //这里的设定值将传给setupdat的[4:5];PUCHAR buf=new UCHAR[1];

  ZeroMemory(buf,1);//用0填充buf区,填充大小(1字节)

  long buflen=1;//传输的其他字节数:cy控制台console中length的值。

  CtlEndpoint->XferData(buf,buflen);

  当然,没有规定说一定必须传给下位机至少一个字节的数据;你也可以不传;不过最好下位机同样设置接收字节为0,否则小心有莫名奇妙的错误(XX内存不能为只读等等)。

  将temp=EP0BUF[0];去掉,上位机:

  PUCHAR buf=new UCHAR; //用0填充buf区,填充大小(1字节)

  long buflen=0;

  CtlEndpoint->XferData(buf,buflen);

  也是可以的,另外,控制传输请尽量用同步的xferdata()而不是异步的begindataxfer()。

  (2)in控制传输发送vendor命令

  基本上,跟out区别不大。固件中:

  BOOL DR_VendorCmnd(void)

  {

  switch (SETUPDAT[1])

  {

  case 0xDD:

  {

  *EP0BUF=0XDD;

  EP0BCH=0;

  EP0BCL=1;

  EP0CS |=bmHSNAK;

  break;

  }

  default:

  return(TRUE);

  }

  return(FALSE);

  }

  VC中:CCyControlEndPoint* CtlEndpoint; //定义一个控制端点

  CtlEndpoint->Target = TGT_DEVICE;//不必关注,固定

  CtlEndpoint->ReqType= REQ_VENDOR; //请求类型:自定义请求(标准请求等)CtlEndpoint->Direction = DIR_FROM_DEVICE; //传输方向:usb设备->主机(in)CtlEndpoint->ReqCode = 0XDD; //自定义请求码CtlEndpoint->Value = 0;//这里的设定值将传给setupdat的[2:3]位CtlEndpoint->Index = 0; //这里的设定值将传给setupdat的[4:5]位PUCHAR buf=new UCHAR[1];

  ZeroMemory(buf,1); //用0填充buf区,填充大小(1字节)

  long buflen=1; //传输的其他字节数:cy控制台console中length的值CtlEndpoint->XferData(buf,buflen);这里的话,推荐尽量设置接收缓冲,不要将buflen设置为0.同样,控制传输请尽量用同步的xferdata()而不是异步的begindataxfer()。

  (3)另外,还有两个简化版本的函数Write(out传输)和Read(in传输)也可以进行控制传输。其作用同XferData()是一样的,因为已经明确表示了是in还是out,所以Direction 项的值就省略了。只是看起来代码更加简洁,输入效率更高而已。基本上,大多数时候,使用Write和Read会方便很多。

  CCyControlEndPoint* CtlEndpoint; //定义一个控制端点

  CtlEndpoint->Target = TGT_DEVICE; //不必关注,固定

  CtlEndpoint->ReqType = REQ_VENDOR; //请求类型:自定义请求(标准请求等)CtlEndpoint->ReqCode = 0XDD; //自定义请求码CtlEndpoint->Value = 0; //这里的设定值将传给setupdat的[2:3]位CtlEndpoint->Index = 0; //这里的设定值将传给setupdat的[4:5]位PUCHAR buf=new UCHAR[1];ZeroMemory(buf,1);//用0填充buf区,填充大小(1字节) long buflen=1; //传输的其他字节数:cy控制台console中length的值CtlEndpoint->Write(buf,buflen);

  Read的话同理。

1 2 3

关键词: Spartan-6高速数

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版