新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > USB總線協(xié)議基礎知識

USB總線協(xié)議基礎知識

作者: 時間:2016-12-15 來源:網(wǎng)絡 收藏
USB作為一種串行接口,應用日益廣泛。如同每個工程設計人員必須掌握I2C,RS232這些接口一樣,我們也必須掌握usb.

但是usb的接口協(xié)議實在有點費解,linux uhci驅動作者之一Alan Stern曾經(jīng)就說過“The USB documentation

本文引用地址:http://m.butianyuan.cn/article/201612/330443.htm

is downright evil. Mostof it is just crap, written by a committee. Youre better off ignoring

mostof it ”。

本文將從整體上介紹usb協(xié)議,包括usb host ,usb hub,usb function。希望能給讀者一個總體上的了解。也

因此,文章將分成相應的三部分講解。

一。usb function

1。初識usb.usb是一種串行接口協(xié)議,它靠d+,d-兩條數(shù)據(jù)線構成的差分線來進行數(shù)據(jù)傳輸,這讓我們非常感興

趣它到底和我們通常熟悉兩線rs232/485有何區(qū)別。了解這種區(qū)別有助于我們對usb作一個深入的了解。那么讓

我們回想一下到底一個兩線rs232的數(shù)據(jù)是如何傳送的,如圖一:

在這里我們的重點在于,我們發(fā)現(xiàn)要在串行口傳送數(shù)據(jù)一個最體碼的要求恐怕就是:要知道數(shù)據(jù)傳輸何時開始,

何時結束。即如何delimit.那么rs232怎么做的。顯然,在idle(空閑)時,即無數(shù)據(jù)傳送時,數(shù)據(jù)線處于高電

平,等到有數(shù)據(jù)開始傳送,發(fā)送方首先拉低數(shù)據(jù)線(start),表示數(shù)據(jù)傳輸開始,接受端也因為這個“start”信號

開始準備接受即將到來的數(shù)據(jù),類似一次握手,隨后,在兩者之間的數(shù)據(jù)傳送開始,結束后主方再次拉高數(shù)據(jù)

線,表示結束傳輸,自此兩者重新進入Idle狀態(tài)。等待下一輪傳送開始。

了解了rs232,那么我們自然想到usb如何做到這個呢,既然是串行位流傳輸,也理所當然的解決這個問題。沒錯,

Usb協(xié)議必然要解決這個問題,讓我們作一個類似rs232的比較吧!類似于rs232,usb的傳輸楨如圖二:

(這里我們暫時忽略這個傳輸所代表的意義)為了說明問題,我們對一些問題簡化,我們定義這樣幾個狀態(tài):
假設D+,D-分別表示usb信號線的電平信號。那么對于usb full speed function(high speed ,low speed是不

同的),我們定義差分數(shù)據(jù)線上可能出現(xiàn)的四個狀態(tài):

Data J state:D+=1,D-=0;
Data K state:D+=0,D-=1;
SE0:D+=D-=0;
SE1:D+=D-=1;

那么上面的圖中,相應的也可表示為圖三:

這個對usb full speed function來說,idle狀態(tài)將處于Data J state,se0表示一楨結束??催@個圖是不是很像

我們熟悉的rs232。沒錯?。?!他們確實很相似。在無數(shù)據(jù)傳輸時,它們都處于Idle狀態(tài),當要開始傳輸數(shù)據(jù)時,

先發(fā)一個sync(同步信號,rs232為start,usb為一sync字節(jié),見協(xié)議說明)信號進行“握手”,而后開始傳輸,

當傳輸要結束時,發(fā)一stop信號(usb為一個se0狀態(tài)表示要結束傳輸),最后又進入idle態(tài)等待新的傳輸。不過,

你可能更加注意到,他們還是不同的。不同在于usb是按packet進行傳輸?shù)?,就是說它傳輸?shù)淖钚挝皇莗acket,

而rs232是按字節(jié)傳送的,也即它的最小傳送單位是字節(jié)。既然是按pakcet傳送,想想我們相較于rs232的按字節(jié)

單位傳輸,我們可以得到哪些“好處”。想想看,pakcet的好處不就在于我們可以靈活的定義數(shù)據(jù)的傳送格式,

傳送方式,從而可以適應各種各樣的串行設備,這不就是所謂的“通用串行總線”嗎?

簡介:從本節(jié)開始,我們將介紹usb的傳輸機制。這節(jié)先介紹usb現(xiàn)有傳輸方式的背景知識,做為對下節(jié)將要展開

的四種傳輸類型,描述符,等相關知識的一個導引。

2。usb傳輸。
我們在上一節(jié)中了解到了usb的“packet”的感念,了解到了usb傳送一個packet總是以sync開始,以eop結束,

這個稱為delimiter,即標記packet的始末。有了packet,我們就可以在usb總線上傳輸數(shù)據(jù)了。但是這還不夠,

比如數(shù)據(jù)傳送方向,即傳回usb主機還是傳下usb從機,數(shù)據(jù)傳送的地址,數(shù)據(jù)傳送的類型(這些后面我們將會知

道)這些信息在傳輸之前是必須搞清楚的,那么這個信息如何得知呢,看來這就需要我們定一套基于packet的

“協(xié)議”了。主機與從機在傳輸中均遵循這套“協(xié)議”,那么這些問題就可以迎刃而解。事實上,usb的一次數(shù)

據(jù)傳輸總是遵循這樣的“協(xié)議”的:

