USB簡介
USB歷史
資料原本是使用並列埠傳輸([arallel port),但相較於當時的串列埠傳輸以較快,不遇到一些問題
1.傳輸時容易受到外部其他訊號干擾,傳輸長度不常
2.並列埠資料傳輸的同步不好解決
USB 2.0介面
USB是一種序列傳輸介面,Plug and Play(PnP)隨插即用
USB1.x/2.0 standard pinout
1: V, red(or orange),+5
2: D-, white(or gold)
3: D+, green
4: GND, black(or blue)
USB1.x/2.0 mini/micro pinout
1: V,red,+5
2: D-,white
3: D+,green
4: ID,N/A,
Permits distinction of a host connection from device connection:
- host: connected to the signal ground
- device: not connected
5: GND: black
訊號傳輸
使用雙絞線(twisted pair,D+,D-)傳輸,消除電磁干擾
半雙工差動訊號,NRZI(non-return-zero inverted)編碼方式
NRZI(不歸零就反相): 無須同步時脈訊號也能產生同步資料存取,當資料為1時不轉換,0時再轉換
但連續的1或0會造成接受者和發送者頻率誤差,這時就會強制插0,也就是bit-stuffing
資料傳輸流程:
serial data -> bit-stuffing -> NRZI encoder -> differencial signal
<-bit-destuffing<-NRZI decoder<-
網路層
USB網路是由階梯型星型拓樸實作的,有個master和多個slaves
USB host提供一個接口,如果要連接更多週邊,則須hub
- 一層: 提供給host(bus master)
- 二~六層: 提供給hubs or devices
- 考慮訊號衰減和時間限制,網路架構最多七層
- USB網路最多可支援127個裝置節點(7 bits in Token packet = 2^7-1)
USB device又可分為:
- hub: 用來連接更多裝置
- function: 提供特殊功能給系統,如人機裝置、影像裝置、儲存裝置
- compound device: 本身擁有功能(function),也帶一個hub,有其他裝置連接時可做為host
- composite device: 提供超過一個功能的裝置
USB由幾種Protocol Laters 所組成,資料由Pipes傳輸。
- stream pipes: pipes可以被host或者device控制,資料的傳輸方向必須事先定義,定義為in or out
支援bulk transfers, isochronous transfers, and interrupt transfers。 (have no defined USB format)
- message pipes: 為host控制來進行資料傳輸設定,允許雙向通訊。只支援control transfers。 (have a defined USB format)
Endpoints
endpoints可以被視為資料的來源或目標。一個裝置可以擁有至多16個out和16個in的endpoints
- out: 從host指向device的方向
- in: 指向host的方向
每個endpoint只有一個傳輸方向,只有endpoint 0例外,endpoints 0可以有in and out的雙向傳輸(透過message pipe),用來控制device。
傳輸型態
USB定義四種傳輸型態:
1.control transfers: 用於控制傳輸命令及狀態操作。像是設定裝置、取得裝置資訊、發送指令到裝置等。每個USB裝 置都有一個endpoint0,USB core就是使用他在裝置插入後進行設定。
2.interrupt transfers: 需要host端先詢問(polling)才會執行。用一個固定速度傳輸少量資料,像是鍵盤、滑鼠。
3.bulk transfers: 用於大量資料傳輸且須要確保資料無誤(印表機、隨身碟),沒有速度限制,如果失敗就重傳確保資料 正確。
4.isochronous transfers: 用於大力資料傳輸,但不確保資料至否到達。USB視訊裝置,沒通過CRC資料也不會重傳。
USB資料連結
一個transaction通常包含三個封包,也可能是一個、兩個、三個封包,封包是USB傳輸的最小單位。
token packet + data packet + handshake packet(or status packet)
*note: PID(packet ID) bits are shown in MSb order. When sent on the USB , the rightmost bit(bit 0) will be sent first.
由上表可以看到,PID只使用到前4 bits,後4 bits是前4 bits倒數,主要是因為USB傳輸是透過NRZI,可以避免bit-stuffing
Transaction
- transaction可以是host到device或者device到host
- 傳送方向是由token packet中指定
- 一般用handshake來判斷本次傳輸是否成功
Frame
低速和全速是以1 ms為單位,稱為一個frame ; 高速時再把一個frame切成八等分,一個0.125 ms,稱microframes。
Packet
sync + data bytes + EOP
- least significant bit first
- EOP(end of packet)
Token packet
PID + ADDR + ENDP + CRC5
8 + 7 + 4 + 5 bits
- token封包定義裝置、endpoint數量、傳輸方向
- 用PID識別OUT、IN、SOF、SETUP
- 對於OUT、SETUP,位址與端點欄位用來選擇接收資料的端點
- 對於IN,位址與端點欄位選擇傳送資料的端點
- PID後面緊接著他的補數,避免biit-stuffing
SOF為特別封包類型,包含目前的frame number,主機每隔一段很小時間間隔就會發出一次SOF封包,所有裝置及hub都會收到。
Data packet
PID + data + CRC16
8 + 0~1023 bytes + 16 bits
在low-speed裝置中,data packet最大資料量為8 bytes ; 在full-speed中, data packet最大資料量為1023 bytes ; 在high-speed,data packet最大封包資料量為1024 bytes以上。
Data 0及Data 1為基本資料封包,用於確定傳送端和接收端之間的資料切換同步。另外於USB 2.0更增加Data 2、MData資料封包,用於執行高速的即時傳輸(isochronous transfer)。
Handshake packet
PID
8 bits
handshake packet用於確保是否正確被收到,若發生握物,將重新執行。
- ACK表示資料封包沒有bit-stuff、CRE error,也就是PID即DATA欄位都正確
- NAK表示device無法從host接收資料或是無法傳輸資料到主機。NAK也可作為流量控制,表示裝置暫時無法接收或傳送資料
- STALL表示裝置無法傳送或接收資料,需要主機介入
USB OTG(on-the-go)
USB裝置的腳色都是固定的,OTG讓原本只能為週邊的裝置也能成為host。
OTG設備永用插頭中的ID引腳來區分A/B device。
- ID接地,為連接時的host,始終為USB bus供電
- ID懸空,為連接時的device
設備的USB host/USB device可以通過HNP切換
USB OTG與USB2.0相比,多三種新的傳輸協定
1.attach detecion ptrtocol
- 藉由USB bus上的通電損失來決定是否有接附裝置,此機制會啟動兩種現象,裝置插入的基本原理表現及讓裝置能表達目前連接狀態
- 如何達成上述機制: 藉由週期性的量測USB port上的電容(capacitance)變化,已確定是否有裝置連上 ; 當電容的變化大到足以表示有新裝置街上USB port,A-device會通電到USB bus,轉備與裝置連線,而B-device會產生SRP,並等待USB bus供電。
2.session request protocol(SRP,對話請求協議)
- 兩邊供電機制已啟動後,兩個溝通的device都可以取得主控權 ; 在標準USB機制中,只允許host端進行控制。
- 此機制能夠有效的控制供電消耗,有請求才供電。
3.host negotiation protocol
- 允許兩個裝置(OTG-device)交換host/peripheral的腳色。
- 最新版的HNP有一個概念,HNP polling,週期性的詢問peripheral是否成為host
USB descriptors
- device descriptors: 提供裝置基本資訊,如USB版本、最大packet大小、廠商與型號資訊。每個裝置只能有個device descriptors。
- configuration descriptors: 指出USB的供電方式、interface數量。每個USB裝置可以用有不只一個configuration descriptor,可視為interface descriptor之header。
- interface descriptors: 提供介面資訊,可視為endpooint descriptor之header。在configuration descriptor中指定出interface數量,因此interface description可以擁有一個以上。
- endpoint description: 描述endpoint之行為與頻寬。
- string descriptor: 提供人類可讀的資訊
< 興趣很難發覺,只有多方嘗試 >
- 這裡紀錄著我的心路歷程,每一篇文章都代表著進步
分享不錯的練習平台 https://www.codingame.com/
一起進步吧