一個transfer(傳輸)由一個或多個transaction(事務)構成,一個transaction(事務)由一個或多個packet(包)構成,一個packet(包)由一個或多個sync(域)構成。
1.傳輸數據通信
USB的數據通訊首先是基於傳輸(transfer)的,傳輸的類型有:中斷傳輸、批量傳輸、同步傳輸、控制傳輸。
2.事務數據通訊
一次傳輸由一個或多個事務(transaction)構成,事務可以分為:in事務、out事務、setup事務。
3.包數據通訊
一個事務由一個或多個包(packet)構成,包可分為:令牌包(setup)、數據包(data)、握手包(ack)、特殊包。
4.域數據通訊
一個包由多個域構成,域可分為:同步域(sync)、標識域(pid)、地址域(addr)、端點域(endp)、幀號域(fram)、數據域(data)、校驗域(crc)。
USB傳輸
傳輸分為四種類型:批量傳輸、等時(同步)傳輸、中斷傳輸、控制傳輸。
1、批量(大容量數據)傳輸(Bulk Transfers): 非周期性,突發
大容量數據的通信,數據可以占用任意帶寬,並容忍延遲 。如USB打印機、掃描儀、大容量儲存設備等。
批量輸出事務:
(1)主機先發出一個OUT令牌包(包含設備地址,端點號)。
(2)然后再發送一個DATA包,這時地址和端點匹配的設備就會收下這個數據包,主機切換到接收模式,等待設備返回握手包。
(3)設備解碼令牌包,數據包都准確無誤,並且有足夠的緩沖區來保存數據后就會使用ACK/NYET握手包來應答主機(只有高速模式才有NYET握手包,他表示本次數據成功接收,但是沒有能力接收下一次傳輸),如果沒有足夠的緩沖區來保存數據,就返回NAC,告訴主機目前沒有緩沖區可用,主機會在稍后時間重新該批量傳輸事務。如果設備檢查到數據正確,但端點處於掛起狀態,返回STALL。如果檢測到有錯誤(如校驗錯誤,位填充錯誤),則不做任何響應,讓主機等待超時。
批量輸入事務:
(1)主機首先發送一個IN令牌包(包含設備地址,端點號)。
(2)主機切換到接收數據狀態等待設備返回數據。如果設備檢測到錯誤,不做任何響應,主機等待超時。如果此時有地址和端點匹配的設備,並且沒有檢測到錯誤,則該設備作出反應:設備有數據需要返回,就將一個數據包放在總線上;如果沒有數據需要返回,設備返回NAK響應主機;如果該端點處於掛起狀態,設備返回STALL。如果主機收到設備發送的數據包並解碼正確后,使用ACK握手包應答設備。如果主機檢測到錯誤,則不做任何響應,設備會檢測到超時。注意:USB協議規定,不允許主機使用NAK來拒絕接收數據包。主機收到NAK,知道設備暫時沒有數據返回,主機會在稍后時間重新該批量輸入事務。
2、中斷傳輸(Interrupt Transfers): 周期性,低頻率。
允許有限延遲的通信 如人機接口設備(HID)中的鼠標、鍵盤、軌跡球等。
中斷傳輸是一種保證查詢頻率的傳輸。中斷端點在端點描述符中要報告它的查詢間隔,主機會保證在小於這個時間間隔的范圍內安排一次傳輸。
3、等時(同步)傳輸(Isochronous Transfers): 周期性 。
持續性的傳輸,用於傳輸與時效相關的信息,並且在數據中保存時間戳的信息 ,如音頻視頻設備。
等時(同步)傳輸用在數據量大、對實時性要求高的場合,如音頻設備,視頻設備等,這些設備對數據的延遲很敏感。對於音頻或視頻設備數據的100%正確性要求不高,少量的數據錯誤是可以容忍的,主要是保證數據不能停頓,所以等時傳輸是不保證數據100%正確的。當數據錯誤時,不再重傳操作。因此等時傳輸沒有應答包,數據是否正確,由數據的CRC校驗來確認。
4、控制傳輸(Control Transfers): 非周期性,突發。
用於命令和狀態的傳輸
控制傳輸可分為三個過程:(1)建立過程 (2)數據過程(可選) (3)狀態過程
特性:
每個USB設備都必須有控制端點,支持控制傳輸來進行命令和狀態的傳輸。USB主機驅動將通過控制傳輸與USB設備的控制端點通信,完成USB設備的枚舉和配置 。
方向:
控制傳輸是雙向的傳輸,必須有IN和OUT兩個方向上的特定端點號的控制端點來完成兩個方向上的控制傳輸 。
USB事物
USB包
包的組成:
包的內容:
1、PID:
這里只用(PID0~4),PID4~7是PID0~4的取反,用來校驗PID
PID1~0:01 令牌包、11 數據包、10 握手包、00 特殊包
2、地址:
3、幀號:
4、數據:
5、CRC:
Packet分四大類: 命令 (Token) 、Packet 幀首 (Start of Frame) 、Packet 數據 (Data) 、Packet 握手 (Handshake) Packet
不同類型包,以上的組成部件有所不同
1、四種Packet類型之令牌包(Token Packet):
令牌包用來啟動一次USB傳輸。
輸出(OUT)令牌包:用來通知設備將要輸出一個數據包
輸入(IN)令牌包:用來通知設備返回一個數據包
建立(SETUP)令牌包:只用在控制傳輸中,和輸出令牌包作用一樣,也是通知設備將要輸出一個數據包,兩者區別在於:
SETUP令牌包后只使用DATA0數據包,且只能發送到設備的控制端點,並且設備必須要接收,而OUT令牌包沒有這些限制
例子:
2、四種Packet類型之SOF Packet
幀起始包:在每幀(或微幀)開始時發送,以廣播的形式發送,所有USB全速設備和高速設備都可以接收到SOF包。
例子:
0xA5:1010 0101:對應上面PID表可知是幀起始包
3、四種Packet類型之Data Packet
例子:
4、四種Packet類型之Handshake Packet
例子:
USB 設備枚舉及描述符介紹
當一個USB設備插入主機后,會有以下活動:
在USB設備的邏輯組織中,包含設備、配置、接口和端點4個層次。設備通常有一個或多個配置,配置通常有一個或多個接口,接口通常有零個或多個端點。
例程分析
我們插上鼠標后后出現如下的信息,我們先來分析第一個傳輸:
我們看到第一個是控制傳輸,它包含了4個事物,分別是:1個setup事務,3個in事務,1個out事務,我們先打開setup事務:
我們看到這個事務里包含了3個包
第一個包是令牌包,它由主控制器發送給目標設備的0號端口,用於設置目標設備的地址和端口號,我們看到后面兩個包都缺省了地址與端口號。在usb系統中,所有的通信都是由主機發出相應的令牌所引起的。
第二個是數據包,由主控器發送給目標設備,其中數據的內容表示:
80:表示要求設備向主機發送信息
06:表示GET_DESCRIPTOR,即設備向主機發送設備描述符
00與01:Word-sized field that varies according to request
00與40:Word-sized field that varies according to request; typically used to pass an index or offset
00:Number of bytes to transfer if there is a:Data stage
總結一下第二個包就是向默認地址0 發送GET_DESCRIPTOR 指令包,請求設備發送設備描述符
第三個是應答包:設備接收到主機發送的數據后會給出應答
接着我們看第一個in事務
我們看到這個事務里也有三個包
第一個是in包:由主機發送給設備,表示要設備向主機發送上面請求的設備描述符
第二個是數據包:由設備發送給主機,當然是發送設備描述符,我們來分析一下:
12:表示接下來要求主機向設備發送信息
01:CLEAR_FEATURE、
第三個是應答包,由主機發送給設備
接着我們來看第二個in事務
這個事務里依舊是3個包
第一個是in包:由主機發送給設備,表示需要輸入
第二個是數據包:由設備發送給主機,我們來解析一下:
6D:表示要求主機發給設備數據
04:Reserved for future use
第三個是主機給設備的應答包
最后來看out事務
第一個是out包:由主機發給設備
第二個是數據包:由主機發給設備,無數據
第三個包是設備給主機的應答包