USB工作原理
USB的工作原理及數(shù)據(jù)包格式??一?概述?對(duì)于USB的工作我這里做個(gè)比方,主機(jī)好比一個(gè)公司,你就是USB設(shè)備,要進(jìn)入公司首先要面試(枚舉),你到了面試現(xiàn)場(chǎng)(第一次插入設(shè)備),面試官首先了解到你的外表,性別已經(jīng)你要應(yīng)聘的崗位(設(shè)備描述符),然后給你一個(gè)號(hào),以后就開始按號(hào)叫人,當(dāng)你被叫到就開始問(wèn)你的專業(yè)知識(shí),性格等(配置描述符),如果你比較合適(通過(guò)了枚舉)你就會(huì)錄取了,并且注冊(cè)一個(gè)你的信息到公司(驅(qū)動(dòng)安裝,并且寫入注冊(cè)表)。等你下次來(lái)公司,只要把工號(hào)(PID,VID)報(bào)上,就知道是你來(lái)了。?USB的概念歷史啥的這里就不說(shuō)了。我們先不管具體的數(shù)據(jù)包格式,這一節(jié)先從整個(gè)包的層面上簡(jiǎn)單的說(shuō),過(guò)程是這樣的,??
設(shè)備插入?
1)主機(jī)會(huì)輪回查詢各個(gè)USB端口,主機(jī)檢測(cè)到D+與D-之間有電壓差,就認(rèn)為有新的設(shè)置接入。主機(jī)等待100ms后發(fā)出復(fù)位請(qǐng)求。設(shè)備接到復(fù)位請(qǐng)求后將產(chǎn)生一個(gè)外部中斷信號(hào)。??
枚舉過(guò)程?
2)主機(jī)這時(shí)候只是知道有新的設(shè)備插入了,但是不知道插進(jìn)來(lái)個(gè)什么東西,所以就開始詢問(wèn)它是什么設(shè)備,怎么用,負(fù)荷能力怎么樣。這個(gè)時(shí)侯就進(jìn)入了枚舉過(guò)程。因?yàn)閯倓偛迦氲脑O(shè)備沒(méi)有分配地址,就用默認(rèn)地址0,首先發(fā)送一個(gè)Get_descriptor(獲取設(shè)備描述符)指令包,設(shè)備接到包后就開始解析包(其實(shí)就是你在固件程序里判斷處理)?,然后按固定格式返回自己設(shè)備的設(shè)備描述符,這一步主要是主機(jī)知道你的USB設(shè)備的基礎(chǔ)屬性,比如支持的傳輸數(shù)據(jù)長(zhǎng)度,電流負(fù)荷多少,支持那個(gè)USB版本,以及以后方便電腦找驅(qū)動(dòng)的PID,VID。
?3)?這時(shí)候主機(jī)知道你(你做的設(shè)備,簡(jiǎn)稱你吧)的數(shù)據(jù)長(zhǎng)度還有電流大小后,下一步就是給你分配一個(gè)屬于你的地址。
?4)?給你一個(gè)地址后就開始詢問(wèn)你的具體配置。首先發(fā)送一個(gè)試探性的設(shè)備配置請(qǐng)求Get_configuration(要求固定返回9個(gè)設(shè)備配置字),你接到后就開始發(fā)送9字節(jié)的設(shè)備配置字,其中包括你的配置字的總長(zhǎng)度,這樣主機(jī)就知道你的配置到底有多長(zhǎng),然后再發(fā)一次設(shè)備配置請(qǐng)求,這時(shí)你就開始上傳所有的配置字。這個(gè)時(shí)侯主機(jī)就已經(jīng)很明白你的工作方式最全最熱最專業(yè)的文檔類資源,文庫(kù)一網(wǎng)打盡 就各種特性,然后就可以正常工作了?
5)?如果你在前面的某些配置(以后章節(jié)詳細(xì)說(shuō)明)要求要說(shuō)明自己的名字什么的,這里還要上傳字符串描述符。
?6)?如果是鼠標(biāo)或者鍵盤還要上傳報(bào)告描述符??正常數(shù)據(jù)階段?
7)?這個(gè)時(shí)侯你已經(jīng)被主機(jī)正式接受并且注冊(cè)了,你可以通過(guò)自己寫測(cè)驅(qū)動(dòng)或通用驅(qū)動(dòng)與電腦進(jìn)行通訊了。???以上是簡(jiǎn)單的描述,詳細(xì)的后面章節(jié)再做介紹,學(xué)習(xí)一個(gè)東西關(guān)鍵是首先要知道這個(gè)東西是什么,簡(jiǎn)單的工作原理。?對(duì)于USB傳輸大體有個(gè)概念,下一步就來(lái)看看到底USB上傳的什么東西,以什么格式傳數(shù)據(jù),先不涉及端點(diǎn)的概念。??USB數(shù)據(jù)格式?各種總線的數(shù)據(jù)傳輸都是以固定的層次協(xié)議進(jìn)行的,USB當(dāng)然也不例外。
所謂的層次也只是個(gè)抽象的概念罷了,就是表達(dá)一種依附關(guān)系,上層要依賴與底層,上層以底層為基礎(chǔ),上層只需要關(guān)心自己的東西就行了,如果你還不明白,那就繼續(xù)看,學(xué)習(xí)一個(gè)東西不可能一兩句話說(shuō)的明白一個(gè)點(diǎn),需要全面了解后才能清楚各個(gè)點(diǎn)。?要實(shí)現(xiàn)兩個(gè)機(jī)器(機(jī)器的范圍比較廣,可以是電腦,交換機(jī),單片機(jī))的通信總是要有一個(gè)載體才可以,對(duì)于機(jī)器當(dāng)然是電平高低為載體,具體的說(shuō)機(jī)器甲要告訴機(jī)器乙一件事情(比如說(shuō)一條指令),那么機(jī)器甲可以通過(guò)一根線(串行數(shù)據(jù)總線)連到機(jī)器乙的一個(gè)IO口上,甲發(fā)送一個(gè)個(gè)的高低電平,乙固定時(shí)間檢測(cè)自己的這個(gè)IO口,然后逐個(gè)記錄下放到自己的緩沖里,這樣乙就收到甲送的數(shù)據(jù)了。
上述就是一個(gè)簡(jiǎn)單的數(shù)據(jù)鏈路層(計(jì)算機(jī)網(wǎng)絡(luò)里這么叫)的描述,這一層要保證的就是甲發(fā)的每一位數(shù)據(jù),乙都可以正確及時(shí)的接受,并且對(duì)在傳輸過(guò)程中出錯(cuò)的數(shù)據(jù)做出反應(yīng)。其實(shí)比數(shù)據(jù)連路更底層的還有物理層,這就是真正的物理介質(zhì),對(duì)于機(jī)器就是電線了,數(shù)據(jù)就是電線上傳輸?shù)碾妷?USB是用的四線,兩個(gè)電源(5V,地線),兩個(gè)數(shù)據(jù)線(D+,D-)。?這里也打個(gè)比方,比如人與人進(jìn)行交流,我們當(dāng)然是通過(guò)說(shuō)話了,物理層就是空氣和傳輸?shù)穆暡?#xff0c;數(shù)據(jù)鏈路層就是我們說(shuō)的每一個(gè)字,物理層就是空氣,負(fù)責(zé)把我們說(shuō)的話轉(zhuǎn)換成 聲波傳給對(duì)方,數(shù)據(jù)鏈路層負(fù)責(zé)讓對(duì)方能正確的聽到每個(gè)字,如果聽的不清可以告訴對(duì)方重新說(shuō)一遍。?經(jīng)過(guò)上述的兩個(gè)底層,就可以保證每一位數(shù)據(jù)可以正確的傳到對(duì)方那里去。下一步的工作當(dāng)然是解析數(shù)據(jù)代表了什么,一般來(lái)說(shuō),數(shù)據(jù)都是以一串?dāng)?shù)為單位,一般稱為一個(gè)包,機(jī)器間傳輸都是以一個(gè)包為單位傳出,就像人們說(shuō)話都是以一句話為單位輸出一樣。
每一個(gè)包包含有許多位數(shù)據(jù),這些數(shù)據(jù)又分段表示不同的意義,如圖一,這是一個(gè)USB令牌階段的包,Sync是同步數(shù)據(jù)(相當(dāng)于說(shuō)話時(shí)先打個(gè)招呼,告訴對(duì)方要跟他說(shuō)話了),PID是包標(biāo)示(告訴對(duì)方這個(gè)包是干什么用的),ADDR是對(duì)方的地址(叫對(duì)方的名字),ENDP是用端點(diǎn)幾通訊(先不介紹這個(gè)),CRC5是校驗(yàn)位(判斷這個(gè)包是否在傳輸中出錯(cuò)),EOP是包結(jié)束。
|------------------------------------------------------------------|?
|???Sync??|??PID??|??ADDR??|??ENDP??|??CRC5??|??EOP???|?
|______________________________________|??????????
圖一?USB的數(shù)據(jù)包又分為三種,一個(gè)是令牌包,一個(gè)是數(shù)據(jù)包,另一個(gè)是握手包。每一次的USB通訊事務(wù)處理都是以令牌包開頭,告訴對(duì)方要跟誰(shuí)說(shuō)話,這句話是用來(lái)干嘛的。如果要求有數(shù)據(jù)傳輸,則下一步就是數(shù)據(jù)包,另外如果要求對(duì)方要有反饋,則會(huì)發(fā)出握手包。令牌包又簡(jiǎn)單的包括OUT,IN,STEP三種類型,OUT是用于主機(jī)告訴設(shè)備主機(jī)要向USB設(shè)備發(fā)送數(shù)據(jù),IN是用于主機(jī)告訴設(shè)備要上傳數(shù)據(jù),而STEUP是用于主機(jī)向USB設(shè)備發(fā)送配置信息,在枚舉過(guò)程中會(huì)用到。另外數(shù)據(jù)包和握手包的具體格式什么的,可以參照詳細(xì)的協(xié)議。?可以看到在所以的通訊過(guò)程中,主機(jī)都是發(fā)起者,不管是主機(jī)發(fā)送數(shù)據(jù)到USB設(shè)備還是USB設(shè)備發(fā)送數(shù)據(jù)到主機(jī),都必須收主機(jī)控制。
圖二為一次事務(wù)的過(guò)程。???????
令牌階段???——>??數(shù)據(jù)階段??——>??握手階段??????????
?圖二?這個(gè)過(guò)程可以這樣描述,甲和乙對(duì)話,甲是老板,乙是職員。第一節(jié)已經(jīng)講過(guò)了,乙面試就是枚舉,在這個(gè)過(guò)程中,甲多段的發(fā)送STEP令牌包給乙,乙收到后如果要反饋數(shù)據(jù),就發(fā)數(shù)據(jù)包給甲,甲正確接收后,跟甲握握手,表示這次對(duì)話成功。?乙被正式錄取后,甲會(huì)分派任務(wù)(OUT),這時(shí)甲對(duì)乙說(shuō)有任務(wù)給你(令牌階段),然后乙 就開始聽,甲說(shuō)你的任務(wù)就是記錄數(shù)據(jù)并且上報(bào)(這段話就是數(shù)據(jù)包),乙說(shuō)好的(握手包)。?乙開始正式工作,并且記錄數(shù)據(jù)。過(guò)了一段時(shí)間,甲開始要求提交數(shù)據(jù)(IN),乙把數(shù)據(jù)報(bào)告給甲(數(shù)據(jù)階段),甲說(shuō)好(握手成功)。這里乙不能主動(dòng)的去向老板匯報(bào),只能被動(dòng)的干活。
總結(jié)
- 上一篇: 给嵌入式工程师的一封信
- 下一篇: 上拉电阻和下拉电阻的作用详解