基于Spartan-6的高速數據采集、處理和實(shí)時(shí)傳輸研究
開(kāi)0號設備,
本文引用地址:http://dyxdggzs.com/article/201612/326826.htmCCyUSBEndPoint *endpt = USBDevice->EndPointOf(0X82); //使用端點(diǎn)2,in傳輸可以看到,上面的只需要3行代碼,比枚舉簡(jiǎn)潔方便多了。至于獲取USB其他屬性,這里列出經(jīng)常使用的幾個(gè):(1)USBDevice->DeviceCount()//返回連接到電腦的USB設備個(gè)數,從0,1,2.開(kāi)始命名(2)USBDevice->DeviceName()//返回USB設備名稱(chēng),也就是固件中 StringDscr2:字段字符串。(3)USBDevice->VendorID//返回USB設備VIDUSBDevice->ProductID//返回USB設備PID。具體的可參考cyapi的文檔,在CCyUSBDevice和CCyUSBEndPoint這兩個(gè)類(lèi)里可查詢(xún)到。
4)傳輸命令控制
可以說(shuō),寫(xiě)USB上位機,要對固件進(jìn)行自定義命令傳輸,通常都是用輸入輸出控制傳輸進(jìn)行的,即使用控制傳輸in或者out方式實(shí)現對固件的自定義命令。
(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;//定義一個(gè)控制端點(diǎn)
CtlEndpoint->Target = TGT_DEVICE;//不必關(guān)注,固定
CtlEndpoint->ReqType = REQ_VENDOR; //請求類(lèi)型:自定義請求(標準請求等)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);
當然,沒(méi)有規定說(shuō)一定必須傳給下位機至少一個(gè)字節的數據;你也可以不傳;不過(guò)最好下位機同樣設置接收字節為0,否則小心有莫名奇妙的錯誤(XX內存不能為只讀等等)。
將temp=EP0BUF[0];去掉,上位機:
PUCHAR buf=new UCHAR; //用0填充buf區,填充大小(1字節)
long buflen=0;
CtlEndpoint->XferData(buf,buflen);
也是可以的,另外,控制傳輸請盡量用同步的xferdata()而不是異步的begindataxfer()。
(2)in控制傳輸發(fā)送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; //定義一個(gè)控制端點(diǎn)
CtlEndpoint->Target = TGT_DEVICE;//不必關(guān)注,固定
CtlEndpoint->ReqType= REQ_VENDOR; //請求類(lèi)型:自定義請求(標準請求等)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);這里的話(huà),推薦盡量設置接收緩沖,不要將buflen設置為0.同樣,控制傳輸請盡量用同步的xferdata()而不是異步的begindataxfer()。
(3)另外,還有兩個(gè)簡(jiǎn)化版本的函數Write(out傳輸)和Read(in傳輸)也可以進(jìn)行控制傳輸。其作用同XferData()是一樣的,因為已經(jīng)明確表示了是in還是out,所以Direction 項的值就省略了。只是看起來(lái)代碼更加簡(jiǎn)潔,輸入效率更高而已?;旧?,大多數時(shí)候,使用Write和Read會(huì )方便很多。
CCyControlEndPoint* CtlEndpoint; //定義一個(gè)控制端點(diǎn)
CtlEndpoint->Target = TGT_DEVICE; //不必關(guān)注,固定
CtlEndpoint->ReqType = REQ_VENDOR; //請求類(lèi)型:自定義請求(標準請求等)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的話(huà)同理。
評論