USB概述USB為目前廣泛被使用的一種串行通訊協議,它包含USB1.0 USB1.1 USB2.0 USB3.0,其中USB1.0USB1.1支持低速模式(1.5Mb/S)與全速模式(12Mb/s),USB2.0還支持高速模式(480Mb/s),USB3.0在做到兼容前面的同時,自己的速度提升到高達5Gbps全雙工...
USB是一種主從通信模式,通信過程由主機(host)發起,從機(device)只能被動的負責應答,通信只能在主機與從機之間進行...
為了突破主從通信模式對通信的限制,出現了USBOTG,USB設備可以靈活的工作在主機或者從機這兩種狀態下,這樣設備與設備之間通過模式切換就可以進行工作,大大提高了USB的使用范圍
USB的拓撲結構
主機可以有 一個或者多個USB主控制器(host controller)和根集線器(roothub),主控制器負責數據的處理,而集線器一個接口與通路為主機與設備,一個主控制器可以通過集線器為USB設備提供多個USB接口,但是這些接口總的帶寬是不變的,在集線器的作用下,集線器可以形成多層嵌套,但是有一定的限制,在USB1.1中,HUB的層數最多只能為4層,USB2.0規定做多為6層,一個USB控制器理論上通過集線器擴展接口后,最多可以掛接127個設備,因為USB協議規定每一個USB設備具有一個7bit的地址
USB的電氣特性
USB接口使用的是差分電平傳輸,在低速與全速模式下,使用的電壓傳輸,在高速模式下,使用的是電流傳輸;
標準的USB連接線使用的是4芯電纜,其中包括Vbus D- D+ GND(在USB OTG中連接線為5條,多了一天身份識別線ID)
USB在傳輸過程使用的是NRZI編碼方式,
USB協議規定,設備在未配置之前,從Vbus上獲取的電流最多是100mA,在配置之后,最多可以從Vbus上獲取的電流為500mA,,Vbus的電壓為5V,
USB的插入檢測機制
在USB集線器引出的各個子USB物理接口上,D+D-分別接了一個15K的下拉電阻到地,因此在沒有設備插入的情下,D+ D-呈現低電平,而在USB的設備端,D+或D-接了一個1.5K的上拉電阻到3.3V的電源(具體接在D+還是D-上,由具體的設備決定)--->速度快的,上拉電阻接正的,速度慢的,上拉電阻接負的;
當設備插入到集線器上的接口時,集線器下的相應端口的V+或V-,就會出現電平變化,由串聯公式可以知道這時V+或V-上的電壓大概為3V,一個高電平信號給了集線器,集線器在將這個狀態上報給控制器,這樣就檢測到了設備的插入,
如果是USB的高速設備在插入到集線器上時,先被識別成全速設備,通過集線器與設備的雙方確定后,再轉到高速模式,由于高速模式下,為電流傳輸,所以這時D+上的上拉電阻需要斷開。
USB的各描述符之間的關系
USB1.1中,USB協議包含的描述符有設備描述符、配置描述符、接口描述符、端點描述符、
USB2.0中,新增加了device qualifierDescriptor and Other Speed Configure Descriptor;
一個設備只能有一個設備描述符,該設備描述符決定有多少種配置,每一種配置都有一個配置描述符,在每個配置描述符里面又定義了有多少個接口,每一個接口有一個接口描述符,每一個接口描述符又定義了接口描述符中有多少個端點,每個端點又有一個端點描述符,端點描述符描述了該端點的大小以及類型等信息。
各描述符詳細的描述信息請大家參考具體USB開發指南。
USB設備有一個USB設備地址,USB主機通過該設備地址訪問USB設備,但是在USB設備內,他包含很多個端點,所以僅有設備地址還不夠,還必須要有端點地址,有了這兩個地址后,USB主機就可以準確地與USB設備的端點發送與接收數據了
USB設備的枚舉過程
USB設備在檢測到USB設備插入之后,就要對設備進行枚舉,枚舉就是獲取設備的各種描述符信息,這樣主機方便加載合適的驅動程序;
在設備的枚舉過程中,使用的是控制傳輸以確保數據的正確性
USB包結構以及傳輸過程
USB為串行傳輸,LSB在前,最后是MSB,
USB總線上的傳輸數據是以包為基本單位,一個包被分成很多個域,LSB與MSB是以域為單位來劃分的;
不同的包有共同的特性,就是都以同步域開始,緊跟著一個包標識符(PID),最終以包結束符(EOP)來結束一個包,其中的同步域的作用是通知USB串行接口數據即將開始傳輸,做好準備,同步域還可以用來同步主機端與設備端的數據時鐘,因為同步域是一串0開始,而0在總線上傳輸時經過編碼為電平跳轉。
對于全速與低速設備,同步域使用的是00000001(二進制數在總線上的發送順序),對于高速設備,同步域使用的是31個0,后面跟個1(這些要求針對的對象是主機);
包結束符(EOP),對于全速、低俗與高速設備也是不一樣的,全、低速設備的EOP是一個大約2個數據寬度的單端0(SE0->即D+D-同時為低電平)信號,【對設備的復位就是將SE0狀態如果保持10mS、】,而對于全速設備EOP是使用故意的位填充錯誤來表示,同時通過CRC校驗來判斷一個位填充錯誤是真的位填充錯誤還是EOP標志(CRC校驗正確就是EOP);
包標識符(PID)是用來標識一個包的類型,一共8個位,使用其中的4個位來表示,另外4個位取反進行校驗用,
包的類型有4類:令牌包(PID1~0:01)、數據包(PID1~0:11)、握手包(PID1~0:10)、特殊包(PID1~0:00),
每一個類型的包中有可以子分為幾種不同功能的包:
令牌包:OUT(0001)、IN(1001)、SOF(0101)、SETUP(1101)
數據包:DATA0、DATA1、DATA2、MDATA(后兩種USB1.1不支持)
握手包:ACK、NAK、STALL、NYET(最后一種USB1.1不支持)
特殊包:PRE、ERR、SPLIT、PING(后三種USB1.1不支持)
因為USB為主從結構,數據傳輸由主機發起,設備只能被動的接聽數據(除了遠程喚醒功能外【遠程喚醒并不傳輸數據,只改變下總線狀態】),所以需要主機發送一個令牌來通知哪個設備進行響應,如何響應;
OUT:輸出令牌包用來通知設備將要輸出一個數據包
IN:輸入令牌包用來通知設備返回一個數據包
SETUP:建立令牌包只用在控制傳輸中,他跟輸出令牌包作用一樣,用來通知設備輸出一個數據包,兩者區別在SETUP包后只使用DATA0數據包,且只能發送設備的控制端點,并且設備必須要接受,而OUT包沒有這種限制。
SOF:幀起始包在每幀(或微幀)開始時發送,她以廣播的形式發送,所有USB高速與全速都可以接收到SOF包,USB全速設備每毫秒產生一個幀,而USB高速設備每125微秒產生一個微幀。在每次幀(微幀,每毫秒內的8個微幀的幀號一致)開始時,通過SOF包發送幀號,USB主機則對當前的幀號進行計數,SOF令牌包之后是不跟數據傳輸,其他的都帶有數據傳輸
每一個令牌包最后都有一個CRC5的校驗,他只校驗PID之后的數據不包括PID本身
。。。。。
|