首先,主機發(fā)第1個packet給從機,聲明數(shù)據(jù)傳送方向,數(shù)據(jù)傳輸?shù)刂?,?shù)據(jù)傳輸類型。

其次,主機發(fā)第2個至第n個packet載有實際數(shù)據(jù)
最后,從機返回一個packet是一個ACK包,報告數(shù)據(jù)傳輸?shù)慕Y果,比如接受出錯或成功等信息,這樣主機

就可以借此了解到這次傳輸情況,從而有可能來作出相應措施如決定是否重發(fā)。

這里我們考慮的是主機發(fā)數(shù)據(jù)給從機的情況,那么從機發(fā)數(shù)據(jù)給主機時,是不是也可以這樣呢?當然可以,比如

從機要發(fā)數(shù)據(jù)給主機時,也可以采取同主機類似的方式:

首先,從機發(fā)第1個packet給主機,聲明數(shù)據(jù)傳送方向,數(shù)據(jù)傳輸?shù)刂?,?shù)據(jù)傳輸類型。
其次,從機發(fā)第2個至第n個packet載有實際數(shù)據(jù)
最后,主機返回一個packet是一個ACK包,報告數(shù)據(jù)傳輸?shù)慕Y果,比如接受出錯或成功等信息,這樣從機就可以

借此了解到這次傳輸情況,從而有可能來作出相應措施如決定是否重發(fā)。

基本上可以歸結為一個“三段式”傳輸

這里有人可能注意到了,對這樣一個傳輸機制,從機和主機的功能將是一樣的,因為這樣的實現(xiàn)機制,從機

可能在某一時刻是主機,某一時刻又可能是從機,因為他們要實現(xiàn)同樣的功能。這樣實現(xiàn)起來的復雜性也將是

一樣的。

注:這里概念或許容易混淆,其實,我們這里的主機(master)和從機(slaver)是一個transceiver,即可收可發(fā)。

相應的,在某一時刻,master在發(fā)數(shù)據(jù),我們稱其為transmitter,在接受時我們稱為receiver.對slaver同樣。

我們可能還注意到了,usb這種按pakcet傳輸?shù)姆绞皆趯崿F(xiàn)時已經(jīng)很復雜了(至少比rs232要復雜多吧),至少我

們目前看來主從機功能一樣這樣的實現(xiàn)方式似乎還是可行,但是后面我們談到usb host時將會了解到host的功

能是如何的復雜,以至于讓一個usb function 也帶上如此的功能成本和實現(xiàn)復雜性將陡然上升。作為面向廣范

應用的usb,這是我們不允許的。我們期望的是一個使用usb 的udisk,使用usb的光驅,使用usb的耳麥等等這些

東西不要因為usb而變得昂貴,復雜。

正是因為這個原因,usb從機的傳輸發(fā)式便由上面的方式改成了下面的方式進行:

首先,主機發(fā)第1個packet給從機,聲明數(shù)據(jù)傳送方向,數(shù)據(jù)傳輸?shù)刂?,?shù)據(jù)傳輸類型。
其次,從機收到主機送來的第一個packet后,再發(fā)第2個至第n個packet載有實際數(shù)據(jù)
最后,主機返回一個packet是一個ACK包,報告數(shù)據(jù)傳輸?shù)慕Y果,比如接受出錯或成功等信息,這樣從機

就可以借此了解到這次傳輸情況,從而有可能來作出相應措施如決定是否重發(fā)。

而對于usb 主機傳輸方式保持不變。


對于這樣的改變,我們馬上就有疑問了:這個改變的傳輸方式是和未改變之前的等價嗎。當然,不全等價。問題

在哪里?仔細觀察一下便知,兩者區(qū)別在于第一個packet是由誰發(fā)起的。未改變之前,第一個packet總是由要傳

送數(shù)據(jù)的一方發(fā)起,而改變之后的第一個Packet總是由主機發(fā)起。這樣,就變成如果從機要發(fā)送數(shù)據(jù)給主機時,

總是由主機發(fā)起(第一個packet),然后從機開始傳送。
可能初次接觸我們會感覺怪怪的,怎么從機要給主機發(fā)送數(shù)據(jù)前反而要主機先發(fā)packet給從機。 這樣行嗎?

我們要說這樣是可以的,因為通常一次傳輸交互的產(chǎn)生,并非無來由的產(chǎn)生,這些都是由程序員控制的,控制usb

何時收,何時發(fā),及發(fā)給誰!?。?/p>

這里我們就注意到了,usb function(總是作為從機)的功能一下從原來與主機具有相同功能的tranceiver變成

了現(xiàn)在僅具發(fā)送(或接收)功能的transmitter(或Receiver)實現(xiàn)的復雜性及成本可想而知也就相應得減小了。

簡介:本節(jié)介紹usb full speed function的四種傳輸類型。

上節(jié)中我們了解到了usb host與usb function之間采用的是一種“非對稱”的傳輸,也就是說,無論usb接受

數(shù)據(jù)還是發(fā)送數(shù)據(jù),都是由usb host首先發(fā)起。即傳輸?shù)牡谝粋€packet總是由usb host發(fā)出的。這個packet將聲

明本次即將進行的數(shù)據(jù)傳輸方向,數(shù)據(jù)傳輸?shù)刂泛蛿?shù)據(jù)傳輸類型。


上一頁 1 2 下一頁

評論


技術專區(qū)

關閉