|
文章原出處:
文章前面基礎部分講的很簡單易懂,后面全是結合自己的PIC單片機所開發(fā)的內(nèi)容,所以不具備通用性也就不翻譯了,有興趣點開鏈接看看。
如果你在開發(fā)一個設備需要和PC通信,使用USB是一個好的機會。對于每個USB設備,PC分配一個軟件驅動。Windows會提供一些特定的USB類的驅動,例如human
interface,printer,或者mass storage。
若你的設備并不屬于這些類,微軟的WinUSB是一個好的選擇。
在這個文章里,我會展示怎么去編輯和訪問WinUSB設備。WinUSB驅動需要PC環(huán)境是XP
SP2或者之后的版本,包括了Vista和win7.
傳輸類型
每一個USB的數(shù)據(jù)傳輸都是建立在PC和USB設備的端點之間的。設備端點則是設備中的一個緩沖區(qū)來儲存接收的數(shù)據(jù)或者將要發(fā)送的數(shù)據(jù)。每一個USB設備都必須支持0號端點,0號端點是一個雙方向端點。除此之外,其他的端點可以任意配置為IN或OUT。
即使端點在設備內(nèi)部,但根據(jù)USB規(guī)范,端點的方向還是從PC端來看的。即,IN端點表示從設備把數(shù)據(jù)傳輸?shù)絇C。OUT端點表示從PC把數(shù)據(jù)送到設備。這個命名方法在設備端編程的時候很容易搞混。
USB現(xiàn)在大規(guī)模使用的一個原因是它支持4個傳輸方式,每一個都有不同的特性。WinUSB支持control,bulk,和interrupt傳輸。control傳輸使用的是端點0號,而其他的傳輸方式則可以用其他的端點。
control傳輸方式是一個有固定樣式的數(shù)據(jù)傳輸方式。在一個單傳輸里,只有control傳輸可以在兩方向傳輸。在設備插入PC后,通過一個叫枚舉的過程,PC使用control傳輸來識別設備。
WinUSB設備可以在用戶自定義命令下使用control傳輸來收發(fā)數(shù)據(jù)。例如,你可以定義一個請求來設置或者讀取一個開關的值,發(fā)送數(shù)據(jù)來配置設備操作,或者得到傳感器內(nèi)容之類的。
一個control傳輸有2個或者3個階段。為了識別新插入的USB設備,PC會使用control傳輸來從設備獲取一些叫descriptor的數(shù)據(jù)結構。在Setup階段,PC發(fā)送請求。在Data階段,設備發(fā)送所要求的descriptor。在Status階段,PC發(fā)送一個ACK來表示收到了descriptor。
PC也可以在Data階段用control傳輸來發(fā)送數(shù)據(jù)信息到設備,則在Status階段,由設備來發(fā)送ACK信息表示收到數(shù)據(jù)。有一些請求沒有Data階段。
一個USB主機會保留一部分總線帶寬給control傳輸:
在low-speed和full-speed端點下10%,在high-speed端點下20%。如果總線不忙,control傳輸可以使用比保留帶寬更大的帶寬。但是所有的設備都使用一個總線,所以總線忙的時候,control傳輸可能需要等待。
其他的傳輸模式則沒有多個傳輸階段且任意傳輸數(shù)據(jù)。在總線理想情況下,bulk傳輸最快。但是bulk傳輸沒有保留的帶寬,所以在總線忙的時候,bulk傳輸需要等待。一般bulk傳輸使用在打印機或者掃描儀這類只需要快速傳輸?shù)脑O備上。
對于interrupt傳輸,主機確保了一個IN端點收到數(shù)據(jù)或者OUT端點發(fā)送數(shù)據(jù)的最大時間間隔。一般用于鼠標,鍵盤等需要快速反應用戶輸入的設備。
isochronous傳輸有一個確定的傳輸速度但是不像其他的傳輸模式,它不用ACK且數(shù)據(jù)接受者不能要求重新發(fā)送壞掉的數(shù)據(jù)。一般用于用戶不會太在意小量的數(shù)據(jù)破損的流媒體通信。WinUSB不支持isochronous傳輸。
|
|
|