USB學(xué)習(xí)系列之四——USB包結(jié)構(gòu)
2.不同的包所包含的域是不同的,但是都有共同的特點(diǎn)是:以同步域開始,緊跟著一個(gè)包標(biāo)識(shí)符PID,最終以包結(jié)束符EOP結(jié)束這個(gè)包。
本文引用地址:http://m.butianyuan.cn/article/201612/330044.htm3.同步域:高速USB串行接口引擎數(shù)據(jù)傳輸要開始了,同時(shí)也提供同步時(shí)鐘。對(duì)于低速設(shè)備和全速設(shè)備,同步域使用的是0000 0001(二進(jìn)制數(shù));對(duì)于高速設(shè)備使用的是00000000 00000000 00000000 00000001。
注意:這個(gè)是對(duì)發(fā)送端的要求,接收端解碼時(shí),0的個(gè)數(shù)可以少于這個(gè)數(shù)目。
4.包結(jié)束符:包結(jié)束符一共有8位,其中USB協(xié)議使用的只有4位(PID0~PID3),另外4位(PID4~PID7)是前四位的取反,用來(lái)校驗(yàn)PID。USB協(xié)議規(guī)定了四類包,分別是:令牌包(PID1~PID0為01)、數(shù)據(jù)包(PID1~PID0為11)、握手包(PID1~PID0為10)和特殊包(PID1~PID0為00)。以下為USB2.0協(xié)議的包,帶*的為USB1.1協(xié)議沒有的:
5.令牌包:令牌包用來(lái)啟動(dòng)一次USB傳輸。主機(jī)發(fā)送一個(gè)令牌來(lái)通知哪個(gè)設(shè)備進(jìn)行響應(yīng),如何響應(yīng)。
輸入令牌包:用來(lái)通知設(shè)備將要輸出一個(gè)數(shù)據(jù)包。
輸出令牌包:用來(lái)通知設(shè)備返回一個(gè)數(shù)據(jù)包。
建立令牌包:只用在控制傳輸中,通知設(shè)備輸出一個(gè)數(shù)據(jù)包,建立令牌包后只使用DATA0數(shù)據(jù)包,且只能發(fā)送到設(shè)備的控制端點(diǎn),并且設(shè)備必須要接收,而輸出令牌包沒有這些限制。
幀起始包:在每幀開始時(shí)發(fā)送,以廣播的形式發(fā)送。USB全速設(shè)備沒毫秒產(chǎn)生一個(gè)幀,高速設(shè)備每125微秒產(chǎn)生一個(gè)幀。USB主機(jī)會(huì)對(duì)當(dāng)前的幀號(hào)進(jìn)行計(jì)數(shù),在每次幀開始時(shí)通過(guò)SOF包發(fā)送幀號(hào)(或者微幀開始時(shí),每毫秒有八個(gè)微幀,這8個(gè)微幀的幀號(hào)是一樣的)。SOF中的幀號(hào)是11位。
注意:在4個(gè)令牌包中,只有SOF令牌包之后不能跟數(shù)據(jù)傳輸,其他的都有數(shù)據(jù)傳輸。每個(gè)令牌包之后都有一個(gè)CRC5的校驗(yàn),它只校驗(yàn)PID之后的數(shù)據(jù),不包括PID本身,因?yàn)镻ID本身的后4位已經(jīng)有取反的校驗(yàn)機(jī)制了。
由于SOF令牌包之后不跟隨數(shù)據(jù)傳遞,所以SOF令牌包和其他三種包的結(jié)構(gòu)不同,具體如下圖所示:
SOF令牌包結(jié)構(gòu)圖
IN、OUT、SETUP令牌包結(jié)構(gòu)圖
6.數(shù)據(jù)包
USB1.1中只有DATA0和DATA1兩種數(shù)據(jù)包。
USB2.0中增加了DATA2和MDATA兩種數(shù)據(jù)包,這兩種數(shù)據(jù)包主要用在高速分裂事物和高速高帶寬同步傳輸中。
數(shù)據(jù)包的統(tǒng)一結(jié)構(gòu):同步域 + 8位包標(biāo)志PID + 整數(shù)字節(jié)數(shù)據(jù) + CRC16校驗(yàn) + EOP。
之所以有不同類型的數(shù)據(jù)包,是用在握手包出錯(cuò)時(shí)糾錯(cuò)。具體解釋如下:
主機(jī)和設(shè)備都會(huì)維護(hù)自己的一個(gè)數(shù)據(jù)包類型切換機(jī)制:當(dāng)數(shù)據(jù)包成功發(fā)送或者接收時(shí),數(shù)據(jù)包類型切換。當(dāng)檢測(cè)到對(duì)方所使用的數(shù)據(jù)包類型不對(duì)時(shí),USB系統(tǒng)認(rèn)為這發(fā)生了一個(gè)錯(cuò)誤,并試圖從錯(cuò)誤中恢復(fù)。數(shù)據(jù)包類型不匹配主要發(fā)生在握手包被損壞的時(shí)候。當(dāng)一端已經(jīng)正確接收到數(shù)據(jù)并且返回確認(rèn)信號(hào)后,確認(rèn)信號(hào)在傳輸過(guò)程中被損壞。這時(shí)另一端就無(wú)法知道剛才發(fā)送的數(shù)據(jù)是否已經(jīng)發(fā)送成功,這時(shí)只好繼續(xù)保持自己的數(shù)據(jù)包類型不變。如果對(duì)方下一次使用的數(shù)據(jù)包類型跟自己的不一致,則說(shuō)明它剛剛已經(jīng)成功接收到數(shù)據(jù)包;如果對(duì)方下一次使用的數(shù)據(jù)包跟自己的一致,則說(shuō)明對(duì)方?jīng)]有切換數(shù)據(jù)包類型,也就是剛剛的數(shù)據(jù)包沒有發(fā)送成功,這是上一次的重試操作。
7.握手包
握手包用來(lái)表示一個(gè)傳輸是否被對(duì)方確認(rèn)。
握手包的結(jié)構(gòu):同步域 +
握手包有ACK、NAK、STALL和NYET。
ACK:表示正確接收數(shù)據(jù),并且有足夠的空間來(lái)容納數(shù)據(jù)。主機(jī)和設(shè)備都可以用ACK來(lái)確認(rèn),而NAK、STALL和NYET只有設(shè)備能夠返回,主機(jī)不能使用這些握手包。
NAK:表示沒有數(shù)據(jù)需要返回,或者數(shù)據(jù)正確接收但是沒有足夠的空間來(lái)容納。當(dāng)主機(jī)接收到NAK時(shí),知道設(shè)備還沒有準(zhǔn)備好,主機(jī)會(huì)在以后合適的實(shí)際進(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)。
NYET:只有在USB2.0高速設(shè)備輸出事物中使用,它表示設(shè)備本次數(shù)據(jù)成功接收,但是沒有足夠的空間來(lái)接收下一次數(shù)據(jù)。主機(jī)在下一次輸出數(shù)據(jù)時(shí),將先使用PING命令牌包來(lái)探測(cè)設(shè)備是否有足夠的空間接收數(shù)據(jù),一面不必要的帶寬浪費(fèi)。
注意:NAK并不表示數(shù)據(jù)出錯(cuò),當(dāng)USB主機(jī)或者設(shè)備檢測(cè)到數(shù)據(jù)出錯(cuò)時(shí),將什么都不返回,這時(shí)等待接收握手包的一方就會(huì)收不到握手包從而等待超時(shí)。
8.特殊包
特殊包是在一些特殊場(chǎng)合使用的包??偣灿兴姆N:PRE、ERR、SPLIT和PING。其中PRE、SPLIT、PING是令牌包,ERR是握手包。ERR、SPLIT、PING三個(gè)是在USB2.0協(xié)議中增加的。
(1)PRE:通知集線器打開其低速端口的一種前導(dǎo)包,PRE只能使用在全速模式中。一般情況下集線器不會(huì)將全速信號(hào)發(fā)送給低速設(shè)備,只有當(dāng)接收到PRE令牌包之后,才打開其低速端口。
PRE令牌包結(jié)構(gòu):同步域 +
當(dāng)需要傳送低速事務(wù)時(shí),主機(jī)首先發(fā)送一個(gè)PRE令牌包(以全速模式發(fā)送)。對(duì)于全速設(shè)備,將會(huì)忽略這個(gè)令牌包。集線器在接收到這個(gè)令牌包之后,打開其連接了低速設(shè)備的端口,接著主機(jī)就會(huì)以低速模式給低速設(shè)備發(fā)送令牌包和數(shù)據(jù)包等。
(2)PING:令牌包結(jié)構(gòu)同OUT令牌包。但是PING令牌包后不發(fā)送數(shù)據(jù),而是等待設(shè)備返回ACK或者NAK,以判斷設(shè)備是否能夠傳送數(shù)據(jù)。在USB2.0中的高速環(huán)境中才會(huì)使用PING令牌包,且只被使用在批量傳輸和控制傳輸事務(wù)中。
(3)SPLIT:高速事務(wù)分裂令牌包,通知集線器將高速數(shù)據(jù)包轉(zhuǎn)化為全速或者低速數(shù)據(jù)包發(fā)送給其下面的端口。
(4)ERR:在分裂事務(wù)中表示錯(cuò)誤使用。高速分裂事務(wù)的過(guò)程比較復(fù)雜,而且主要是由集線器完成,所以不詳細(xì)說(shuō)明。
9.數(shù)據(jù)包的處理
評(píng)論