新聞中心

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

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

        作者: 時間:2016-12-06 來源:網絡 收藏

        開0號設備,

        本文引用地址:http://www.104case.com/article/201612/326826.htm

          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高速數

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 惠来县| 景东| 黔东| 淮北市| 南城县| 会泽县| 漯河市| 大同县| 长武县| 肥西县| 谢通门县| 磐安县| 蓬安县| 邛崃市| 霍城县| 南昌县| 南雄市| 吉隆县| 鄂尔多斯市| 惠州市| 华蓥市| 玛曲县| 门源| 嘉黎县| 镇康县| 淳化县| 洪江市| 福清市| 兰西县| 上虞市| 敖汉旗| 德江县| 长兴县| 隆林| 新化县| 河北省| 衡阳县| 霍林郭勒市| 富川| 长治市| 上犹县|