You are on page 1of 6

快速上手 USB 單晶片―觀念篇 1

快速上手 USB 單晶片―觀念篇


作者: 林錫寬
e-mail: sklin@cc.nctu.edu.tw

(原文刊於 e 科技雜誌 vol. 40,2002 年 4 月號)

許多人閱讀了不少市面上有關 USB(通用串列匯流排)韌體設計的英文或
中文書,仍然對 USB 韌體設計還是力不從心。也有一些已經為公司設計了 USB
裝置的工程師朋友,也透露對 USB 韌體技巧還是一知半解。學習 USB 韌體技術
對許多人而言,一直不僅耗時耗力,也是困難重重。

一般 USB 韌體工程師分為二個層級:一是不知亦能行的韌體技術員,另一
為精通 USB 規範的韌體工程師。絕大多數的課程或書籍都在教導不知亦能行的
技術,也就是找一個相似功能的 USB 裝置的韌體範例,只去更改基本微控器的
功能相關程式,而避開 USB 通信相關的程式。USB 微控器廠商都會提供大量的
韌體範例,所以不知亦能行的技術已經能滿足許多人的求知願望或是工作需求。
然而這種技術也不是能速成的;另一方面,每次開發產品又要研讀大量似懂非懂
的韌體範例,也會拖延產品研發時間。就算能在很短時間開發出 USB 產品,也
無法非常安心擔保產品的完美無缺。事實上,精通 USB 的來龍去脈,才是一位
USB 韌體工程師在職場致勝的利器。

USB 韌體技術的進入門檻被認為很高之因在於 USB 規範。厚厚的一本 USB


規範往往讓人望而卻步。精明者或能悟出規範中與韌體有關的章節並不是很多,
然而規範中缺乏範例,又使人不知如何將規範中的規則轉化成韌體的程式。這個
原因正點出降低 USB 韌體技術學習困難度的方法。對韌體工程師而言,只要瞭
解規範的第八章(通信協定)和第九章(咨求函數與描述元)即可。若能將這二
章中的規則用韌體範例來加以解說,則所有學習障礙都可以應刃而解。

USB 是一種同步串列傳輸的標準,這個標準在硬體和軟體上制定了許多嚴
謹的規範。軟體方面的規範就是通信協定,USB 應用了最先進的資料通信理論。
了解這些先進的理論不是件容易的事,但是理解 USB 的通信協定並非難事。此
外,USB 規範也制定了裝置屬性和運作功能的描述元,主機(即個人電腦)藉
由描述元來認識各式裝置和解釋與應用傳輸的數據。在 USB 規範中的咨求函數
就是讓主機應用來讀取或選擇描述元,所以咨求函數就是 USB 通信的共通的指
令。通信協定中的控制型傳輸就是在傳送咨求函數。簡單的說,學習 USB 韌體
技術就是學習『通信協定』 ,『描述元』的撰寫,和『咨求函數』的格式。而這三
者的知識取得最好的方式就是閱讀 USB 規範的第八章和第九章。不過規範的編
2 快速上手 USB 單晶片

排為參考手冊方式,對初學者還是很難理解。作者曾在 e 科技雜誌先後發表有關
描述元的文章(2003 年 vol. 24,2003 年 vol. 25 和 vol. 30~32)
,文中即嘗試以範
例和韌體程式來說明這方面知識和撰寫技巧。撰寫描述元的韌體程式碼是 USB
韌體工程師必備的基本技能。

自從 1996 年 USB1.0 版問世以來,在 1998 年更新為 USB1.1 版,到 2000 年


發表了最新的 USB2.0 版;傳輸頻寬由 1.5 Mbps(USB1.0 版),增到 12 Mbps
(USB1.1 版),最後一舉提升到 480 Mbps(USB2.0 版)。一般人就用版本來代
表 USB 的速度,這不是很正確的說法,因為在 USB 2.0 的規範中也涵蓋了低速
裝置。正確而言是

z 低速裝置:頻寬為 1.5 Mbps。


z 全速裝置:頻寬為 12 Mbps。
z 高速裝置:頻寬為 480 Mbps。

USB 的應用相當廣泛,所以越高速的 USB 微控器功能也相對比較複雜,應


