二十四、USB協議


一、USB是什么

  USB,通用串行總線,是一種計算機與外圍設備進行數據交互的通信協議。

  任何東西的出現都是有理可循的,在以前計算機剛興起的時候,要連接一個新的設備,需要斷電關閉計算機,連接好設備,配置好硬件,再上電運行,這個過程相當費時費力,為了能擁有隨意接入設備這種熱拔插特性,USB總線協議應運而生。

USB總線如今已經有USB1.0、USB1.1、USB2.0、USB3.0。

  USB協議采用主從工作模式,即只有主機與從機之間才能進行數據通信,也正是這樣引發一個缺陷,就是主機與主機、從機與從機之間不能通信。后來,USB OTG的出現彌補了這一缺陷,USB OTG的特性,就是能將一個設備,在不同的場合進行主機或從機的身份切換,如何做到這一點的,就是USB OTG中增加了一種MINI USB接頭,是五線制,跟四線制一樣,多出來的一條是ID線,用來標識一個設備是主機還是從機。盡管如此,還是避免不了USB主從的工作模式,數據永遠在主機和從機之間進行,永遠是主機發起主動權,從機只是被動的讀寫。

  USB傳輸如今已經是一種普遍的手段,在USB1.0和USB1.1中,傳輸速度上有1.5Mb/s的低速模式和12Mb/s的全速模式,之后出了USB2.0,傳輸速度上就有了480Mb/s的高速模式、在USB3.0上,速度就更快了。這些低速、全速、高速指的是數據在每秒傳輸的位數,實際速率要低一點,因為還有同步域、令牌包、CRC校驗、位填充、包間隙這些協議開銷。而在傳輸距離上,建議低速不超過3米,全速不超過5米

  需要走出的一個誤區就是:並不是設備擁有越高版本的協議,速度就一定快;就比如說PSIUSBD12這款USB芯片,雖然手冊上寫了符合USB2.0協議,實際上並沒有高速模式,只有12Mb/s的全速模式。

二、USB協議的傳輸結構

以下是USB協議的LOGO:

                                                   

 

 

標准的USB協議傳輸結構是這樣子的(設備端):

                                     

   USB協議采用的是差分傳輸模式,因而有兩條數據線D+和D-,在低速和全速模式下,采用電壓傳輸模式,在速下,采用電流傳輸模式。

  傳輸結構之所以采用兩長兩短的方式,是為了支持熱拔插;當USB設備接入主機時,VCC和GND優先被接通;拔掉設備時,D-和D+數據線優先斷電。原因很簡單,如果D-和D+先於電源線被接通,那么此時電源為0,USB芯片的IO口引腳電壓很有可能大於電源電壓,很容易導致芯片閂鎖,輕則無法工作,重則損壞芯片,這時候需要斷電重新上電。

  在還沒有進行配置前,數據線最大電流為100mA,配置后,數據線最大電流為500mA,數據的傳輸為小端序方式,在國際標准上,甚至對USB協議的四線做了顏色標注,VCC為紅色,GND為黑色,D-為白色,D+為綠色。

三、USB的電氣特性

在電氣結構上,USB設備與主機的連接也很有講究:

                                            

 

 

主機端的D-和D+數據線各自被串聯15KR電阻下拉到地,當沒有USB設備插入的時候,這兩條數據線就一直呈現低電平狀態。

設備端的D-或者D+數據線,串聯一個1.5KR的電阻上拉到3.3V,一旦設備插入主機,那么當主機捕捉到自身的D-或者D+被拉到高電平時,就知道有USB設備連接進來了,這樣就檢測到有外來USB設備接入了。

對於從機設備中到底是D-還是D+串聯1.5KR電阻,這個就要有傳輸協議的模式來決定了,當配置成全速或高速時,就由D+串聯電阻;當配置成低速時,就是D-串聯電阻了。

簡單來說就是快的就連D+,慢的就連D-。

拓撲結構
剛才說了,USB是一種主從工作模式,大多數時候主機被叫“Host”,從機被叫“Device”;

主機端具有一個或者多個USB主控制器,每個USB主控制器下帶有一條或者多條根集線器,主控制器負責數據處理,根集線器負責提供一條主控制器與設備連通的接口;

當然有這么一種情況,當設備越來越多,接口不夠用的時候,就需要一個特殊的USB設備登場了,那就是USB集線器,他可以在原有的USB接口上擴展出更多的接口,當然了,擴展得再多,說白了也是共享一個主控制器,因此帶寬是不會變多的。

在PC端的設備管理器中就可以看到主機的USB主控制器和根集線器:

 

 

 

