本篇筆記寫的很糙,在這里你會(huì)看到很多專業(yè)名詞,可能會(huì)一臉懵逼,但還是先發(fā)出來(lái)給大家看看,沒有基礎(chǔ)的不用細(xì)看,大概了解即可,后面的筆記將把這些內(nèi)容揉碎了再呈現(xiàn)給大家。而且當(dāng)時(shí)看的例程是 HID 鼠標(biāo)的,比較復(fù)雜,內(nèi)核代碼也沒有使用狀態(tài)機(jī),比較難以理解,但是魚鷹接下來(lái)的例程用了狀態(tài)機(jī),并且魚鷹畫了整個(gè)狀態(tài)機(jī)的運(yùn)行流程圖,將更加清晰易懂,所以 HID 的例程暫時(shí)就不再提供給大家。
現(xiàn)在和電腦通信基本上是采用 USB 進(jìn)行通信,所以我們有必要學(xué)習(xí) USB 協(xié)議。而 USB 協(xié)議中最重要的一種傳輸就是控制傳輸。
串口通信在設(shè)置串口波特率、連上線后是沒有數(shù)據(jù)傳輸?shù)模挥性陔娔X或設(shè)備發(fā)送數(shù)據(jù)時(shí),線上才會(huì)有數(shù)據(jù)傳輸,而 USB 設(shè)備不同,在設(shè)備插入電腦時(shí),電腦就開始和設(shè)備進(jìn)行交流了,就像人們剛見面就打招呼似的。但是 USB 主機(jī)可不是僅僅問你(USB 設(shè)備)有沒有吃飯什么的,而是全面的了解你的信息(必要信息)。
為了獲得你的信息,就必須有一個(gè)通道,還有一個(gè)雙方支持的通信格式才行。所以就有了控制端點(diǎn)。控制端點(diǎn)是一個(gè)具有雙向通信能力的默認(rèn)端點(diǎn)(也叫缺省端點(diǎn)),是一個(gè) USB 設(shè)備必須支持的端點(diǎn)。初期的枚舉過程都在該端點(diǎn)上完成。枚舉過程是一個(gè) USB 設(shè)備必須經(jīng)歷的一個(gè)過程。通過枚舉,讓主機(jī)了解設(shè)備的一些基本信息。而枚舉過程的實(shí)現(xiàn)就是通過控制傳輸實(shí)現(xiàn)的。我們通過枚舉過程來(lái)了解控制傳輸。
首先確定控制傳輸是四大傳輸之一,也是最基本的傳輸,所有的 USB 設(shè)備都必須支持。它是可靠的傳輸,具有最少兩個(gè)個(gè)階段,建立階段(Setup Stage)、狀態(tài)階段(Data Stage),還有一個(gè)數(shù)據(jù)階段(Status Stage)是可能會(huì)有的。建立階段是由建立傳輸事務(wù)(Setup Transaction)實(shí)現(xiàn)的,狀態(tài)階段和數(shù)據(jù)階段是由數(shù)據(jù)輸出(Data Out Transaction)或輸入事務(wù)(Data IN Transaction)實(shí)現(xiàn)的(如果數(shù)據(jù)太多,將會(huì)采用多次數(shù)據(jù)輸入或輸出事務(wù))。如下圖,本文將主要講這圖中的內(nèi)容,一定要明白它們之間的關(guān)系。
各種可能的控制傳輸過程:
(SETUP(0)由三個(gè)包組成:SETUP Packet 、DATA0 Packet、ACK Packet;
OUT(1)由三個(gè)包組成:OUT Packet 、DATA1 Packet、ACK Packet;
IN(1)由三個(gè)包組成:IN Packet 、DATA0 Packet、ACK Packet 。這里的 SETUP 、DATA0 、ACK 、OUT 、IN 是 PID)
一個(gè)事務(wù)又是由各種包組成的。包又分為四大類包:Token(令牌)Packet、Data(數(shù)據(jù)) Packet、 Handshake(握手)Packet、特殊 Packet。每類包中又分為各種具體的包(由 PID(Packet ID)確定該包屬于哪一種包)。需要注意的是包是 USB 傳輸最小的傳輸單位、所有數(shù)據(jù)都必須進(jìn)行打包才可以進(jìn)行傳輸,包格式如下。
(灰色區(qū)域表示每個(gè)包都有,彩色表示可能有)
因?yàn)橛懈鞣N不同的包,各種包的具體格式也不盡相同。所以我們只分析我們需要的包。為了簡(jiǎn)化內(nèi)容,讓我們能夠?qū)⒆⒁饬性谖覀冃枰臇|西上,我們都以包來(lái)進(jìn)行說(shuō)明,包里面具體的其他內(nèi)容,將選擇性的了解,對(duì)于包,我們也只對(duì)需要的包進(jìn)行說(shuō)明。
令牌包:SETUP 包、OUT 包、IN 包。(主機(jī)發(fā)送)
主機(jī)最開始會(huì)發(fā)出的包,標(biāo)志一次傳輸事務(wù)的開始,里面有 PID(標(biāo)志這個(gè)是什么包,SETUP 包中的 PID 就是 SETUP)、地址(包括設(shè)備地址,端點(diǎn)地址)、CRC(對(duì)地址信息進(jìn)行校驗(yàn))。在程序中我們可以知道是什么類型的包。
數(shù)據(jù)包:DATA0 包、DATA1 包。(主機(jī)設(shè)備都可以發(fā)送)
里面有 PID、數(shù)據(jù)、CRC(對(duì)數(shù)據(jù)信息進(jìn)行校驗(yàn))。這是用戶真正要關(guān)心的數(shù)據(jù)。里面的數(shù)據(jù)我們是可以進(jìn)行查看的。我們枚舉過程處理的就是這些數(shù)據(jù)。
握手包:STALL 包、NAK 包、ACK 包(主機(jī)只能發(fā)送 ACK 包)
里面只有 PID。
ACK 包:表示正確接收數(shù)據(jù),并且有足夠的空間來(lái)容納數(shù)據(jù),主機(jī)和設(shè)備都可以用 ACK 確認(rèn),而 NAK,STALL,NYET 只有設(shè)備能夠返回,主機(jī)不能使用(因?yàn)檎?qǐng)求都是主機(jī)發(fā)送,當(dāng)主機(jī)發(fā)送請(qǐng)求了,就說(shuō)明已經(jīng)準(zhǔn)備好了,自然不應(yīng)該有這些回答)。
NAK 包:表示沒有數(shù)據(jù)需要返回,或者數(shù)據(jù)接收正確但是沒有足夠的空間來(lái)容納數(shù)據(jù),當(dāng)主機(jī)收到 NAK 是,知道設(shè)備沒有準(zhǔn)備好,主機(jī)會(huì)在合適的時(shí)機(jī)進(jìn)行重新傳輸。
STALL 包:表示設(shè)備無(wú)法執(zhí)行這個(gè)請(qǐng)求,或者端點(diǎn)已經(jīng)被掛起,它表示一種錯(cuò)誤的狀態(tài)。設(shè)備返回 STALL
后需要主機(jī)進(jìn)行干預(yù)才能解除這種 STALL 狀態(tài)。
注意:返回 NAK 并不代表數(shù)據(jù)出錯(cuò),只是說(shuō)明設(shè)備暫時(shí)沒有數(shù)據(jù)傳輸或暫時(shí)沒有能力接收數(shù)據(jù) . 當(dāng)主機(jī)或設(shè)備檢測(cè)到數(shù)據(jù)出錯(cuò)時(shí)(如 CRC 校驗(yàn)出錯(cuò),PID 校驗(yàn)出錯(cuò),位填充出錯(cuò)等 )將什么也不返回。這時(shí)等待握手包的一方就會(huì)因?yàn)槭詹坏轿帐职却瑫r(shí)。
現(xiàn)在有了這些基礎(chǔ)知識(shí),我們?yōu)榱烁宄J(rèn)識(shí)控制傳輸,就通過講解 usb_core.h、 usb_core.c 文件(本文必須結(jié)合這兩個(gè)文件)來(lái)了解枚舉過程,進(jìn)而認(rèn)識(shí)控制傳輸。
之前也說(shuō)過,枚舉過程是通過控制傳輸實(shí)現(xiàn)的,那么現(xiàn)在就來(lái)看看當(dāng)你把一個(gè) USB 設(shè)備插入主機(jī)時(shí),它的枚舉過程是怎樣的。
首先,弄清楚一點(diǎn),這兩個(gè)文件處理的就是枚舉過程,也是整個(gè) USB 程序中最最核心的部分,所有的 USB 相關(guān)的文件都是以它為基礎(chǔ)。它定義了各種結(jié)構(gòu)體,各種聯(lián)合體。而其他文件就是根據(jù)這個(gè)結(jié)構(gòu)體、聯(lián)合體進(jìn)行具體的定義,并且寫出具體的實(shí)現(xiàn)的方法。弄明白這兩個(gè)文件是重中之重。
因?yàn)榭刂苽鬏敱容^復(fù)雜,和上一個(gè)狀態(tài)有很大關(guān)系。所以定義了一個(gè)枚舉類型 CONTROL_STATE 確定程序當(dāng)前的各種狀態(tài)。還有結(jié)構(gòu)體 ENDPOINT_INFO、DEVICE_INFO、DEVICE_PROP,還有一個(gè)特殊的結(jié)構(gòu)體 USER_STANDARD_REQUESTS 等各種類型。
CONTROL_STATE:確定當(dāng)前的端點(diǎn)的傳輸狀態(tài)
ENDPOINT_INFO:端點(diǎn)傳輸數(shù)據(jù)的信息,包括要發(fā)送或接收的剩余數(shù)據(jù)長(zhǎng)度,已經(jīng)發(fā)送或接收的數(shù)據(jù)偏移,該端點(diǎn)的最大包長(zhǎng)(決定了該端點(diǎn)一次處理的數(shù)據(jù)的能力),要發(fā)送或接收數(shù)據(jù)的地址。(數(shù)據(jù)長(zhǎng)度和地址由具體的函數(shù)提供,這個(gè)結(jié)構(gòu)體有一個(gè)函數(shù)指針指向具體實(shí)現(xiàn)函數(shù)。也就是說(shuō)要接收或發(fā)送數(shù)據(jù)的大小和地址是由具體的函數(shù)實(shí)現(xiàn)的)。
DEVICE_INFO:包含了設(shè)備的狀態(tài)信息,控制端點(diǎn)的傳輸狀態(tài)(CONTROL_STATE 控制傳輸狀態(tài)),控制端點(diǎn)的信息(ENDPOINT_INFO 的具體實(shí)現(xiàn)),還有標(biāo)準(zhǔn)請(qǐng)求的數(shù)據(jù)信息。
DEVICE_PROP:這里面包含了具體的實(shí)現(xiàn)函數(shù)。如具體設(shè)備的硬件相關(guān)的函數(shù)實(shí)現(xiàn)
void (*Init)(void);,復(fù)位信號(hào)發(fā)過來(lái)時(shí)的處理函數(shù)void (*Reset)(void);,控制傳輸中的狀態(tài)階段的處理函數(shù)void (*Process_Status_IN)(void);void (*Process_Status_OUT)(void);,發(fā)送接收函數(shù)的具體實(shí)現(xiàn)函數(shù),就是之前的 ENDPOINT_INFO 中需要的具體實(shí)現(xiàn)函數(shù)。等等。
USER_STANDARD_REQUESTS:這個(gè)結(jié)構(gòu)體就比較特殊了,因?yàn)檫@個(gè)結(jié)構(gòu)體的函數(shù)是用來(lái)給用戶使用的。比如主機(jī)發(fā)送了什么信息過來(lái),我們把數(shù)據(jù)發(fā)出去了,那么我們還要告知用戶(我們的程序),我們做了這些操作才行,但是這些操作函數(shù)有的可以省去的,而不會(huì)影響正常通信,雖然不會(huì)影響正常通信,但是對(duì)設(shè)備本身還是有可能有影響的。
現(xiàn)在我們來(lái)具體看看主機(jī)與設(shè)備是怎么通信的,所以看它的使用函數(shù) void CTR_LP(void)(usb_int.c 文件),USB 通信是在中斷函數(shù)中的。
在我們插上 USB 設(shè)備時(shí),枚舉過程數(shù)據(jù)(串口接收到的數(shù)據(jù)):
1.SETUP:80 6 1 0 40 發(fā)送數(shù)據(jù):112 200 0 4000 483 5710 200 201 103 IN:OUT:
2.SETUP:0 5 100 0 0 IN:
3.SETUP:80 6 1 0 12 發(fā)送數(shù)據(jù):112 200 0 4000 483 5710 200 201 103 IN:OUT:
4.SETUP:80 6 2 0 ff 發(fā)送數(shù)據(jù):209 22 101 e000 932 4 100 103 2 2109 100 100 4a22 700 8105 403 2000 IN:OUT:
5.SETUP:80 6 303 904 ff 發(fā)送數(shù)據(jù):31a 38 ff ff ff 33 41 37 31 21 63 15 57 IN:OUT:
6.SETUP:80 6 3 0 ff 發(fā)送數(shù)據(jù):304 409 IN:OUT:
7.SETUP:80 6 203 904 ff 發(fā)送數(shù)據(jù):322 41 4c 49 45 4e 54 45 4b 20 89e6 63a7 55 53 42 9f20 6807 IN:OUT:
8.SETUP:80 6 6 0 a
9.SETUP:80 6 1 0 12 發(fā)送數(shù)據(jù):112 200 0 4000 483 5710 200 201 103 IN:OUT:
10.SETUP:80 6 2 0 9 發(fā)送數(shù)據(jù):209 22 101 e000 932 IN:OUT:
11.SETUP:80 6 2 0 22 發(fā)送數(shù)據(jù):209 22 101 e000 932 4 100 103 2 2109 100 100 4a22 700 8105 403 2000 IN:OUT:
12.SETUP:0 9 100 0 0 IN:
13.SETUP:21 a 0 0 0
注意:因?yàn)橛玫氖?printf 函數(shù)發(fā)送的,所以有些是省去了,有些高字節(jié)和低字節(jié)可能換了,所以分析時(shí)要注意。
我們現(xiàn)在主要分析傳輸過程,而不是具體數(shù)據(jù)的處理,所以不要太關(guān)心具體數(shù)據(jù)。
我們假設(shè)前期工作都做好了,USB 能通信了,既然如此,程序必定會(huì)進(jìn)入 usb_int.c 文件中的 void CTR_LP(void)函數(shù)。當(dāng)?shù)谝淮芜M(jìn)入此函數(shù)時(shí),就說(shuō)明一次傳輸事務(wù)成功完成。從包的角度來(lái)看就是主機(jī)發(fā)送一個(gè) SETUP 包,再發(fā)一個(gè) DATA 包,設(shè)備確認(rèn)數(shù)據(jù)的正確性(從 PID 和 CRC 確定)然后發(fā)送 ACK 包。設(shè)備硬件將該端點(diǎn)自動(dòng)設(shè)置為 NAK(此時(shí)如果主機(jī)發(fā)送包過來(lái),一律以 NAK 回應(yīng),表示忙著呢,還沒有準(zhǔn)備好),使設(shè)備有足夠的時(shí)間處理 DATA 包中的數(shù)據(jù)。在這之后程序才運(yùn)行到了 CTR_LP()函數(shù)里。
程序每運(yùn)行到這里一次,意味著主機(jī)發(fā)送的設(shè)備地址和端點(diǎn)號(hào)正確,也意味著一次傳輸事務(wù)的結(jié)束。這一點(diǎn)要牢記。
現(xiàn)在我們看著設(shè)備接收到的數(shù)據(jù)再理一理過程。(以下內(nèi)容必須結(jié)合附帶工程進(jìn)行驗(yàn)證)
SETUP:80 6 1 0 40 發(fā)送數(shù)據(jù):112 200 0 4000 483 5710 200 201 103 IN:OUT:
設(shè)備的一次傳輸事務(wù)結(jié)束了(從 SETUP:看出)(第一次進(jìn)入 CTR_LP()),先判斷這次傳輸事務(wù)是什么類型傳輸事務(wù)(STM32 中有一個(gè)標(biāo)志位可以進(jìn)行判斷),然后發(fā)現(xiàn)是建立令牌包,那么就是建立傳輸事務(wù),現(xiàn)在就轉(zhuǎn)到建立傳輸事務(wù)程序中。
在該程序中,先把數(shù)據(jù)包中的數(shù)據(jù)拷貝出來(lái)再說(shuō)。
拷完了,同時(shí)設(shè)置當(dāng)前的設(shè)備狀態(tài)為 SETTING_UP,表示開始處理一次建立事務(wù),然后發(fā)現(xiàn)這是一個(gè)有數(shù)據(jù)階段的建立傳輸事務(wù)而且是設(shè)備發(fā)送數(shù)據(jù)給主機(jī)(怎么發(fā)現(xiàn)的就看具體的標(biāo)準(zhǔn)請(qǐng)求格式吧,現(xiàn)在只說(shuō)結(jié)果)。
好吧,看看要什么數(shù)據(jù),發(fā)現(xiàn)要設(shè)備描述符,長(zhǎng)度是 64 字節(jié)。那行,只是我的設(shè)備描述符只有 18 字節(jié),怎么辦,不管,就發(fā) 18 字節(jié)過去。
發(fā)送完這 18 字節(jié)后程序第二次進(jìn)入了 CTR_LP()函數(shù)(從 IN:看出),剛剛設(shè)備把數(shù)據(jù)發(fā)送出去了,這次進(jìn)入相關(guān)處理函數(shù)也就沒什么事干了,就等著主機(jī)發(fā)送狀態(tài)數(shù)據(jù)過來(lái)呢,所以設(shè)置設(shè)備狀態(tài)為 WAIT_STATUS_OUT,表示正在等待主機(jī)發(fā)送狀態(tài)數(shù)據(jù)(之后發(fā)送端點(diǎn)狀態(tài)設(shè)為 STALL,表示如果主機(jī)發(fā)送 IN 令牌包將以 STALL 握手包進(jìn)行回應(yīng))。
然后第三次進(jìn)入 CTR_LP()函數(shù)(從 OUT:看出),因?yàn)槭?OUT 包,所以是一次數(shù)據(jù)輸出事務(wù)的完成(沒有寫錯(cuò),就是輸出,這是對(duì)于主機(jī)來(lái)說(shuō)),這時(shí)設(shè)備就知道這應(yīng)該是狀態(tài)階段的數(shù)據(jù)了,經(jīng)過一系列的判斷,發(fā)現(xiàn)確實(shí)是(之后發(fā)送接收端點(diǎn)都設(shè)置為 STALL)。
到這里一個(gè)完整的控制傳輸過程算是完成了。但是一個(gè)枚舉過程是由很多這樣的控制傳輸過程構(gòu)成的。
SETUP:0 5 100 0 0 IN:
第二次建立傳輸事務(wù)又來(lái)了(從 SETUP:看出),也標(biāo)志著一次控制傳輸?shù)拈_始(建立階段)。看看有沒有數(shù)據(jù)要發(fā)送或輸入,嗯,好像沒有,而且是設(shè)置地址的(這里有地址信息,就是 1),那行,開始設(shè)置地址吧?
那可不不行,USB 協(xié)議規(guī)定,設(shè)置地址的工作必須在設(shè)備發(fā)送狀態(tài)數(shù)據(jù)(狀態(tài)階段沒有具體的數(shù)據(jù),也就是說(shuō)數(shù)據(jù)區(qū)為 0 字節(jié))到主機(jī),主機(jī)接收到后發(fā)送 ACK 握手包后被設(shè)備接收到才能進(jìn)行設(shè)置設(shè)備的地址(為什么這么規(guī)定,可能是防止中間出現(xiàn)問題吧)。
所以在程序中還真沒進(jìn)行設(shè)置地址的工作,而是只是設(shè)置設(shè)備當(dāng)前的狀態(tài)為 WAIT_STATUS_IN,什么意思,就是表示設(shè)備正在等待發(fā)送狀態(tài)數(shù)據(jù)呢(為什么要等,而不是直接發(fā)送,這是因?yàn)?USB 是有主從關(guān)系的,主機(jī)沒叫你發(fā)送數(shù)據(jù),你是不能發(fā)送數(shù)據(jù)的,你只能把數(shù)據(jù)放在緩存區(qū)中,并且設(shè)置發(fā)送端點(diǎn)有效。當(dāng)設(shè)備收到 IN 令牌包時(shí),它就自動(dòng)由硬件發(fā)送出去了)。
當(dāng)主機(jī)成功收到狀態(tài)階段的數(shù)據(jù)時(shí)就會(huì)發(fā)送 ACK 握手包。然后設(shè)備接收到了握手包,這時(shí)也就意味著一次數(shù)據(jù)輸入事務(wù)(狀態(tài)階段)的結(jié)束,此時(shí),程序再次運(yùn)行到 CTR_LP()這里(從 IN:看出),并進(jìn)入到相關(guān)處理函數(shù),這時(shí)相關(guān)處理函數(shù)就會(huì)設(shè)置地址了,此后發(fā)送和接收的端點(diǎn)再次變?yōu)?STALL。
上面這些都是正常的控制傳輸,如果不正常(不正常不代表數(shù)據(jù)出錯(cuò),而是請(qǐng)求不合理)的呢?我們跳過正常的,直接看下面這一次控制傳輸。
SETUP:80 6 6 0 a
看這條請(qǐng)求代碼是 6(后面那個(gè)),要求發(fā)送 10 個(gè)字節(jié)數(shù)據(jù)給主機(jī),但是我的設(shè)備沒有這種代碼為 6 的描述符,怎么辦。USB 協(xié)議規(guī)定有些請(qǐng)求是必須支持的,但是有些請(qǐng)求卻不一定要支持。這個(gè)描述符沒有應(yīng)該怎么處理呢。
分析程序,最終你會(huì)發(fā)現(xiàn)控制狀態(tài)設(shè)置為 STALLED,也就是說(shuō)在主機(jī)下一個(gè) IN 令牌包(在此之前主機(jī)可能已經(jīng)發(fā)送了多次 IN 令牌包過來(lái),只是設(shè)備都以 NAK 包進(jìn)行回應(yīng))來(lái)的時(shí)候,設(shè)備會(huì)返回一個(gè) STALL 包,當(dāng)主機(jī)收到這個(gè)握手包之后,就知道設(shè)備不支持該請(qǐng)求,它就會(huì)放棄繼續(xù)發(fā)送 IN 令牌包,而是發(fā)送 SETUP 包,因?yàn)樵O(shè)備控制端點(diǎn)處于 STALL 狀態(tài)時(shí),必須主機(jī)進(jìn)行干預(yù)才能幫助設(shè)備解除這種狀態(tài)。
由于此次控制傳輸是設(shè)備不支持的請(qǐng)求,所以就沒有數(shù)據(jù)階段,同時(shí)也沒有狀態(tài)階段,既然不需要發(fā)送或接收數(shù)據(jù),也就不會(huì)在建立傳輸事務(wù)來(lái)之前再次進(jìn)入程序了。但是如果發(fā)送的請(qǐng)求為輸出數(shù)據(jù),那么程序就會(huì)直接接收數(shù)據(jù)了。
說(shuō)了這么多,下面進(jìn)行一些總結(jié):
1. 程序運(yùn)行到 CTR_LP()里面,就說(shuō)明一次事務(wù)傳輸?shù)耐瓿桑还苁墙⑹聞?wù)還是數(shù)據(jù)輸入輸出事務(wù)。注意是已經(jīng)完成,而不是將要完成。
2. 數(shù)據(jù)如果出錯(cuò)了,只會(huì)有錯(cuò)誤中斷產(chǎn)生,而不會(huì)產(chǎn)生傳輸完成中斷,也就不會(huì)進(jìn)入 CTR_LP()服務(wù)程序中。
3. 注意分析每一次事務(wù)傳輸?shù)耐瓿蓪⑹巩?dāng)前端點(diǎn)的發(fā)送接收狀態(tài)產(chǎn)生何種影響,又會(huì)對(duì)之后的事務(wù)傳輸產(chǎn)生何種影響。
4. 每一次控制傳輸?shù)慕Y(jié)束,都會(huì)使端點(diǎn)發(fā)送和接收狀態(tài)都設(shè)為 STALL。
5. 控制傳輸在請(qǐng)求不支持情況下沒有狀態(tài)階段的數(shù)據(jù)。
6. 建立階段也由三個(gè)包組成,SETUP 令牌包 、DATA0 數(shù)據(jù)包(只能是 DATA0)、ACK 握手包。也是一次建立事務(wù)。
7. 數(shù)據(jù)階段也由三個(gè)包組成,OUT/IN 令牌包 、DATA0/1 數(shù)據(jù)包、ACK 握手包。也是一次數(shù)據(jù)輸出或輸入事務(wù)。在建立傳輸中有可能有多次該傳輸事務(wù)。
8. 狀態(tài)階段也由三個(gè)包組成,OUT/IN 令牌包 、DATA1 數(shù)據(jù)包、ACK 握手包。也是一次數(shù)據(jù)輸出或輸入事務(wù)。但是它沒有用戶所使用的數(shù)據(jù)。
9.OUT、IN 是對(duì)于主機(jī)來(lái)說(shuō)的。OUT 就是主機(jī)向設(shè)備發(fā)送數(shù)據(jù)。
10. 注意根據(jù)實(shí)際數(shù)據(jù)進(jìn)行分析。
注意:如果使用 USB 協(xié)議分析軟件,你會(huì)發(fā)現(xiàn)軟件的捕獲數(shù)據(jù)不全,所以要根據(jù)設(shè)備串口發(fā)送的數(shù)據(jù)進(jìn)行分析
審核編輯 黃宇
-
通信
+關(guān)注
關(guān)注
18文章
6133瀏覽量
136970 -
USB協(xié)議
+關(guān)注
關(guān)注
0文章
29瀏覽量
14419
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
TCP傳輸控制協(xié)議知識(shí)科普拓展

USB充電協(xié)議端口控制IC
什么是USB PD協(xié)議
傳輸控制協(xié)議(TCP)/網(wǎng)絡(luò)層協(xié)議是什么意思
USB培訓(xùn)_Part1 協(xié)議
USB電源傳輸技術(shù)的詳細(xì)資料說(shuō)明

一文詳解TCP傳輸控制協(xié)議

傳輸控制協(xié)議TCP是怎樣進(jìn)行工作的

USB電力傳輸(USB PD)和USB Type-C的不同之處是什么?

SCTP流控制傳輸協(xié)議簡(jiǎn)析

USB接口控制傳輸包含哪幾個(gè)階段?

評(píng)論