用領域的專業知識也難度很高。登高必自卑,行遠必自邇,冒然學習高速的 USB
微控器是不智之舉,所以建議讀者由低速的 USB 微控器入門。其實,就韌體技
術而言,不同速度的 USB 裝置的 USB 通信程式差異相當小,但是應用領域的專
業知識就相差很大。Cypress 公司號稱生產世界第一顆高速 USB 引擎的微控器,
該公司的 USB 微控器產品相當齊全,擁有極高的世界佔有率,所以讀者可以以
該公司的低速 USB 微控器為入門的對象。由於低速 USB 裝置僅能使用通信協定
中四型傳輸的二型(控制型和中斷型) ,所以從低速 USB 裝置開始學習也可以減
低學習負擔。作者預估,未來市面上將只剩低速和高速的 USB 裝置。全速 USB
裝置的應用領域幾乎為高速 USB 裝置者所涵蓋,而以 Cypress 公司的報價,全
速和高速微控器的價格相差有限,所以全速裝置幾乎無生存空間。若降格用全速
USB 微控器來發展低速 USB 裝置,更是不符合經濟原則。相反的,低速 USB 微
控器永遠會存在,因為價廉和簡單使用不是高速 USB 微控器所可以取代的。這
個道理就如同 32 位元的微處理器無法霸佔 8 位元微處理器的市場。
快速上手 USB 單晶片―觀念篇 3

表1 各型 USB 微控器研發成本考量表
型 號 單價 CPU 蕊 發展系統 系統 備註
價格
低 CY7C63001A-SC ($1.35) M8 (A) CY3650 $495 A型
速 CY7C63101A-SC ($1.48) M8 (A) CPU
CY7C63413-PVC $2.65 M8 (B) CY3654, $800 B型
CY7C63513-PVC $2.90 M8 (B) CY3654-P02 +$400 CPU
CY7C63613-PVC $2.55 M8 (B)
CY7C63221A-PC $1.98 M8 (B) CY3654, $800 enCoRe
CY7C63231A-SC $2.05 M8 (B) CY3654-P05 +$400
CY7C63723-PC $2.40 M8 (B)
CY7C63743-PC $2.55 M8 (B)
全 CY7C64013-PC $3.95 M8 (B) CY3654, $800 B型
速 CY7C64113-PVC $4.30 M8 (B) CY3654-P03 +$700 CPU
CY7C64603-52NC $11.70 8051 CY3671 $495 EZ-USB
CY7C64613-52NC $8.50 8051 FX
SL11R ($4.15) CY16 SL11R-DK $495 16 bits
高 CY7C68001-56PVC $6.85 無 CY3682 $495 引擎
速 CY7C68013-56PVC $9.90 8051 CY3681
EZ-USB $495
FX2
註: 單價為數量為 10 至 99 顆的每顆價錢,單位為美金,括號內價錢表示為
數量 100 至 999 顆的單價。

表 1 列出不同速度的 USB 微控器的價格,這些資料是 2003 年取自 Cypress


公司的網站,只要在該網站搜尋欄鍵入所要找的微控器型號,例如 CY7C63743,
則可以找到所有與該微控器相關的資料,包括產品價格。這些價格僅供參考,因
為常常隨季變化。很明顯的,全速系列產品除了上面提到已被高速 USB 微控器
取代之事實外,在價格上也不具競爭性。全速的 EZ-USB FX 系列和高速的
EZ-USB FX2 相比較,二者的發展系統不同但價格一樣便宜,可是全速的晶片價
格和高速者相差有限,作成 USB 裝置的成品就無法和高速者競爭。另外一方面,
如果貪圖發展系統便宜而用來降格製作低速 USB 裝置,則晶片價格的懸殊也無
與低速微控器競爭的空間。低速微控器中以 enCoRe 系列(元件減少增強型)最
值得使用,唯一的缺點是發展系統太貴了。如果要進階學習高速 USB 在大量儲
存裝置的技巧,可以找 Cypress 公司的參考設計套件 CY4611 來研究,該套件部
份資料可以直接從網站上下載。在此誠心建議,除了擁有發展系統 3654 外,可
以再考慮的購置的發展系統為 EZ-USB FX2 系列的 CY3681,不建議去學習使用
EZ-USB FX 系列。
4 快速上手 USB 單晶片

元件減少增強型的 USB 微控器是在減少使用外部元件,以降低產品成本,


例如可以不需要外部振盪器,USB 和 PS/2 模式切換不需外部切換器,一個內部
3.3 V 穩壓器,輸出輸入腳無須外接元件。除非裝置需要許多輸出入腳位(例如
鍵盤) ,否則 enCoRe 系列晶片是低速 USB 裝置的首選。無論如何,熟悉 enCoRe
系列晶片,也能輕鬆駕馭其他低速 USB 系列晶片。這就是作者極力推薦學習
enCoRe 系列晶片的原因。注意,表 1 中的 A 型 CPU 產品,應該屬於不成熟產
品,加上發展系統難用的程度可謂罄竹難書,所以建議千萬不要去接觸。

最典型的低速 USB 裝置為電腦滑鼠和電腦鍵盤。這二種裝置之所以稱作最