雖然說一個USB主控制器可以連接多個設備,這種連接並不是串聯,也不是並聯,而是通過集線器來實現的。

 

 

 

如圖,主控制器和根集線器后有集線器,集線器將一個或者多個USB接口擴展成更多接口,將更多接口拓展成再多,但是這種拓展並不是無休止進行下去的,USB1.1最多擴展4層,USB2.0最多擴展6層。

因此大概的傳輸過程是這樣的:

  首先由主控制器發出數據,通過各層的集線器傳送到相對應的某一層的接口給USB設備,設備接收到數據后進行分析處理,然后發送回一組數據或應答,它最先被送至本層的集線器,然后被送到上一層集線器,一直到主控制器為止,最終,主控制器將數據或者應答交給計算機進行處理。

四、編碼方式  

無論USB協議再怎么高深,發送端實際上數據傳輸的本質就是0和1。

USB采用的是NRZI編碼方式,數據為0的時候電平翻轉,數據為1的時候電平不反轉。

當出現連續6位為1的時候,自動填充進一個0,這樣做的目的是防止長時間的電平不變化,不利於時鍾的提取。而在接收端則完全相反,自動去掉填充的0,還原出原本的數據。

這就是位填充處理了。

當然,這種編碼的處理過程,USB芯片都已經自動處理好了,我們只要知道有這些細節便可。

五、描述符

  USB協議只是一條總線,提供了一條通路而已,那么傳了那么多0和1的數據,到底傳輸的是什么數據呢,原來是要告訴主機,這個設備的具體功能、會有什么行為,該設備的出廠商,設備ID號,廠商ID號,版本號,端點情況等等信息。

這些信息,都是由主機從設備那里獲取的描述符得知的,因此,USB總線上傳輸的0和1數據,實際上就組成了描述符數據,發送給了主機。

描述符種類多樣:設備描述符、配置描述符、接口描述符、端點描述符、類特殊描述符、字符串描述符·····

一個設備只有一個設備描述符,該設備描述符定義了多種配置;

每一種配置對應一個配置描述符,該配置描述符定義了多種接口;

每一個接口對應一個接口描述符,該接口描述符定義了多個端口;

每個端點對應一個端點描述符,端點描述符定義了該端點的大小、類型等等。

因此可看出來,在主機獲取描述符的過程是有順序的,從設備描述符,到配置描述符,再到接口描述符,最后到端點描述符,如果由類特殊描述符,那就跟在端點描述符之后。

可見,描述符的獲取是一層一層來的,不過在獲取配置描述符的時候,可以根據配置描述符得到配置集合的總長度,從該集合我們一口氣得到配置描述符、接口描述符、端點描述符和類特殊描述符。

這樣也就引發了一個疑問,既然可以一口氣從配置集合中獲取到端點描述符了,那我為什么還要去費勁獲取配置描述符和接口描述符呢,理論上講是可以的。

我們來捋一下各種描述符之間的關系,假如有一個U盤(U盤當然是用USB通信協議啦),它有一個設備描述符,因此也有一個設備地址(USB設備采用7位來表示地址,即0~127,其中0號地址是保留給未初始化的設備用的,因此理論上可以連接127個設備,但實際上並不會接那么多),主機是通過該設備地址找到U盤並與它通信的,但是僅僅只有設備地址是不夠的,還要知道主機與U盤中哪一個端點進行通信,因此還需要有一個端點地址,只有知道了設備地址和端點地址,才能實現對設備點對點發送和接收數據。

因此按道理來說,只要知道設備描述符和端點描述符就夠了,就好比你要去XX學校找XX人一樣,花點時間總會找得到行得通的。

而配置描述符和接口描述符的出現,只是為了能更好的管理端點而抽象出來的概念罷了,就好比指定了XX棟xx室一樣,想象一下,你得到了這么一條信息,去深圳大學3棟305室找某某某,這是不是就比單純告訴你去深圳大學找某某某要效率高很多了?

有這么三條需要注意的點:

1、一個設備可以有多種配置,但同一時刻只能有一種配置模式;

2、同一個端點不能出現在同一個配置下的一個或幾個接口中;

3、同一個端點可以出現在不同配置下的一個或幾個接口中;

好了說了這么多,到現在只知道有這么幾種描述符,通過設備描述符可以知道配置描述符,通過配置描述符可以知道接口描述符,通過接口描述符可以知道端點描述符;從微觀上來推理數據傳輸的過程就很簡單了:

設備端USB協議產生0和1數據,在端點出構成一個接口,由接口又構成一種配置,由配置又構成一個設備,最后把這設備的信息交給主機進行數據處理,大概過程就是這樣。

