USB接口
首先看一看 USB 的接口,當你看到這些接口時,你應該知道,哦,那是 USB 接口。不然學完了USB,USB 接口都不認識那就很尷尬了。
看到這些接口是不是很熟悉?常用的接口有 Type A 接口,這個接口一般直接插在電腦上的,Type B 接口比較少見,目前比較常見的是 Mini-B、Micro-B接口,前者在 MP3 之類的設備中比較常見,當然在我們工程師中的調試器中也經常使用,后者多用于手機等設備,不過目前大部分手機接口用 Type-C接口代替了:
這種接口可以正反插,并且能提供比其它接口更大的電流,速度更快,所以今天可以看到越來越多的設備開始支持 Type-C了。我們可以看看這些接口內部的引腳分布情況(不包含 Type-C 接口,這個接口引腳很多):
第四引腳在某些接口中可能沒有,其他引腳都是存在的。Vbus 和 GND 兩個硬件用于供電,提供恒定的 4.4 ~5.25 V電源(當 USB 為設備提供 5.25 V 電源時,數據線工作在 3.3 V),當設備使用總線供電時,將由這兩根引腳提供所需電源,當然總線提供的電流比較有限,所以如果說總線不足以提供足夠的電源,那么就需要使用外部供電。
D-、D+兩個引腳用于數據傳輸,類似串口的Tx、Rx數據線,不同的是,USB采用差分方式傳輸,使用雙絞線,并且在線上傳輸的數據編碼遠比串口的復雜,這個將在下節介紹。
這里需要注意一下線的顏色,一般的廠家生產USB數據線時會按照標準來生產,但是有些廠家卻不一定,紅色不一定是電源,黑色不一定就是地,使用的時候需要注意確認。標準的USB數據線外部一般會有屏蔽線包裹,防止外部干擾,但是有些廠家偷工減料,可能并沒有屏蔽線,甚至連D-、D+數據線都沒有,只提供電源線。
(圖片來源于網絡,外層白色包裹為屏蔽線)因為采用差分傳輸,并且只有兩個引腳,所以總線為半雙工傳輸,即同一時刻只能發送或接收。同時 USB 采用一主多從模式,即USB網絡中只有一個主機,其他都是從機,也就是設備。
USB 歷史版本
USB經過多年的發展,經歷了多個版本,初始版本 1.0,于1996年完成,支持低速(LS)模式(1.5Mb/s)和全速(FS)模式(12Mb/s)。USB1.1規范于 1998 年面世,改進了 1.0,但速度上沒有改變。USB2.0 在2000 年問世,增加了新的速度模式,即高速(HS)模式,最高支持 480 Mb/s。USB3.0在2008年發布,傳輸速率 5Gb/s。這些版本保持向后兼容的特性,即USB3.0的主機接口可以接入 USB 1.0、2.0 的設備,但是受到設備本身的速度影響,所以最終的速度由低版本速度決定。
通過數據(D+或D-)線上的上拉電阻的位置,主機可以識別低速設備和全速設備,而高速設備會在之后移除上拉電阻。
在 STM32F103 中,支持 USB 2.0接口 ,但是只支持全速模式下的2.0,即最大速度只有 12 Mb/s,換算到字節的話,只有 1.5 MB/s,除去USB本身的協議開銷的話(類似串口中的起始位、結束位開銷,但USB比這個復雜的多),最大有效數據帶寬差不多在1.2 MB/s(我們接下來要學習的就是全速模式)。
所以不要認為 USB2.0 的接口一定支持高速模式。在 STM32F4 中,USB開始支持高速模式,并且支持 OTG,這個模式使得USB 設備既可以當做主機也可以當設備使用。現在的手機一般都支持 OTG,即通過一根轉接線,即可將U盤之類的設備插入手機中使用,所以當你的手機觸摸屏壞了,別著急,插上無線鼠標鍵盤套餐,照樣玩手機。當然這只是應急使用,真正來說,沒誰會隨身帶著鼠標鍵盤的。
HUB 與 USB 拓撲結構
除了常見的設備外,在 USB 網絡中,還有一種特殊的設備,即 HUB(集線器),這種設備只有一個作用,就是將一個 USB 接口分成多個 USB 接口(最多 7 個)使用,這樣即使你的電腦只有一個USB接口,通過 HUB,你也可以實現多個設備的連接。HUB對于用戶而言是透明的(即用戶在使用時不用特別去操作它),而為了實現這種透明,HUB所做的工作要比上述復雜的多。
上圖是USB連接圖,可以看到,通過 HUB,一個 USB 網絡中可以連接非常多的設備(最多 127 個,由 USB 設備7位地址決定),并且由于集線器的時間和電纜傳播的延遲,最多只能連接五個 HUB,在層次上表現為上圖的 7 層(在全速和高速設備中,最大線纜長度為 5 m,低速設備限制為 3 m)。
USB網絡中的所有設備(包括HUB)都有一個地址,范圍 0~127,地址 0 是所有設備在接入 USB 網絡時使用的默認地址,當設備完成枚舉后,即可擁有新的 USB設備地址,之后所有的通信都將采用新地址通信。也就是說, USB 設備的地址是動態的,類似網絡的IP地址。
USB 層次結構
下面再來看看 USB 層次結構:
在開發時,尤其是軟件開發,主要的關注對象是上面兩層,而底層的實現一般來說都是由硬件自動完成的,比如STM32就幫我們實現了這一層,我們只需要獲取底層的數據然后進行相應的處理即可。