典型是因為他們幾乎使用到所有的 USB 規範的規則,例如只有這二個裝置具有
boot 的報告協定。電腦鍵盤具有為數眾多的按鍵,硬體電路比電腦滑鼠的要複
雜,週邊介面程式也相對複雜,所以電腦滑鼠是最好的快速上手 USB 單晶片的
目標裝置。電腦滑鼠具有三個按鈕和二個(或三個)移動軸,IO 介面簡單不需
要複雜的一般微控器程式,所以學習者比較不會迷失方向,而能專注於 USB 通
信韌體。本文的下一篇文章將選用這個簡單卻涵蓋完整的 USB 裝置與主機互動
功能的裝置,來介紹 USB 裝置的韌體技術。重點在於強調 USB 裝置的韌體架構
與程式運作流程外,這是一種跳過通信協定快速認識 USB 裝置的韌體的方法。
目的希望讀者讀完後,除了可以產生學習 USB 韌體的興趣外,也可以意會出 USB
規範書的規範內涵。例如,怠惰期,懸置模式,和遠端喚醒都能以電腦滑鼠來詮
釋其定義和展示其使用方法。如此則可以訴求快速學習 USB 單晶片。

主機與 USB 裝置間的 USB 通信,在架構上分為二層,如圖 1 所示。主機的


二層為 USB 驅動程式和 USB 應用程式。USB 裝置都會有一個 USB 引擎和韌體
程式。USB 通信的執行者為主機的 USB 驅動程式和裝置的 USB 引擎,它們負責
建立傳輸封包、解封包、檢驗通信協定。主機中的應用程式可以到固定的記憶體
緩衝區讀取 USB 驅動程式接收到的資料,和將要送給裝置的資料存到 USB 驅動
程式的傳訊緩衝區後,再通知 USB 驅動程式執行傳送動作。如果不考慮匯流排
列舉(bus enumeration),則裝置的韌體程式幾乎和一般的微控器程式沒什麼差
異,只多了讀取 USB 引擎存入傳輸緩衝區的接收資料和載入同一緩衝區資料讓
USB 引擎傳送。
快速上手 USB 單晶片―觀念篇 5

個人電腦 USB裝置
(主機)

USB驅動程式 USB引擎

USB應用程式 韌體

圖1 主機與 USB 裝置間的 USB 通信架構。

USB 裝置的韌體架構可以用圖 2 來說明。程式之開端都是一些初始化的工


作,完成後就等待 USB 匯流排重置訊號。一旦偵測到 USB 匯流排重置訊號,就
執行 USB 匯流排重置的中斷處理,它是致能端點 0 的中斷功能和通信模式(例
如只接收 SETUP 封包,而不接收其他封包) ,還有致能匯流排位址為 0 的傳輸。
此後就可以使用位址 0 來和主機通信,首先的通信內容稱作匯流排列舉。經由匯
流排列舉,主機取得裝置的屬性與運作方式(利用裝置的描述元),主機也指定
一個新的匯流排位址給裝置,以後裝置就以這個新位址和主機通信。作完列舉動
作,才正式執行主程式。主程式產生的資料要傳主機和要接收主機傳來的資料再
交由主程式作處理,就得透過中斷型端點來進行 USB 傳輸,這些傳輸動作就分
別由端點 1 和 2 的中斷副程式處理。為了省電,USB 規範中制定有懸置模式
(suspend mode),在懸置模式中所有 USB 匯流排的活動都停止,主機也僅提供極
微小的電流給裝置,所以裝置在偵測到 USB 匯流排的沒活動達 4 ms,就要進入
類似睡眠模式的懸置模式,僅需使用少量電流來偵測 USB 匯流排的活動訊號。
一旦有 USB 匯流排的活動訊號,裝置就會自動甦醒,再繼續先前的工作。關於
懸置模式的運作都由專門副程式來處理。在實務篇中,除了 USB 匯流排列舉和
USB 資料傳輸的程式不介紹外(有興趣者,可參考與此文同名的作者之書) ,其
餘的程式技巧都會作扼要的介紹。
6 快速上手 USB 單晶片

初始化

等待USB
匯流排重置

USB
匯流排重置

USB匯流排列舉
(端點0中斷)

USB匯流排 USB資料傳輸
主程式
懸置模式 (端點1和2中斷)

USB 韌體技術
圖 2 USB 裝置的韌體架構圖。

應用程式之撰寫為開發 USB 裝置另一項障礙。作者也曾經在 e 科技雜誌發


表一篇此方面技術的文章(2003 年 vol. 23) 。該文採用巨細靡遺的方式,介紹使
用微軟 Visaul C 來撰寫 USB 裝置中 HID 類別的應用程式。讀者只需要略懂 C 語
言,就可以閱讀這些內容。

You might also like