USB協(xié)通訊議--深入理解
0. 基本概念
一個(gè)【傳輸】(控制、批量、中斷、等時(shí)):由多個(gè)【事務(wù)】組成;
本文引用地址:http://www.ex-cimer.com/article/201612/329551.htm一個(gè)【事務(wù)】(IN、OUT、SETUP):由一多個(gè)【Packet】組成。
USB數(shù)據(jù)在【主機(jī)軟件】與【USB設(shè)備特定的端點(diǎn)】間被傳輸?!局鳈C(jī)軟件】與【USB設(shè)備特定的端點(diǎn)】間的關(guān)聯(lián)叫做【pipes】。一個(gè)USB設(shè)備可以有多個(gè)管道(pipes)。
1. 包(Packet)
包(Packet)是USB系統(tǒng)中信息傳輸?shù)幕締卧?,所有?shù)據(jù)都是經(jīng)過(guò)打包后在總線上傳輸?shù)?。?shù)據(jù)在 USB總線上的傳輸以包為單位,包只能在幀內(nèi)傳輸。高速USB 總線的幀周期為125us,全速以及低速 USB 總線的幀周期為 1ms。幀的起始由一個(gè)特定的包(SOF 包)表示,幀尾為 EOF。EOF不是一個(gè)包,而是一種電平狀態(tài),EOF期間不允許有數(shù)據(jù)傳輸。
注意:雖然高速USB總線和全速/低速USB總線的幀周期不一樣,但是SOF包中幀編號(hào)的增加速度是一樣的,因?yàn)樵诟咚賃SB系統(tǒng)中,SOF包中幀編號(hào)實(shí)際上取得是計(jì)數(shù)器的高11位,最低三位作為微幀編號(hào)沒(méi)有使用,因此其幀編號(hào)的增加周期也為 1mS。
•USB總線上的情形是怎樣的?
•包是USB總線上數(shù)據(jù)傳輸?shù)淖钚挝?,不能被打斷或干擾,否則會(huì)引發(fā)錯(cuò)誤。若干個(gè)數(shù)據(jù)包組成一次事務(wù)傳輸,一次事務(wù)傳輸也不能打斷,屬于一次事務(wù)傳輸?shù)膸讉€(gè)包必須連續(xù),不能跨幀完成。一次傳輸由一次到多次事務(wù)傳輸構(gòu)成,可以跨幀完成。
USB包由五部分組成,即同步字段(SYNC)、包標(biāo)識(shí)符字段(PID)、數(shù)據(jù)字段、循環(huán)冗余校驗(yàn)字段(CRC)和包結(jié)尾字段(EOP),包的基本格式如下圖:
1.1 PID類型(即包類型)
1.2 Token Packets
此格式適用于IN、OUT、SETUP、PING。
PID 數(shù)據(jù)傳輸方向
IN Device->Host
OUT Host->Device
SETUP Host->Device
PING Device->Host
1.3 Start-of-Frame(SOF) Packets
SOF包由Host發(fā)送給Device。
1) 對(duì)于full-speed總線,每隔1.00 ms ±0.0005 ms發(fā)送一次;
2) 對(duì)于high-speed總線,每隔125 μs ±0.0625 μs發(fā)送一次;
SOF包構(gòu)成如下圖所示:
1.4 Data Packets
有四種類類型的數(shù)據(jù)包:DATA0, DATA1, DATA2,and MDATA,且由PID來(lái)區(qū)分。DATA0和DATA1被定義為支持?jǐn)?shù)據(jù)切換同步(data toggle synchronization)。
1.5 Handshake Packets
• ACK:對(duì)于IN事務(wù),它將由host發(fā)出;對(duì)于OUT、SETUP和PING事務(wù),它將由device發(fā)出。
• NAK:在數(shù)據(jù)階段,對(duì)于IN事務(wù),它將由device發(fā)出;在握手階段,對(duì)于OUT和PING事務(wù),它也將由device發(fā)出;host從不發(fā)送NAK包。
2. 事務(wù)(Transaction)
在USB上數(shù)據(jù)信息的一次接收或發(fā)送的處理過(guò)程稱為事務(wù)處理(Transaction)即:The delivery of service to an endpoint。一個(gè)事務(wù)由一系統(tǒng)packet組成,具體由哪些packet組成,它取決于具體的事務(wù)??赡苡扇缦掳M成:
• 一個(gè)token packet
• 可選的data pcket
•可選的handshake packet
•可選的special packet
2.1 輸入(IN)事務(wù)處理
輸入事務(wù)處理:表示USB主機(jī)從總線上的某個(gè)USB設(shè)備接收一個(gè)數(shù)據(jù)包的過(guò)程。
•【正?!康妮斎胧聞?wù)處理
•【設(shè)備忙】時(shí)的輸入事務(wù)處理
•【設(shè)備出錯(cuò)】時(shí)的輸入事務(wù)處理
2.2. 輸出(OUT)事務(wù)處理
輸出事務(wù)處理:表示USB主機(jī)把一個(gè)數(shù)據(jù)包輸出到總線上的某個(gè)USB設(shè)備接收的過(guò)程。
•【正?!康妮敵鍪聞?wù)處理
•【設(shè)備忙時(shí)】的輸出事務(wù)處理
•【設(shè)備出錯(cuò)】的輸出事務(wù)處理
2.3 設(shè)置(SETUP)事務(wù)處理
•【正?!康脑O(shè)置事務(wù)處理
•【設(shè)備忙時(shí)】的設(shè)置事務(wù)處理
•【設(shè)備出錯(cuò)】的設(shè)置事務(wù)處理
3.USB傳輸類型
在USB的傳輸中,定義了4種傳輸類型:
•控制傳輸 (Control Transfer)
•中斷傳輸 (Interrupt Transfer)
•批量傳輸 (Bulk Transfer)
•同步傳輸 (Isochronous)
3.1 控制傳輸 (Control Transfer)
控制傳輸由2~3個(gè)階段組成:
1) 建立階段(Setup)
2) 數(shù)據(jù)階段(無(wú)數(shù)據(jù)控制沒(méi)有此階段)(DATA)
3) 狀態(tài)階段(Status)
控制數(shù)據(jù)由USB系統(tǒng)軟件用于配置設(shè)備(在枚舉時(shí)),其它的驅(qū)動(dòng)軟件可以選擇使用control transfer實(shí)現(xiàn)具體的功能,數(shù)據(jù)傳輸是不可丟失的。
3.1.1 建立階段
主機(jī)從USB設(shè)備獲取配置信息,并設(shè)置設(shè)備的配置值。建立階段的數(shù)據(jù)交換包含了SETUP令牌封包、緊隨其后的DATA0數(shù)據(jù)封包以及ACK握手封包。它的作用是執(zhí)行一個(gè)設(shè)置(概念含糊)的數(shù)據(jù)交換,并定義此控制傳輸?shù)膬?nèi)容(即:在Data Stage中IN或OUT的data包個(gè)數(shù),及發(fā)送方向,在Setup Stage已經(jīng)被設(shè)定)。
3.1.2 數(shù)據(jù)階段
根據(jù)數(shù)據(jù)階段的數(shù)據(jù)傳輸?shù)姆较?,控制傳輸又可分?種類型:
1) 控制讀?。ㄗx取USB描述符)
2) 控制寫(xiě)入(配置USB設(shè)備)
3) 無(wú)數(shù)據(jù)控制
數(shù)據(jù)傳輸階段:用來(lái)傳輸主機(jī)與設(shè)備之間的數(shù)據(jù)。
•控制讀取
是將數(shù)據(jù)從設(shè)備讀到主機(jī)上,讀取的數(shù)據(jù)USB設(shè)備描述符。該過(guò)程如下圖的【Control Read】所示。對(duì)每一個(gè)數(shù)據(jù)信息包而言,首先,主機(jī)會(huì)發(fā)送一個(gè)IN令牌信息包,表示要讀數(shù)據(jù)進(jìn)來(lái)。然后,設(shè)備將數(shù)據(jù)通過(guò)DATA1/DATA0數(shù)據(jù)信息包回傳給主機(jī)。最后,主機(jī)將以下列的方式加以響應(yīng):當(dāng)數(shù)據(jù)已經(jīng)正確接收時(shí),主機(jī)送出ACK令牌信息包;當(dāng)主機(jī)正在忙碌時(shí),發(fā)出NAK握手信息包;當(dāng)發(fā)生了錯(cuò)誤時(shí),主機(jī)發(fā)出STALL握手信息包。
•控制寫(xiě)入
是將數(shù)據(jù)從主機(jī)傳到設(shè)備上,所傳的數(shù)據(jù)即為對(duì)USB設(shè)備的配置信息,該過(guò)程如下的圖【Control Wirte】所示。對(duì)每一個(gè)數(shù)據(jù)信息包而言,主機(jī)將會(huì)送出一個(gè)OUT令牌信息包,表示數(shù)據(jù)要送出去。緊接著,主機(jī)將數(shù)據(jù)通過(guò)DATA1/DATA0數(shù)據(jù)信息包傳遞至設(shè)備。最后,設(shè)備將以下列方式加以響應(yīng):當(dāng)數(shù)據(jù)已經(jīng)正確接收時(shí),設(shè)備送出ACK令牌信息包;當(dāng)設(shè)備正在忙碌時(shí),設(shè)備發(fā)出NAK握手信息包;當(dāng)發(fā)生了錯(cuò)誤時(shí),設(shè)備發(fā)出STALL握手信息包。
3.1.3 狀態(tài)階段
狀態(tài)階段:用來(lái)表示整個(gè)傳輸?shù)倪^(guò)程已完全結(jié)束。
狀態(tài)階段傳輸?shù)姆较虮仨毰c數(shù)據(jù)階段的方向相反,即原來(lái)是IN令牌封包,這個(gè)階段應(yīng)為OUT令牌封包;反之,原來(lái)是OUT令牌封包,這個(gè)階段應(yīng)為IN令牌封包。
對(duì)于【控制讀取】而言,主機(jī)會(huì)送出OUT令牌封包,其后再跟著0長(zhǎng)度的DATA1封包。而此時(shí),設(shè)備也會(huì)做出相對(duì)應(yīng)的動(dòng)作,送ACK握手封包、NAK握手封包或STALL握手封包。
相對(duì)地對(duì)于【控制寫(xiě)入】傳輸,主機(jī)會(huì)送出IN令牌封包,然后設(shè)備送出表示完成狀態(tài)階段的0長(zhǎng)度的DATA1封包,主機(jī)再做出相對(duì)應(yīng)的動(dòng)作:送ACK握手封包、NAK握手封包或STALL握手封包。
3.2 批量傳輸 (Bulk Transfer)
•用于傳輸大量數(shù)據(jù),要求傳輸不能出錯(cuò),但對(duì)時(shí)間沒(méi)有要求,適用于打印機(jī)、存儲(chǔ)設(shè)備等。
•批量傳輸是可靠的傳輸,需要握手包來(lái)表明傳輸?shù)慕Y(jié)果。若數(shù)據(jù)量比較大,將采用多次批量事務(wù)傳輸來(lái)完成全部數(shù)據(jù)的傳輸,傳輸過(guò)程中數(shù)據(jù)包的PID 按照 DATA0-DATA1-DATA0-…的方式翻轉(zhuǎn),以保證發(fā)送端和接收端的同步。
•USB 允許連續(xù) 3次以下的傳輸錯(cuò)誤,會(huì)重試該傳輸,若成功則將錯(cuò)誤次數(shù)計(jì)數(shù)器清零,否則累加該計(jì)數(shù)器。超過(guò)三次后,HOST 認(rèn)為該端點(diǎn)功能錯(cuò)誤(STALL),放棄該端點(diǎn)的傳輸任務(wù)。
•一次批量傳輸(Transfer)由 1 次到多次批量事務(wù)傳輸(Transaction)組成。
•翻轉(zhuǎn)同步:發(fā)送端按照 DATA0-DATA1-DATA0-…的順序發(fā)送數(shù)據(jù)包,只有成功的事務(wù)傳輸才會(huì)導(dǎo)致 PID 翻轉(zhuǎn),也就是說(shuō)發(fā)送端只有在接收到 ACK 后才會(huì)翻轉(zhuǎn) PID,發(fā)送下一個(gè)數(shù)據(jù)包,否則會(huì)重試本次事務(wù)傳輸。同樣,若在接收端發(fā)現(xiàn)接收到到的數(shù)據(jù)包不是按照此順序翻轉(zhuǎn)的,比如連續(xù)收到兩個(gè) DATA0,那么接收端認(rèn)為第二個(gè) DATA0 是前一個(gè) DATA0 的重傳。
它通過(guò)在硬件級(jí)執(zhí)行“錯(cuò)誤檢測(cè)”和“重傳”來(lái)確保host與device之間“準(zhǔn)確無(wú)誤”地傳輸數(shù)據(jù),即可靠傳輸。它由三種包組成(即IN事務(wù)或OUT事務(wù)):
1) token
2) data
3) handshake
1) For IN Token (即:IN Transaction)
•ACK: 表示host正確無(wú)誤地接收到數(shù)據(jù)
•NAK: 指示設(shè)備暫時(shí)不能返回或接收數(shù)據(jù) (如:設(shè)備忙)
•STALL:指示設(shè)備永遠(yuǎn)停止,需要host軟件的干預(yù) (如:設(shè)備出錯(cuò))
2) For OUT Token(即:OUT Transaction)
如果接收到的數(shù)據(jù)包有誤,如:CRC錯(cuò)誤,Device不發(fā)送任何handshake包
•ACK: Device已經(jīng)正確無(wú)誤地接收到數(shù)據(jù)包,且通知Host可以按順序發(fā)送下一個(gè)數(shù)據(jù)包
• NAK: Device已經(jīng)正確無(wú)誤地接收到數(shù)據(jù)包,且通知Host重傳數(shù)據(jù),由于Device臨時(shí)狀況(如buffer滿)
•STALL: 指示Deviceendpoint已經(jīng)停止,且通知Host不再重傳
3) Bulk讀寫(xiě)序列
即由一系統(tǒng)IN事務(wù)或OUT事務(wù)組成。
3.3 中斷傳輸(Interrupt Transfer)
中斷傳輸由IN或OUT事務(wù)組成。
中斷傳輸在流程上除不支持PING 之外,其他的跟批量傳輸是一樣的。他們之間的區(qū)別也僅在于事務(wù)傳輸發(fā)生的端點(diǎn)不一樣、支持的最大包長(zhǎng)度不一樣、優(yōu)先級(jí)不一樣等這樣一些對(duì)用戶來(lái)說(shuō)透明的東西。
主機(jī)在排定中斷傳輸任務(wù)時(shí),會(huì)根據(jù)對(duì)應(yīng)中斷端點(diǎn)描述符中指定的查詢間隔發(fā)起中斷傳輸。中斷傳輸有較高的優(yōu)先級(jí),僅次于同步傳輸。
同樣中斷傳輸也采用PID翻轉(zhuǎn)的機(jī)制來(lái)保證收發(fā)端數(shù)據(jù)同步。下圖為中斷傳輸?shù)牧鞒虉D。
中斷傳輸方式總是用于對(duì)設(shè)備的查詢,以確定是否有數(shù)據(jù)需要傳輸。因此中斷傳輸?shù)姆较蚩偸菑腢SB設(shè)備到主機(jī)。
DATA0或DATA1中的包含的是中斷信息,而不是中斷數(shù)據(jù)。
3.4同步傳輸(Isochronous Transfer)
1) 它由兩種包組成:
1) token
2) data
同步傳輸不支持“handshake”和“重傳能力”,所以它是不可靠傳輸。
同步傳輸是不可靠的傳輸,所以它沒(méi)有握手包,也不支持PID翻轉(zhuǎn)。主機(jī)在排定事務(wù)傳輸時(shí),同步傳輸有最高的優(yōu)先級(jí)。
同步傳輸適用于必須以固定速率抵達(dá)或在指定時(shí)刻抵達(dá),可以容忍偶爾錯(cuò)誤的數(shù)據(jù)上。實(shí)時(shí)傳輸一般用于麥
克風(fēng)、喇叭、UVC Camera等設(shè)備。實(shí)時(shí)傳輸只需令牌與數(shù)據(jù)兩個(gè)信息包階段,沒(méi)有握手包,故數(shù)據(jù)傳錯(cuò)時(shí)不會(huì)重傳。
Isochronous data is continuous and real-time in creation, delivery, and consumption. Timing-relatedinformation is implied by the steady rate at which isochronous data is received and transferred. Isochronousdata must be delivered at the rate received to maintain its timing. In addition to delivery rate, isochronousdata may also be sensitive to delivery delays. For isochronous pipes, the bandwidth required is typicallybased upon the sampling characteristics of the associated function. The latency required is related to thebuffering available at each endpoint.
A typical example of isochronous data is voice. If the delivery rate of these data streams is not maintained,drop-outs in the data stream will occur due to buffer or frame underruns or overruns. Even if data isdelivered at the appropriate rate by USB hardware, delivery delays introduced by software may degrade applications requiring real-time turn-around, such as telephony-based audio conferencing.
The timely delivery of isochronous data is ensured at the expense of potential transient losses in the data stream. In other words, any error in electrical transmission is not corrected by hardware mechanisms such as retries. In practice, the core bit error rate of the USB is expected to be small enough not to be an issue. USB isochronous data streams are allocated a dedicated portion of USB bandwidth to ensure that data can be delivered at the desired rate. The USB is also designed for minimal delay of isochronous data transfers.
評(píng)論