USB 字段和包格式(1)

本文由小南瓜餅從http://www.cnblogs.com/zsb517/archive/2012/06/03/2532402.html轉載

一  USB是一種協議總線,即主機與設備之間的通信需要遵循一系列約定。協議內容較多,這裏僅作一些簡單介紹,深入學習,可參看USB規範(WWW.usb.org)。 
爲 了理解協議中的名稱,先看圖10.32。該圖突出了主機上的客戶軟件和USB邏輯設備(編程涉及的設備)之間的通信流 (Communication Flow),該通信流跨越了USB驅動程序USBD、主控制器驅動程序UHCD、主控制器等硬件接口及其連接。端點 (Endpoints)是USB設備的惟一可識別的部分,是主機和設備之間通信流的終點。每一個邏輯設備有若干個獨立端點,每一個端點在設計時被分配一個 惟一的由設備確定的標識符,稱之爲端點號。 如圖10.32所示,將用於通信流流動的通道稱爲管道(Pipe),這是忽略了許多中間環節的很形象的稱呼,對於理解USB系統中的信息傳輸很有幫助。圖 中把3個端點看成了一個接口,關於接口的說明安排在後面。

1 包標示PID字段

命令面的幾種包的開始都是PID域。PID域的格式如圖10.37所示。

低 4位用來標識不同的包,高4位分別爲低4位的檢驗字段,這樣安排是爲了保證對PID可靠的譯碼,從而也使得包的其他部分能得到正確解釋。表10.20表示 了PID編碼和對應的PID類型。其中第3列是PID的低4位,即PID編碼。 表中有兩種數據包PID,都用於數據的傳輸,以它們開頭的兩種數據包除了包PID部分有一位(及與它對應的反向位)不同外,其他部分都相同。設置這兩種數 據 包是爲了使發送方和接收方保持同步,這涉及到一些細節,將在10.3.6小節中介紹。在圖10.38~10.40中不妨將它們看成一種數據包。 

2、地址字段(ADDR)

地 址字段用於指定USB系統中的一個USB設備,包含6個數據位,最多可以指定128個地址,地址0用作缺省地址,不分配給USB設備,USB設備 是發送方還是接收方,則取決於PID字段的值。在IN、OUT、SETUP、SPLIT和PING令牌包中都必須使用該地址字段,以指明與其通信的USB 設備。如果指定的設備地址不存在,該數據包被丟棄。USB設備上電和復位時,使用缺省地址0來與主機通信。在設備配置過程中,主機會爲其分配一個唯一的設 備地址。

3、 端點字段(ENDP)

端點字段用於指定USB設備中的一個端點,包含4 個數據位;全速/高速設備最多可以含有16個端點,低速設備最多含有3個端點。所有USB設備都必 須含有一個0號端點,以完成與主機間的配置通信,除0號端點外,其餘的端點都是具體USB設備所特有的。在IN、OUT、SETUP、SPLIT和 PING令牌包中都必須使用該端點字段,以指明與其進行數據傳輸的USB設備端點。如果指定的端點號不存在,則該數據包被忽略,如果在端點初始化之前就訪 問該端點,則數據包也將被忽略。

4、幀號字段

幀號字段用於指出當前幀的幀號,它僅在每幀/小幀開始的SOF令牌包中被髮送,其數據位長度爲11位,每傳輸一幀,主機就將其內容加1,當達到最大值7FFH時歸零。

5、 數據字段

數據字段包含主機和USB設備間需要傳輸的數據,以字節爲單位,最大長度爲1024,而實際長度取決於傳輸的具體情況。

6、CRC字段

USB 令牌包和數據包中都使用了CRC。但是,CRC是發送方在進行位填充之前產生的,這樣要求接收方在去除位填充之後,再對CRC字段進行譯碼。 信息包中的PID字段本身含有校驗,所以CRC不含有PID部分。令牌包的CRC採用的是5位的CRC校驗,數據包中的數據字段使用的是16位CRC。

三 信息包

1.包格式 
包的概念在前面已經介紹了,包是幀的基本成分。常用的包有令牌包、數據包和握手包。對於高速傳輸,還定義了事務分割專用令牌包(事務分割開始令牌包和事務分割完成令牌包)。 
1)令牌包格式 
在USB系統中,所有的通信都是由主機發出相應的令牌所引起的。令牌包格式圖 10.33所示。 其中PID爲包標識,ADDR爲設備地址,ENDP爲端點號,CRC5是對ADDR和ENDP域進行校驗的5位CRC校驗碼,校驗多項式爲:G(X)=X5+X2+1。 
2)數據包格式 
數據包用於主機與設備之間的數據傳輸。數據包格式如圖10.34所示。 其中PID爲包標識,DATA爲數據位,最多爲8 192個位,DATA應是字節的整數倍。CRCl6是對DATA域進行校驗的16位CRC校驗碼,校驗多項式爲:G(X)=X16+X15+X2+1. 

3)握手包格式 
握手包用來指示數據被成功接收、命令被接收或被拒絕等事務狀態。握手包格式如圖10.35所示。 握手包僅由PII)組成。有四種常用握手包(ACK、NAK、STALL和NYET)和一個專用握手包,握手包的類型是通過PID的編碼來體現的。 
·ACK包表示接收器已成功接收數據。 
·NAK包表示接收設備不能接收數據或發送設備不能發送數據。 
·STALL包表示端點已終止或不支持控制管道請求。 
·NYET包表示接收器還沒有任何響應。 
4)幀開始包SOF(Start Of Frame)

在全速或低速時,主機每隔1 ms±0.0005 ms發出一個幀開始包SOF,在高速時,每隔125 μs±0.0625μs發出一個SOF,以表示開始一個新幀。SOF包的格式如圖10.36所示。
    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章