當然了,設備描述符中的數據不止有配置描述符,配置描述符中的數據不止有接口描述符,接口描述符中的數據不止有端點描述符,具體有以下的數據:

設備描述符:設備使用的USB協議版本、設備類型,設備版本號,端點0的最大包大小,廠商ID,產品ID,廠商字符串索引,產品字符串索引,設備序列號索引、包含的配置數······

配置描述符:包含的接口熟,配置編號,供電方式,是否支持遠程呼喚,電流需求大小·····

接口描述符:接口編號,接口端點數,接口所使用的類、子類、協議······

端點描述符:端點號、方向,端點傳輸類型,最大包大小,查詢時間間隔·······

六、USB傳輸類型

  數據和控制信號在主機和USB設備間的交換存在兩種通道:單向雙向

  USB的數據傳送是在主機軟件和一個USB設備的指定端口之間。這種主機軟件和USB設備的端口間的聯系稱為通道。總的來說,各通道之間的數據流動是相互獨立的。一個指定的USB設備可有許多通道。例如,一個USB設備存在一個端口,可建立一個向其他USB設備的端口,發送數據的通道,它可建立一個從其他USB設備的端口接收數據的通道。

  USB包含四種基本的數據傳輸類型:

  1、控制傳輸

  設備連接時用來對設備進行設置,還可對指定的設備進行控制。

  2、批量傳輸

  大批量產生並使用的數據,在傳輸約束下,具有很廣的動態范圍。

  3、中斷傳輸

  用來描述或匹配人的感覺或特征反應的回饋。

  4、同步傳輸

  由預先確定的傳送延遲來填滿預定的USB帶寬。

七、USB傳輸的數據格式

  在物理層,USB通過二進制數據進行傳輸,首先二進制數據構成域(有七種),域再構成包,包再構成事務(in、out、setup),事務最后構成傳輸。

  1、域:是USB數據最小的單位,由若干位組成,域可分為七個類型:

  (1)同步域 :八位,值固定為00000001,用於本地時鍾和輸入同步。

  (2)標識域:由四位標識符+四位標識符反碼構成,表明包的類型和格式,這是個很重要的部分,這里能夠計算出,USB的標識碼有16種。

   (3)地址域:七位地址,代表了設備在主機上的地址,地址00000000被命名為零地址,是任何一個設備第一次連接到主機時,在被主機配置、枚舉前的默認地址,由此能夠知道為什么一個usb主機只能接127個設備的原因。

        (4)端點域:四位、由此可知一個USB設備的端點數量最大為16個。

  (5)幀號域:11位,每一個幀都有一個特定的幀號,幀號域最大容量為0x800,對於同步傳輸有重要意義。

  (6)數據域:長度為0~1023字節,在不同的傳輸類型中,數據域的長度各不相同,但必須為整數個字節的長度。

     (7)校驗域:對令牌包和數據包中非pid域進行校驗的一種方法,CRC校驗在通訊中應用很泛,是一種會很好的校驗方法

   2、包

  由域構成的包有四種類型:令牌包數據包握手包、特別包。

  (1)令牌包

  可分為輸入包、輸出包、配置包和幀起始包(注意這里的輸入包是用於配置輸入命令的,輸出包是用來配置輸出命令的,而不是放數據的)。其中輸入包、輸出包和配置包的格式都是相同的:sync+pid+addR+endp+CRC5(五位的校驗碼)。

  幀起始包的格式:

    sync+pid+11位FRam+CRC5

  (2)數據包

    分為data0包和data1包,當usb發送數據的時候,當一次發送的數據長度大於相應端點的容量時,就需要把數據包分為好幾個包,分批發送,data0包和data1包交替發送即假如第一個數據包是data0,那第二個數據包就是data1。但也有例外情況,在同步傳輸中(四類傳輸類型中之一),任何的數據包都是為data0,格式如下:

  sync+pid+0~1023字節+cRc16 (16位的校驗碼)

  (3)握手包    

    結構最為簡單的包,格式如下:sync+pid.

   (4)特別包:這里不做解釋

  3、事務

分別有in事務out事務setup事務三大事務,每一種事務都由令牌包、數據包、握手包三個階段構成,這里用階段的意思是因為這些包的發送是有一定的時間先后順序的,事務的三個階段如下:

  • 令牌包階段:啟動一個輸入、輸出或配置的事務。
  • 數據包階段:按輸入、輸出發送相應的數據。
  • 握手包階段:返回數據接收情況,在同步傳輸的in和out事務中沒有這個階段,這是比較特別的。

 

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM