一、我理解的USB接口通信的幾個(gè)關(guān)鍵點(diǎn) 1、硬件連接和數(shù)據(jù)傳輸?shù)奶攸c(diǎn) (1)USB設(shè)備接口共有四根線:電源線VBUS,數(shù)據(jù)線D 、D-,地線GND。 采用的是差分?jǐn)?shù)據(jù)傳輸。兩根線有四種狀態(tài):低低、高高、低高、高低。低高、高低是正常數(shù)據(jù)傳輸時(shí)所用,低低是設(shè)備斷開狀態(tài),高高好像是USB的復(fù)位狀態(tài)。(這是我的理解,不一定正確嗎,看過書以后再更正。) (2)USB傳輸一般采用NRZI(非歸零反相編碼)編碼方式:電平翻轉(zhuǎn)表示0,電平維持表示1。 (3)在USB設(shè)備端,有一個(gè)SIE(串行接口引擎),對(duì)差分線上的BIT流進(jìn)行解釋。 2、USB設(shè)備檢測的原理 在主機(jī)端,D 和D-兩根線都被下拉電阻拉到了低電平。若是在設(shè)備端差分線上提供上拉的話,可以被主機(jī)檢測到。比如在 D 線提供3.3V電源、1.5K左右電阻,則該設(shè)備被識(shí)別為“高速設(shè)備12Mbps”;如果在D-線提供上拉,則識(shí)別為低速設(shè)備(1.5Mbps)。 3、USB通信的主從原則 一般的USB主機(jī)和設(shè)備之間遵循主從通信的原理,每一次的數(shù)據(jù)傳輸都是又主機(jī)發(fā)起。 如果主機(jī)要輸出數(shù)據(jù),則先發(fā)一個(gè)握手包,通知設(shè)備。然后發(fā)送數(shù)據(jù),設(shè)備接收到數(shù)據(jù)后,再發(fā)送一個(gè)確認(rèn)包。 如果主機(jī)要輸入數(shù)據(jù),也是先發(fā)一個(gè)握手包,通知設(shè)備。設(shè)備然后將準(zhǔn)備好的數(shù)據(jù)發(fā)送給主機(jī)。主機(jī)再給設(shè)備一個(gè)確認(rèn)包。 4、USB數(shù)據(jù)通信的最小單位 USB數(shù)據(jù)傳輸?shù)幕締挝皇且粋€(gè)包。以異步串行通信對(duì)比:它的一個(gè)傳輸單位是起始字節(jié)、N個(gè)數(shù)據(jù)位、奇偶校驗(yàn)位、停止位。USB傳輸也差不多,只是它稱為包。 包的基本組成包括:同步域、包ID、數(shù)據(jù)、CRC校驗(yàn)、包結(jié)束符。跟異步串行通信本質(zhì)上是相同的。 同步域用來告訴對(duì)方一個(gè)包的開始,并且利用NRZI編碼規(guī)律的特點(diǎn),可以同步通信雙方的時(shí)鐘 包結(jié)束是總線的特殊狀態(tài):低低狀態(tài),我前面提到過。但與我原來的想法有出入,是“低低”狀態(tài)表示“包結(jié)束、復(fù)位”等特殊狀態(tài)。 包ID用于指明該包的類型(主機(jī)令牌、數(shù)據(jù)、握手)。 對(duì)于包的理解有一個(gè)基本的理解就行了,因?yàn)榘奶幚硎怯?/span>SIE完成的。它會(huì)給用戶提供一些包處理過后的標(biāo)志,比如數(shù)據(jù)傳輸是否正常完成、主機(jī)發(fā)出了復(fù)位信號(hào)等等,用戶能夠理解這些標(biāo)志就可以編程了。 5、USB數(shù)據(jù)包類型與USB的基本事務(wù) USB接口的工作是由主機(jī)和設(shè)備通信來完成的,所以它所做的每一個(gè)基本工作都要由雙方輸出不同類型的數(shù)據(jù)包。USB的一個(gè)基本工作我們稱為事務(wù)。 一個(gè)事務(wù)的基本組成最起碼是三個(gè)包:由主機(jī)發(fā)令牌包,表明要干什么;緊跟著一個(gè)數(shù)據(jù)包(可能是主機(jī)輸出、也可能是設(shè)備);收到數(shù)據(jù)的那一方發(fā)送一個(gè)握手包(表明它有沒有收到、數(shù)據(jù)對(duì)不對(duì))。 令牌包、數(shù)據(jù)包和握手包的含義比較好理解,還有一類特殊包,現(xiàn)在就先不研究了。 6、USB的控制傳輸 USB有四類傳輸過程:其中批量傳輸、終端傳輸、等時(shí)傳輸比較類似,每個(gè)傳輸就是一個(gè)數(shù)據(jù)輸出或數(shù)據(jù)輸入事務(wù)。主要用于USB主機(jī)與設(shè)備的數(shù)據(jù)交換。 比較復(fù)雜一點(diǎn)的是控制傳輸。 控制傳輸可以分為三個(gè)階段:建立階段、數(shù)據(jù)階段和狀態(tài)階段。 建立階段是一個(gè)建立事務(wù):主機(jī)發(fā)一個(gè)SETUP令牌包、一個(gè)數(shù)據(jù)包,然后設(shè)備必須通過ACK握手包回應(yīng)。 數(shù)據(jù)階段可以是多個(gè)基本數(shù)據(jù)事務(wù)。這個(gè)階段的數(shù)據(jù)傳遞只能是一個(gè)方向,要么全是輸入事務(wù)、要么全是輸出事務(wù)。 狀態(tài)階段是主機(jī)對(duì)數(shù)據(jù)傳輸階段的結(jié)果進(jìn)行檢測:如果主機(jī)讀了數(shù)據(jù),則會(huì)使用一個(gè)數(shù)據(jù)輸出事務(wù)表明自己是否正確收到了設(shè)備的數(shù)據(jù);如果主機(jī)輸出了數(shù)據(jù),它要求設(shè)備返回?cái)?shù)據(jù)接收的情況。實(shí)質(zhì)上是一個(gè)與數(shù)據(jù)階段傳輸方向相反的一個(gè)數(shù)據(jù)包。 7、USB的地址和端點(diǎn) USB主機(jī)是通過地址和端點(diǎn)具體與USB設(shè)備交換數(shù)據(jù)的。即每一個(gè)包都是針對(duì)具體的地址、端點(diǎn)。 USB設(shè)備掛在總線上,只要總線上有數(shù)據(jù)的傳輸,它都能檢測到。但是只有令牌包中指定地址 與本設(shè)備地址相同時(shí),SIE才會(huì)將該數(shù)據(jù)接收進(jìn)來,并對(duì)包中指定的端點(diǎn)進(jìn)行狀態(tài)確認(rèn)。 特別要注意的是:USB設(shè)備的地址是可以動(dòng)態(tài)分配的。在復(fù)位后,它使用地址0。在用地址0與主機(jī)做協(xié)調(diào)后,可以分配到新的地址。然后就可以使用新地址與主機(jī)通信了。 端點(diǎn)實(shí)際上是一個(gè)數(shù)據(jù)緩沖區(qū)(我的理解)。它與USB傳輸類型對(duì)應(yīng),每種類型都有輸入、輸出端點(diǎn)。比如控制傳輸對(duì)應(yīng)有控制端點(diǎn)兩個(gè),一個(gè)輸入(主機(jī)想要獲取設(shè)備的控制傳輸數(shù)據(jù)時(shí),就從這里取,當(dāng)然設(shè)備先要準(zhǔn)備好),一個(gè)輸出(主機(jī)在控制傳輸階段傳輸給設(shè)備的數(shù)據(jù),就會(huì)由SIE寫入這個(gè)輸出端點(diǎn),然后USB固件程序就可以從該端點(diǎn)讀取主機(jī)來的數(shù)據(jù)進(jìn)行處理。 8、USB的描述符 我覺得它實(shí)質(zhì)上就是一個(gè)具體設(shè)備所有屬性、配置、能力等等所有信息的綜合。這是一個(gè)將數(shù)據(jù)與數(shù)據(jù)處理過程分開來的典型例子。 設(shè)備描述符:主要指明設(shè)備的類型、所使用的協(xié)議、VID、PID、設(shè)備版本號(hào)等。一個(gè)特別重要的信息是:控制傳輸輸入端點(diǎn)0支持的數(shù)據(jù)長度。 其它描述符性質(zhì)差不多,我這里就不再一一敘述了。 |
|