新聞中心

EEPW首頁 > 電源與新能源 > 設計應用 > 基于Spartan-6的高速數(shù)據(jù)采集、處理和實時傳輸研究

基于Spartan-6的高速數(shù)據(jù)采集、處理和實時傳輸研究

作者: 時間:2016-12-06 來源:網(wǎng)絡 收藏

開0號設備,

本文引用地址:http://m.butianyuan.cn/article/201612/326826.htm

  CCyUSBEndPoint *endpt = USBDevice->EndPointOf(0X82); //使用端點2,in傳輸可以看到,上面的只需要3行代碼,比枚舉簡潔方便多了。至于獲取USB其他屬性,這里列出經(jīng)常使用的幾個:(1)USBDevice->DeviceCount()//返回連接到電腦的USB設備個數(shù),從0,1,2.開始命名(2)USBDevice->DeviceName()//返回USB設備名稱,也就是固件中 StringDscr2:字段字符串。(3)USBDevice->VendorID//返回USB設備VIDUSBDevice->ProductID//返回USB設備PID。具體的可參考cyapi的文檔,在CCyUSBDevice和CCyUSBEndPoint這兩個類里可查詢到。

  4)傳輸命令控制

  可以說,寫USB上位機,要對固件進行自定義命令傳輸,通常都是用輸入輸出控制傳輸進行的,即使用控制傳輸in或者out方式實現(xiàn)對固件的自定義命令。

  (1)out控制傳輸發(fā)送vendor命令

  采用out方式應該比較符合大家的思維,因為是從上位機發(fā)命令到下位機,怎么看都應該是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區(qū),填充大小(1字節(jié))

  long buflen=1;//傳輸?shù)钠渌止?jié)數(shù):cy控制臺console中l(wèi)ength的值。

  CtlEndpoint->XferData(buf,buflen);

  當然,沒有規(guī)定說一定必須傳給下位機至少一個字節(jié)的數(shù)據(jù);你也可以不傳;不過最好下位機同樣設置接收字節(jié)為0,否則小心有莫名奇妙的錯誤(XX內存不能為只讀等等)。

  將temp=EP0BUF[0];去掉,上位機:

  PUCHAR buf=new UCHAR; //用0填充buf區(qū),填充大小(1字節(jié))

  long buflen=0;

  CtlEndpoint->XferData(buf,buflen);

  也是可以的,另外,控制傳輸請盡量用同步的xferdata()而不是異步的begindataxfer()。

  (2)in控制傳輸發(fā)送vendor命令

  基本上,跟out區(qū)別不大。固件中:

  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區(qū),填充大小(1字節(jié))

  long buflen=1; //傳輸?shù)钠渌止?jié)數(shù):cy控制臺console中l(wèi)ength的值CtlEndpoint->XferData(buf,buflen);這里的話,推薦盡量設置接收緩沖,不要將buflen設置為0.同樣,控制傳輸請盡量用同步的xferdata()而不是異步的begindataxfer()。

  (3)另外,還有兩個簡化版本的函數(shù)Write(out傳輸)和Read(in傳輸)也可以進行控制傳輸。其作用同XferData()是一樣的,因為已經(jīng)明確表示了是in還是out,所以Direction 項的值就省略了。只是看起來代碼更加簡潔,輸入效率更高而已。基本上,大多數(shù)時候,使用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區(qū),填充大小(1字節(jié)) long buflen=1; //傳輸?shù)钠渌止?jié)數(shù):cy控制臺console中l(wèi)ength的值CtlEndpoint->Write(buf,buflen);

  Read的話同理。


上一頁 1 2 3 下一頁

評論


相關推薦

技術專區(qū)

關閉