基于Spartan-6的高速數(shù)據(jù)采集、處理和實時傳輸研究
開0號設備,
本文引用地址:http://m.butianyuan.cn/article/201612/326826.htmCCyUSBEndPoint *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的話同理。
評論