導(dǎo)言
上一節(jié)我們?cè)敿?xì)討論了USB的比特級(jí)編解碼,本章將以此為基礎(chǔ),進(jìn)一步介紹USB字段及包的格式。USB包的構(gòu)成是一個(gè)逐層的過(guò)程,信息首先以二進(jìn)制串行數(shù)據(jù)的形式存在。這些串行數(shù)據(jù)按照特定規(guī)則被組織成字段(filed),字段(filed)是包(packet)的基本單元。多個(gè)字段(filed)按照一定的順序組成一個(gè)包(packed),進(jìn)一步地,多個(gè)包(packed)可以組成一個(gè)事務(wù)(transaction),事務(wù)(transaction)是USB通信中更大粒度的數(shù)據(jù)傳輸單元。最終,多個(gè)事務(wù)(transaction)組成一個(gè)傳輸(transfer),代表了一個(gè)完整的數(shù)據(jù)傳輸過(guò)程。本文主要講解Packet,下一章將會(huì)探討USB事務(wù)(transaction)的傳輸過(guò)程。
1字段(filed)
?
所有包都有包開(kāi)始(SOP)和結(jié)束(EOP)界定符。包(packet)與開(kāi)始界定符(SOP)的分隔符是 SYNC 字段。輸入電路使用SYNC來(lái)將輸入數(shù)據(jù)與本地時(shí)鐘對(duì)齊,SYNC 字段中的最后兩位是一個(gè)標(biāo)記,用于識(shí)別 SYNC 字段的結(jié)束,并通過(guò)推斷識(shí)別 PID 的開(kāi)始。字段(filed)是包(packet)的基本單元,每種包(packet)都有對(duì)應(yīng)的字段。
包標(biāo)識(shí)符字段(PID)
?
-
每個(gè)USB包的SYNC字段后緊跟一個(gè)PID
-
PID由一個(gè)四位包類(lèi)型字段和一個(gè)四位校驗(yàn)字段組成
-
PID指示包的類(lèi)型,暗示了包的格式和應(yīng)用的錯(cuò)誤檢測(cè)類(lèi)型
-
四位校驗(yàn)字段確保PID的可靠解碼,以確保正確解釋包
-
PID的四位校驗(yàn)字段是通過(guò)對(duì)包類(lèi)型字段進(jìn)行補(bǔ)碼生成的
-
如果四個(gè)PID校驗(yàn)位與它們各自的包識(shí)別符位不是補(bǔ)碼關(guān)系,則發(fā)生PID錯(cuò)誤
-
主機(jī)和所有功能必須對(duì)所有接收到的PID字段進(jìn)行完整解碼
-
如果接收到的PID的校驗(yàn)字段失敗,或者解碼為非定義的值,則假定其已損壞
-
包接收器將忽略整個(gè)包,包括損壞的PID
-
如果功能收到了一個(gè)它不支持的事務(wù)類(lèi)型或方向的有效PID,則該功能不得回應(yīng),例如,僅支持輸入的端點(diǎn)應(yīng)忽略輸出令牌
-
PID分為四個(gè)編碼組:令牌、數(shù)據(jù)、握手和特殊
-
傳輸?shù)那皟晌籔ID位(PID<0:1>)指示編碼組
地址字段
地址字段有兩部分組成:功能地址字段(ADDR)和端點(diǎn)字段(EP)。
如果包的地址字段與設(shè)備端點(diǎn)不匹配則必須忽略這個(gè)包。
「功能地址字段(ADDR Field)」
-
ADDR字段通過(guò)其地址指定功能,根據(jù)令牌PID的值,功能可能是包的源或目的。
-
ADDR<6:0>指定了128個(gè)地址
-
ADDR字段用于IN、SETUP和OUT令牌以及PING和SPLIT特殊令牌
-
每一個(gè)單獨(dú)的功能(function)都會(huì)有一個(gè)ADDR值,這意味著可能會(huì)有多個(gè)端點(diǎn)(Endpoint)共享一個(gè)ADDR
-
復(fù)位和上電時(shí),ADDR默認(rèn)為零,必須在枚舉過(guò)程中由主機(jī)進(jìn)行分配
-
ADDR 0被保留作為默認(rèn)地址,不能分配給其他用途
「端點(diǎn)字段(Endpoint Field)」
-
附加的4位端點(diǎn)字段(ENDP)允許在多端點(diǎn)(Endpoint)的功能(Function)中更靈活地進(jìn)行尋址
-
除了端點(diǎn)地址0外,其他端點(diǎn)地址是根據(jù)功能(Function)的端點(diǎn)來(lái)定義的
-
端點(diǎn)字段定義了用于IN、SETUP和OUT令牌以及PING特殊令牌
-
所有功能必須支持端點(diǎn)地址為零的默認(rèn)控制管道(Default Control Pipe)
-
低速設(shè)備每個(gè)功能最多支持3個(gè)端點(diǎn):端點(diǎn)編號(hào)為零的控制管道以及另外兩個(gè)端點(diǎn)
額外的兩個(gè)端點(diǎn)可以作為:
1.兩個(gè)控制管道
2.一個(gè)控制管道和一個(gè)中斷端點(diǎn)
3.兩個(gè)中斷管道
-
全速和高速功能可以支持最多16個(gè)IN和OUT端點(diǎn)(16組端點(diǎn))
幀號(hào)字段(Frame Number Field)
-
USB幀的概念是用于組織和標(biāo)記數(shù)據(jù)傳輸?shù)臅r(shí)間間隔,幀號(hào)就是用來(lái)標(biāo)識(shí)這些幀的序號(hào),一個(gè)幀內(nèi)可以包含一個(gè)或多個(gè)包
-
在USB幀的包中,幀號(hào)字段位于幀的頭部。幀的頭部包含同步(SYNC)和定界符(SOP)以及其他必要的信息,幀號(hào)字段在這個(gè)頭部中用于指示當(dāng)前幀的序號(hào)
-
USB 2.0規(guī)范中,幀號(hào)字段是11位長(zhǎng)。這意味著,幀號(hào)的范圍在0到2047之間,當(dāng)達(dá)到2047后會(huì)重新從0開(kāi)始
-
每當(dāng)USB總線上的一個(gè)新幀開(kāi)始時(shí),幀號(hào)字段會(huì)遞增
-
幀號(hào)字段的主要用途是為USB系統(tǒng)提供一個(gè)時(shí)間基準(zhǔn),確保設(shè)備和主機(jī)能夠按照同一時(shí)間軸進(jìn)行數(shù)據(jù)傳輸。幀號(hào)也用于幫助處理時(shí)間敏感的USB應(yīng)用,如音頻和視頻傳輸
數(shù)據(jù)字段(Data?Field)
-
數(shù)據(jù)字段的范圍可以從 0 到 1024 字節(jié)
-
數(shù)據(jù)字段通常位于USB數(shù)據(jù)包的中間部分,緊隨在幀的同步和定界部分以及可能的地址、端點(diǎn)和其他控制信息之后。具體的數(shù)據(jù)字段位置和長(zhǎng)度取決于USB傳輸?shù)念?lèi)型和幀結(jié)構(gòu)
-
數(shù)據(jù)字段承載了需要在USB設(shè)備之間傳輸?shù)膶?shí)際數(shù)據(jù)。這可以是應(yīng)用程序數(shù)據(jù)、控制命令、中斷數(shù)據(jù)等,取決于USB傳輸?shù)念?lèi)型。例如,在批量傳輸中,數(shù)據(jù)字段可能攜帶文件的內(nèi)容;在控制傳輸中,數(shù)據(jù)字段可能包含控制請(qǐng)求和應(yīng)答等
-
數(shù)據(jù)字段之后通常會(huì)包含錯(cuò)誤檢測(cè)和結(jié)束標(biāo)記。錯(cuò)誤檢測(cè)用于驗(yàn)證數(shù)據(jù)的完整性,而結(jié)束標(biāo)記則指示數(shù)據(jù)字段的結(jié)束,幫助接收端正確解析傳輸
CRC字段(CRC?Field)
和以太網(wǎng)類(lèi)似,USB包在末尾也會(huì)有校驗(yàn)字段CRC,其CRC的校驗(yàn)不包括PID字段,主要校驗(yàn)PID之后的地址、幀號(hào)、數(shù)據(jù)等字段。USB包的CRC有兩種分別應(yīng)用于兩種不同的場(chǎng)合:
「令牌CRC(Token?CRC)」
-
G(X) = X5 + X2 + 1
-
令牌CRC字段用于校驗(yàn)IN、SETUP和OUT令牌的ADDR和ENDP字段,或SOF令牌的時(shí)間戳字段。同時(shí),PING和SPLIT特殊令牌也包括一個(gè)五位CRC字段
-
如果所有令牌位在接收端無(wú)錯(cuò)誤地接收,CRC字段的5位余數(shù)將為01100B。這表示CRC校驗(yàn)成功,沒(méi)有檢測(cè)到錯(cuò)誤
「數(shù)據(jù)CRC(Data?CRC)」
-
G(X) = X16 + X15 + X2 + 1
-
數(shù)據(jù)CRC字段用于校驗(yàn)帶有Data字段的數(shù)據(jù)包(Data Packet)
-
如果所有數(shù)據(jù)和CRC位都正確接收,則16位余數(shù)將為1000000000001101B
2包(Packet)
?
USB(Universal Serial Bus)的數(shù)據(jù)傳輸基本單位是數(shù)據(jù)包(Packet)。USB數(shù)據(jù)包根據(jù)不同的令牌類(lèi)型和傳輸階段,有不同的格式和含義。常見(jiàn)的令牌類(lèi)型包括IN、OUT、SETUP、SOF(Start of Frame)等。整個(gè)USB通信過(guò)程由一系列數(shù)據(jù)包組成,這些數(shù)據(jù)包通過(guò)同步和特定字段的解析,實(shí)現(xiàn)設(shè)備之間的可靠數(shù)據(jù)傳輸。
令牌包(Token Packets)
-
令牌包由PID(IN、OUT、SETUP類(lèi)型)、ADDR和ENDP字段組成。PING特殊令牌包也包含相同的字段。令牌的PID指定了數(shù)據(jù)包類(lèi)型和相關(guān)的地址、端點(diǎn)信息
-
令牌類(lèi)型分為IN、OUT、SETUP和PING。IN令牌表示從設(shè)備到主機(jī)的數(shù)據(jù)傳輸,OUT和SETUP令牌表示從主機(jī)到設(shè)備的數(shù)據(jù)傳輸,PING令牌表示握手傳輸。令牌中的地址和端點(diǎn)字段用于唯一標(biāo)識(shí)相關(guān)的設(shè)備端點(diǎn)
-
令牌包包含一個(gè)五位CRC校驗(yàn),用于覆蓋地址和端點(diǎn)字段。這有助于接收方驗(yàn)證令牌包的完整性。不過(guò),CRC不覆蓋PID,PID有自己的校驗(yàn)字段。
-
令牌和SOF(Start of Frame)包在三個(gè)字節(jié)的數(shù)據(jù)字段后由EOP標(biāo)志作為結(jié)束。如果一個(gè)包在三個(gè)字節(jié)后未以EOP結(jié)束,即使它解碼為有效的令牌或SOF,也必須被視為無(wú)效并被接收方忽略。
-
令牌包應(yīng)用
設(shè)備初始化:當(dāng)USB設(shè)備插入計(jì)算機(jī)的端口時(shí),主機(jī)會(huì)向設(shè)備發(fā)送OUT令牌包,指定設(shè)備的地址和初始化信息。設(shè)備收到令牌包后,可能會(huì)進(jìn)行初始化過(guò)程。
數(shù)據(jù)讀取:如果主機(jī)需要從USB設(shè)備讀取數(shù)據(jù),它會(huì)發(fā)送IN令牌包,指定設(shè)備地址和相關(guān)的端點(diǎn)。設(shè)備在收到令牌后,將準(zhǔn)備好的數(shù)據(jù)放入數(shù)據(jù)包中發(fā)送給主機(jī)。
數(shù)據(jù)寫(xiě)入:當(dāng)主機(jī)需要向USB設(shè)備寫(xiě)入數(shù)據(jù)時(shí),它會(huì)發(fā)送OUT令牌包,指定設(shè)備地址和相關(guān)的端點(diǎn)。設(shè)備在接收到令牌后,等待主機(jī)發(fā)送數(shù)據(jù)包,并進(jìn)行數(shù)據(jù)的寫(xiě)入操作。
設(shè)備控制:主機(jī)通過(guò)發(fā)送SETUP令牌包向USB設(shè)備發(fā)送控制信息,例如設(shè)備的配置、狀態(tài)查詢等。設(shè)備收到SETUP令牌后,執(zhí)行相應(yīng)的控制命令。
握手協(xié)議:使用PING令牌包進(jìn)行握手協(xié)議。主機(jī)發(fā)送PING令牌,指定設(shè)備地址和端點(diǎn),設(shè)備收到PING后,可以回復(fù)握手信號(hào),表示是否準(zhǔn)備好繼續(xù)通信
幀起始包(Start-of-Frame?Packets(SOF))
-
SOF包由主機(jī)定期發(fā)出,全速總線為每1.00毫秒±0.0005毫秒一次,高速總線為125微秒±0.0625微秒一次。它包含一個(gè)指示數(shù)據(jù)包類(lèi)型的PID,后跟一個(gè)11位的幀編號(hào)字段。
-
SOF令牌是一個(gè)令牌-only事務(wù)(僅由令牌階段組成的事務(wù)),以精確定時(shí)的間隔分發(fā)SOF標(biāo)記和相應(yīng)的幀編號(hào),對(duì)應(yīng)于每個(gè)幀的開(kāi)始。所有高速和全速功能(包括集線器)都接收SOF包。SOF令牌不會(huì)導(dǎo)致任何接收函數(shù)生成返回?cái)?shù)據(jù)包,因此無(wú)法保證SOF包傳遞到任何給定的功能。
-
SOF令牌主要用于在總線上定期分發(fā)幀號(hào),幫助USB設(shè)備同步其操作。SOF事務(wù)中的令牌僅包含PID(Packet Identifier)和幀編號(hào)字段,沒(méi)有數(shù)據(jù)傳輸或握手。
-
幀和微幀
全速(Full-Speed)幀時(shí)間:
??? USB定義了每1毫秒一個(gè)周期的全速幀時(shí)間
????通過(guò)每1ms發(fā)出一次的SOF令牌來(lái)指示全速幀的開(kāi)始
高速(High-Speed)微幀:
??? USB還定義了高速微幀,其幀時(shí)間為125微秒
????與全速類(lèi)似,SOF令牌用于指示每125μs一個(gè)周期的高速微幀的開(kāi)始
SOF令牌生成:
??? SOF令牌由主機(jī)控制器或集線器事務(wù)轉(zhuǎn)換器(hub transaction translator)生成
????在全速鏈路上,每1毫秒生成一次SOF令牌
????在高速鏈路上,每過(guò)七個(gè)125μs周期后生成一次SOF令牌
高速設(shè)備對(duì)SOF的處理:
????高速設(shè)備在每1ms周期內(nèi)看到具有相同幀號(hào)的SOF令牌共八次(每125μs一次)
????高速設(shè)備可以通過(guò)檢測(cè)具有與之前的 SOF 不同的幀編號(hào)的 SOF 并將其視為第0個(gè)微幀來(lái)本地確定特定的微幀“編號(hào)”。接下來(lái)的 7 個(gè)具有相同幀號(hào)的 SOF 可被視為微幀 1 至 7。
-
SOF應(yīng)用:
幀同步:SOF令牌每隔一定的時(shí)間周期性地發(fā)出,用于同步所有連接到USB總線的設(shè)備。USB設(shè)備根據(jù)SOF令牌的到達(dá)來(lái)確定當(dāng)前幀的開(kāi)始。這對(duì)于協(xié)調(diào)和同步USB總線上的各個(gè)設(shè)備的操作至關(guān)重要。
時(shí)間基準(zhǔn):SOF令牌中包含一個(gè)幀編號(hào)字段,用于標(biāo)識(shí)當(dāng)前幀。USB設(shè)備可以利用幀編號(hào)來(lái)測(cè)量時(shí)間,實(shí)現(xiàn)時(shí)間同步或執(zhí)行與時(shí)間相關(guān)的操作。這對(duì)于需要準(zhǔn)確時(shí)間基準(zhǔn)的應(yīng)用非常重要。
輪詢?cè)O(shè)備:主機(jī)通過(guò)SOF令牌可以定期輪詢連接的USB設(shè)備。設(shè)備可以在SOF令牌的基礎(chǔ)上執(zhí)行特定的操作,例如響應(yīng)主機(jī)的查詢或報(bào)告設(shè)備的狀態(tài)。
管理USB總線帶寬:SOF令牌的周期性發(fā)送確保了USB總線的帶寬分配。USB設(shè)備可以根據(jù)SOF令牌的到達(dá)來(lái)進(jìn)行數(shù)據(jù)傳輸或執(zhí)行其他操作,以確保總線上的有效利用。
數(shù)據(jù)包(Data?Packets)
-
數(shù)據(jù)包由PID、包含零個(gè)或多個(gè)字節(jié)數(shù)據(jù)的數(shù)據(jù)字段以及CRC組成
-
有四種不同PID標(biāo)識(shí)的數(shù)據(jù)包類(lèi)型,分別是DATA0、DATA1、DATA2和MDATA
-
DATA0和DATA1兩種數(shù)據(jù)包PID用于支持?jǐn)?shù)據(jù)切換同步(Data Toggle Synchronization)
-
所有四種數(shù)據(jù)PID在高帶寬高速等時(shí)鐘同步端點(diǎn)(USB 支持單獨(dú)的高速中斷或同步端點(diǎn),這些端點(diǎn)需要高達(dá) 192 Mb/s 的數(shù)據(jù)速率)的數(shù)據(jù)PID排序中使用
?
-
三種數(shù)據(jù)PID(MDATA、DATA0、DATA1)用于分割事務(wù)(Split Transactions)
-
數(shù)據(jù)必須始終以整數(shù)字節(jié)數(shù)發(fā)送
-
數(shù)據(jù)CRC僅計(jì)算在數(shù)據(jù)包的數(shù)據(jù)字段上,不包括PID,而PID有自己的檢查字段
-
低速設(shè)備允許的最大數(shù)據(jù)負(fù)載大小為8字節(jié),全速設(shè)備允許的最大數(shù)據(jù)負(fù)載大小為1023字節(jié),高速設(shè)備允許的最大數(shù)據(jù)負(fù)載大小為1024字節(jié)
SPLIT包(分割事務(wù)包)
在 USB 中,分割事務(wù)(Split Transaction)是一種特殊的通信機(jī)制,允許高速 USB 主機(jī)與全速/低速 USB 設(shè)備進(jìn)行通信。這個(gè)過(guò)程涉及兩個(gè)令牌:開(kāi)始分割事務(wù)令牌(Start-Split Transaction Token)和完成分割事務(wù)令牌(Complete-Split Transaction Token)。這種機(jī)制使得高速主機(jī)能夠與全速或低速設(shè)備進(jìn)行通信,同時(shí)維持 USB 總線的高速性能。分割事務(wù)的應(yīng)用場(chǎng)景通常涉及帶有分層結(jié)構(gòu)的 USB 架構(gòu),例如 USB hub 將高速總線轉(zhuǎn)換為全速或低速總線。
「開(kāi)始分割事務(wù)令牌(Start-Split Transaction Token)」
Hub addr 字段:包含支持此全/低速事務(wù)的指定全/低速設(shè)備的集線器的 USB 設(shè)備地址(與功能地址字段涵義相同(ADD))
SC字段(開(kāi)始/完成):設(shè)置為零的 SPLIT 特殊令牌包指示這是一個(gè)開(kāi)始分割事務(wù)(SSPLIT)。
Port字段:包含此全速/低速事務(wù)指定的目標(biāo)集線器的端口號(hào)。
S字段(速度):指定此中斷或控制事務(wù)的速度 ,?0 – 全速 ?1 – 低速
E字段(結(jié)束):對(duì)于全速等時(shí) OUT 起始分割,S1(起始)和 E(結(jié)束)字段指定高速數(shù)據(jù)有效負(fù)載如何對(duì)應(yīng)全速數(shù)據(jù)包的數(shù)據(jù)
以下開(kāi)始分割情況S字段必須設(shè)置為零:
批量(bulk)事務(wù) IN/OUT?
等時(shí)( isochronous )事務(wù) IN 開(kāi)始分割
以下開(kāi)始分割情況E字段必須設(shè)置為零:
批量(bulk)/控制(control)事務(wù) IN/OUT
中斷(interrupt)?IN/OUT?
等時(shí)( isochronous )事務(wù) IN?
?
ET(Endpoint Type)字段:指定全速/低速事務(wù)的端點(diǎn)類(lèi)型
?
當(dāng)高速主機(jī)需要與全速或低速設(shè)備進(jìn)行通信時(shí),它發(fā)送開(kāi)始分割事務(wù)令牌
-
開(kāi)始分割事務(wù)令牌的發(fā)送表明主機(jī)希望與設(shè)備進(jìn)行通信。
-
主機(jī)等待一段時(shí)間,以便設(shè)備準(zhǔn)備好接收通信。
-
如果設(shè)備可以接收,它返回 NYET(Not Yet)握手,表示尚未完成分割事務(wù)。
-
在收到 NYET 握手后,主機(jī)知道設(shè)備已準(zhǔn)備好接收數(shù)據(jù)。
「完成分割事務(wù)令牌(Complete-Split Transaction Token)」
SC 字段:設(shè)置為 1 ,指示這是一個(gè)完全分割事務(wù) (CSPLIT)
U 字段(保留/未使用):必須置為零 (0B)
完全分割令牌包的其他字段與開(kāi)始分割令牌包具有相同的定義
?
完成分割事務(wù)令牌用于結(jié)束分割事務(wù),確認(rèn)數(shù)據(jù)已經(jīng)成功傳輸給全速/低速設(shè)備。
-
主機(jī)發(fā)送數(shù)據(jù)給設(shè)備,使用全速或低速速率。
-
完成分割事務(wù)令牌用于通知 hub 或主機(jī),數(shù)據(jù)已經(jīng)傳輸完成。
-
如果數(shù)據(jù)傳輸成功,hub 或主機(jī)將返回 ACK 握手。
-
如果出現(xiàn)錯(cuò)誤,可能返回 NAK 或 STALL 握手。
握手包(Handshake?Packets)
?
-
握手包僅由一個(gè)PID組成
-
握手包用于報(bào)告數(shù)據(jù)事務(wù)的狀態(tài),可以返回指示成功接收數(shù)據(jù)、命令接受或拒絕、流量控制和停止條件的值
-
僅支持流量控制的事務(wù)類(lèi)型可以返回握手
-
握手始終在事務(wù)的握手階段返回,可以在數(shù)據(jù)階段返回握手而不是返回?cái)?shù)據(jù)
-
握手包在一個(gè)字節(jié)的數(shù)據(jù)字段后由EOP定界如果一個(gè)數(shù)據(jù)包在解碼為握手包的情況下,在一個(gè)字節(jié)后沒(méi)有以EOP結(jié)束,它必須被視為無(wú)效并被接收器忽略
握手包有四種類(lèi)型以及一種特殊的握手包:
「ACK(確認(rèn))」
-
ACK表示數(shù)據(jù)包在數(shù)據(jù)字段上沒(méi)有發(fā)生比特填充或CRC錯(cuò)誤,且數(shù)據(jù)PID正確接收。
-
ACK可以在序列比特匹配且接收器可以接受數(shù)據(jù)時(shí)發(fā)出,也可以在序列比特不匹配且發(fā)送方和接收方必須重新同步時(shí)發(fā)出。
-
ACK僅適用于已傳輸數(shù)據(jù)且期望握手的事務(wù)。
-
HOST可以為IN事務(wù)返回ACK,而功能(Function)可以為OUT、SETUP或PING事務(wù)返回ACK。
場(chǎng)景:假設(shè)主機(jī)向 USB 設(shè)備的 OUT 端點(diǎn)發(fā)送數(shù)據(jù),設(shè)備成功接收并處理數(shù)據(jù)。
示例:數(shù)據(jù)傳輸結(jié)束后,設(shè)備可以返回 ACK 作為響應(yīng)。主機(jī)接收到 ACK 后,知道數(shù)據(jù)已被成功接收,可以繼續(xù)下一步的通信。
「NAK(否定)」
-
NAK表示功能(Function)無(wú)法從主機(jī)接受數(shù)據(jù)(OUT)或功能沒(méi)有要傳輸給主機(jī)的數(shù)據(jù)(IN)。
-
NAK只能由功能(Function)在IN事務(wù)的數(shù)據(jù)階段或OUT或PING事務(wù)的握手階段返回。
-
主機(jī)永遠(yuǎn)不會(huì)發(fā)出NAK。
-
用于流量控制,表示功能暫時(shí)無(wú)法傳輸或接收數(shù)據(jù),但最終將能夠在無(wú)需主機(jī)干預(yù)的情況下執(zhí)行。
場(chǎng)景:假設(shè)一個(gè) USB 設(shè)備在接收數(shù)據(jù)的過(guò)程中發(fā)現(xiàn)臨時(shí)無(wú)法處理,可能是因?yàn)槠渚彌_區(qū)已滿。
示例:在一個(gè) OUT 事務(wù)中,當(dāng)設(shè)備無(wú)法接受更多的數(shù)據(jù)時(shí),它可以返回 NAK。主機(jī)收到 NAK 后,可能會(huì)嘗試重新發(fā)送數(shù)據(jù),直到設(shè)備準(zhǔn)備好接收。
「STALL(停止)」
-
STALL由功能響應(yīng)IN令牌或OUT數(shù)據(jù)階段后,或響應(yīng)PING事務(wù)后返回。
-
STALL表示功能無(wú)法傳輸或接收數(shù)據(jù),或不支持控制管道請(qǐng)求。
-
在返回STALL后,除了默認(rèn)端點(diǎn)之外的任何端點(diǎn)的功能狀態(tài)未定義。
-
STALL分為兩種情況:功能性STALL和協(xié)議性STALL。功能性STALL在端點(diǎn)的Halt功能被設(shè)置時(shí)發(fā)生,而協(xié)議性STALL是控制管道的特例。
場(chǎng)景:設(shè)備檢測(cè)到數(shù)據(jù)出現(xiàn)錯(cuò)誤或設(shè)備無(wú)法接受主機(jī)的請(qǐng)求,需要中止當(dāng)前的數(shù)據(jù)傳輸。
示例:在一個(gè)控制事務(wù)中,主機(jī)向設(shè)備發(fā)送了一個(gè)請(qǐng)求,但設(shè)備當(dāng)前無(wú)法響應(yīng),可以返回 STALL。這可能是因?yàn)樵O(shè)備不支持該請(qǐng)求,或者由于某種原因?qū)е聼o(wú)法繼續(xù)。主機(jī)接收到 STALL 后,可能采取相應(yīng)的措施,例如中止或重新嘗試傳輸。
「NYET(Not yet)」
-
NYET是僅適用于高速的握手,在PING協(xié)議的一部分或在分割事務(wù)未完成或集線器無(wú)法處理分割事務(wù)時(shí)返回。
-
在PING協(xié)議中,當(dāng)主機(jī)發(fā)出PING事務(wù)并等待高速設(shè)備的響應(yīng)時(shí),設(shè)備可以返回NYET,NYET表示設(shè)備目前不能接受數(shù)據(jù),但可能會(huì)在未來(lái)的某個(gè)時(shí)候能夠。
-
在分割事務(wù)中,如果目標(biāo)端點(diǎn)尚未準(zhǔn)備好接收數(shù)據(jù),集線器可以返回NYET,表示當(dāng)前不能接受數(shù)據(jù)。
-
NYET信號(hào)可以用于流量控制,告知主機(jī)在目標(biāo)端點(diǎn)準(zhǔn)備好之前,暫時(shí)不要發(fā)送更多的數(shù)據(jù)。
場(chǎng)景:假設(shè)一個(gè)高速 USB 設(shè)備正在執(zhí)行分割事務(wù),其中包含一個(gè)低速或全速的子事務(wù),而目標(biāo)設(shè)備還沒(méi)有完成數(shù)據(jù)傳輸。
示例:分割事務(wù)的低速或全速子事務(wù)尚未完成時(shí),集線器可以返回 NYET。主機(jī)可以根據(jù) NYET 信號(hào)來(lái)決定是否等待,以便在目標(biāo)設(shè)備準(zhǔn)備好接收數(shù)據(jù)時(shí)繼續(xù)傳輸。
「ERR(錯(cuò)誤)」
-
ERR是僅適用于高速的握手,允許高速集線器報(bào)告在全速/低速總線上的錯(cuò)誤。
-
僅由高速集線器作為分割事務(wù)協(xié)議的一部分返回。
場(chǎng)景:假設(shè)一個(gè)高速 USB 集線器在執(zhí)行分割事務(wù)時(shí)發(fā)生了錯(cuò)誤,導(dǎo)致無(wú)法完成全速或低速事務(wù)。
示例:集線器可能返回 ERR,通知主機(jī)發(fā)生了錯(cuò)誤。主機(jī)在接收 ERR 后,可能會(huì)采取適當(dāng)?shù)拇胧鐕L試重新發(fā)送數(shù)據(jù)或采取其他糾正措施。
3往期回顧
?
?USB系列文章在合集 #USB2.0?
(1)深入理解USB2.0通信協(xié)議——框架概述
(2)深入理解USB2.0通信協(xié)議——數(shù)據(jù)流傳輸模型
(3)深入理解USB2.0通信協(xié)議——電氣及物理層規(guī)范
?
4寫(xiě)在最后
?
創(chuàng)作不易,如果覺(jué)得這篇文章對(duì)您有用的話,記得點(diǎn)贊關(guān)注哦~
您的關(guān)注是我更新的動(dòng)力
?
?
原文標(biāo)題:深入理解USB2.0通信協(xié)議——解讀USB報(bào)文的神秘語(yǔ)言!
文章出處:【微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論
查看更多