1、概述
本文主要介紹使用新唐的NuMicro® 系列支持的USB2.0全速裝置控制器的韌體程式來開發USB裝置,其韌體程式就是一般的USB控制與狀態處理的部分,方便使用者直接套用,有助於不懂USB規格的使用者也能自行設計USB應用程式並減少USB程式設計的時間。
本文前半部分會簡單介紹USB的基本觀念,USB詳細規格說明請參閱USB Specification Revision 2.0;第二部分將以新唐的 Cortex® -M0 Nano100B 為例,介紹 NuMicro® USB2.0全速裝置控制器的功能與韌體程式的使用方式,最後則是以六個實際的類別應用範例做說明,應用範例有:
• HID Transfer
• HID Keyboard
• HID Mouse
• MSC
• VCOM
• Audio
2、USB簡介
通用序列匯流排(Universal Serial Bus,USB)用來連接電腦系統和外部裝置的一種串列埠匯流排標準,主要將連接至電腦的纜線減至最少,讓許多不同的週邊裝置都可以使用相同的連接線。而連接上電腦時,電腦會自動識別這些週邊裝置,並且搭配適當的驅動程式,無需使用者再另外重新設定。
USB匯流排其最大的特點是支援隨插即用的技術並且支援熱插拔(可以在不需要關閉電源的情況下插入或拔除),當裝置插入時,主機列舉到此裝置並載入所需的驅動程式。USB的匯流排結構是採用階梯型星型拓撲(Tiered Star Network)結構,它由一個主機控制器和若干通過集線器裝置以樹狀連接的裝置組成。一個控制器下最多可以有5級Hub,包括Hub在內,最多可以連接128個裝置,因為在設計時是使用7位元定址欄位,二的七次方就等於128,若扣掉USB主機預設給第一次接上的週邊裝置使用,還剩127個位址可以使用。因此,一部電腦最多可以連接127個USB裝置。位址0是所有USB裝置的預設位址,當USB裝置接上主機時,其位址就是0,然後主機會盡快分配一個位址給它。USB裝置(USB Devices)指各種類型的USB週邊裝置,它具備某種Function(功能)的裝置;一種是「單一功能」的USB裝置,一個功能佔用一個USB纜線(Cable)和USB埠(Port),例如滑鼠、鍵盤、RS-232或移動儲存裝置。另一種為「複合裝置」,是一個具有多個功能和配置多個介面的組合裝置,但是只有一個唯一的裝置(Device)地址,透過相對應的USB裝置驅動程式(Device Driver)來與主機通訊,可使用僅有的一條纜線和一個USB埠實現多個功能。
USB裝置定義許多不同的類別(Class),常見的類別有:USB 通訊裝置類別 (CDC)、人性化介面裝置類別(HID)、大容量儲存裝置類別(MSC),以及USB音訊裝置類別(UAC)。而依照目前USB產品的規格,可以將USB裝置分為以下三種不同的速度:
- 低速裝置(Low-Speed Devices):傳輸速率最高為 1.5 Mbps
- 全速裝置(Full-Speed Devices):傳輸速率最高為 12 Mbps
- 高速裝置(High-Speed Devices):USB2.0 所提出的新規格,傳輸速率最高為 480 Mbps
每個週邊裝置都具有端點(Endpoint),而主機與端點的通訊是經由虛擬管線(Virtual Pipe)所構成的。一旦虛擬管線建立好之後,每個端點就會傳回描述此裝置的相關資訊(也就是描述元Descriptor)給主機。USB的端點傳輸共有四種類型:控制(Control)、中斷(Interrupt)、巨量(Bulk)與等時(Isochronous)。
設計USB裝置的應用之前,必須了解USB介面的一些標準與規格,本章節會簡單描述USB的基本知識,詳細的USB規格可參考USB Specification Revision 2.0。
2.1 USB 介面
USB的連接線由+5伏特(VBus)與接地線(GND)加上兩條差動的資料線D+與D-所組成,兩條訊號線使用雙絞線(Twisted Pair)傳輸,以抵消長導線的電磁干擾。D+與D-它們各自使用半雙工的差動訊號,並利用NRZI(Non-return-To-Zero Inverted)的編碼方式來傳送,來達成高速傳輸的目的。USB藉由兩條訊號線D+與D-的電位表現出不同的狀態,組合這些狀態來產生傳輸資料與多種匯流排狀態,包含閒置(Idle)、暫停(Suspend)、恢復(Resume)、封包開始(Start of Packet)、封包結束(End of Packet)、切斷連接(Disconnect)、連接(Connect)、重置(Reset),表 1顯示出不同的信號如何呈現出不同的匯流排狀態。匯流排狀態 | 描述 | Idle | (D+) - (D-) > 200 mv,此狀態在全速裝置中稱為J State | Suspend | Idle狀態超過3ms | Resume | (D-) - (D+) > 200 mv,此狀態在全速裝置中稱為K State | Start-ofPacket (SOP) | 從Idle轉換為Resume | End-of-Packet (EOP) | D+與D-為低電位維持2bit時間,在第3個bit即轉為Idle。 | Single-ended 0 (SEO) | D+S1D- < Vse(min),VsE(min) = 0.8v ° | Disconnect | SEO超過2.5us。 | Connect | D+或D-為高電位超過2.5us。 | Reset | D+與D-為低電位超過2.5us。 |
USB上的資料傳輸採用NRZI編碼方式來對每個位元個別編碼,其編碼規則為:當資料位元為1時不轉換,資料位元為0時再做轉換。圖 1顯示資料位元組的NRZI編碼範例,圖 1紅線表示資料轉換。
NRZI資料流中的位元轉換能使解碼器維持與進來的資料同步,為了避免重複相同1的信號一直進入時,導致讀取的時序會發生嚴重錯誤,最終將導致接收器失去同步狀態,所以採用位元填塞(Bit Stuffing)。其方法為:資料中含有六個連續的1,就需要在其後面填塞一個0,以確保接收端會定期同步化。圖 2呈現位元填塞的過程。
2.2 USB 通信協定
USB傳輸的控制權是由主機端掌握,不論是控制命令或是資料傳輸時,裝置都只是在回應主機的動作。主機端利用標準的USB通信協定來與USB週邊裝置溝通,USB傳輸(Transfer)由一或多個交易(Transaction)組成,而交易(Transaction)包含了二或三種封包(Packet),封包(Packet)是組成USB傳輸的最小單位。圖 3說明USB Transfer-Transaction-Packet三者之間的關係。
2.2.1 USB 封包格式
USB封包是執行所有處理動作的機制,封包格式依照需求會由七個欄位刪減而組合而成,這七個欄位包含:同步(Sync)、PID、位址(Address)、端點(Endpoint)、訊框數目(Frame Number)、資料(Data)、CRC。
封包緊跟在SYNC之後,高速裝置封包的SYNC長度為32bit,全速與低速裝置封包的SYNC長度為8Bit。PID用來定義封包的類型,分為Token、Data、Handshake及Special四種類別,共有16種類型的PID,具體定義請參考表 2。PID的資料長度為8個Bits,只用到前面四個Bit,後面4個Bit其值固定是前面4個Bit的補數,需注意的是PID的格式為LSB在前面MSB在後面。舉例來說,假設PID的前面4個Bit=1001,那後面4個Bit就是0110,PID合起來就是10010110。其中Special是針對USB2.0特有的PID,包含了PING(檢查端點裝置是否能接收資料)、SPLIT(高頻寬的USB分割傳輸)、PRE(低頻寬的USB前導封包)、ERR(分割傳輸任務錯誤)。對於OUT和SETUP處理,位址與端點欄位用來選擇接收資料的端點;對於IN處理,位址與端點欄位用來選擇傳送資料的端點。最後,每個封包以一個CRC做結尾,它用來確認資料是否正確的傳輸。
|