close

CDC

簡化串列通訊埠升級USB 單晶片MCU事半功倍
新通訊 2008 年 4 月號 86 期《 技術前瞻 》
文.Lucio Di Jasio
如果曾留意新款筆記型電腦的接頭會發現,過去常用的複合式連接埠(COM Port)不見了,取而代之的是數個USB接頭。
USB的設計初衷就是要取代個人電腦(PC)上大多數的傳統介面。對於嵌入式設計人員而言,如果有許多支援USB的微控制器和介面裝置,COM Port極有可能被取代;只要選擇正確的工具和軟體解決方案,那麼將傳統介面改換成USB並不困難。  

硬體解決方案缺乏彈性  

一開始,設計人員通常在嵌入式控制器的串列通訊介面和連結到PC的USB之間,增加一個專用的USB-UART轉換器(圖1),此類裝置通常配有針對各種作業系統的特定驅動程式,才能提供一個標準串列通訊埠該具備的所有功能。

 

資料來源:作者整理
圖1 利用串列通訊至USB轉換裝置實現串列通訊應用

 

這種方法意味著須重新設計嵌入式應用電路板以騰出空間容納新的元件,卻不用改變韌體和PC應用程式;增加幾美元的成本,把無用的串列通訊埠接收器拆除,算是情有可原,但這樣做卻失去了採用USB可能帶來的好處。  

事實上,USB能支援更快的資料傳輸速度,達12Mbit/s,是使用典型串列通訊埠速度115kbit/s的一百倍,繼續使用UART會成為設計的主要瓶頸。此外,大部分的USB-UART介面裝置缺乏彈性,無法實現靈活的電源管理--這正是嵌入式設計中最關鍵的要素。  

單晶片解決方案可降低成本  

從串列通訊埠改採USB,更好的硬體選擇是採用單晶片解決方案,即選用具有USB介面的微控制器(MCU),並開發驅動程式(圖2)來取代串列通訊埠。從硬體角度來看,單晶片解決方案有以下優點:

與通用型號相比,配備USB介面的微控制器幾乎不須增加額外成本。
由於拆除了串列通訊埠接收器,電路板上元件的數量相對減少,同時在低成本USB連接器與新型USB相容微控制器的D+/D-接腳間能建立起直接的連接。
當通用微控制器和USB相容微控制器的接腳可相容時,電路板重新設計的成本可降至最低。
USB匯流排可供應5伏特電源給一些應用,原先這些應用所使用的電源轉接器便可移除,進一步降低成本。

 

資料來源:作者整理
圖2 串列通訊加上USB微控制器的單晶片解決方案

 

完善的類別資料庫能降低開發負擔  

一旦選擇單晶片解決方案,就須開發新的PC驅動程式與韌體。幸運的是,市面上有許多可重覆使用應用介面的分類選擇,協助軟體開發人員減輕開發工作負擔。  

今日的PC作業系統中,最普遍並獲得廣泛支援的USB介面裝置是所謂的人機介面(Human Interface Device, HID)。所有的PC都需要鍵盤或滑鼠這樣的人機介面,這些設備的連結方式已經從串列通訊埠或者PS/2埠升級為USB。該設備的驅動程式也已經設計成與各種作業系統相容,包括Windows、Linux和MAC OS。  

因此,對於那些需要在嵌入式設備中讀寫少量資料、又想簡化過程的設計工程師而言,HID是個非常迷人的選擇。不幸的是,應用程式介面(Application Programming Interface, API)並不同於COM Port,因此,將API移植到現有系統上會是大問題,特別當PC上已有一個複雜應用軟體的時候。  

還有其他像印表機或大量儲存設備都可使用標準USB介面,與嵌入式設備進行通訊。然而,它們也面臨同樣的問題,即陌生的介面以及必須開發新PC應用軟體的需求。  

開發驅動程式須對作業系統有深入的瞭解。對Windows PC來說,意味著要熟悉Windows驅動程式模型(Windows Driver Model, WDM)。如果沒有這方面的專業知識(大部分嵌入式控制設計工程師都不是WMD方面的專家),那麼開發一個可行基本運算的驅動程式最少須花費數月時間。  

幸運的是,有一個類別的介面幾乎存在於所有最近版本的Windows,能協助克服上述問題。此一類別的前身是微軟(Microsoft)原先為支援數據機應用而開發的USB通訊設備類別(Communications Device Class, CDC)。例如,微芯科技(Microchip)即為PIC18F4550系列快閃記憶體USB 8位元微控制器,提供了CDC介面的完整原始程式,讓工程師能順利地進行開發。這種CDC介面具備幾種優勢:

相對小的韌體程式碼,僅3KB。
單晶片解決方案。
僅使用大約50Bytes的資料記憶體空間(不包括緩衝區)。
最大處理量為80Kbit/s。
完全由USB協定控制資料流量(不需要RS-232 XON/XOFF和硬體流量控制)。

韌體升級簡易  

在下面的討論中,假設原先的串列通訊埠程式是用C語言編寫的,且用到一些通用的C語言程式庫來存取整合式的UART周邊。給定這些條件後,將韌體升級到CDC須進行的指令修改為:

在C的主程式頂端,使用#include指令將相應的USB指定為串列通訊埠。
在main函式中,增加呼叫USB-CDC初始化程式(Initialization Code)的程式碼。
在主函式迴圈中,增加呼叫USB背景工作的程式碼。
驗證應用程式碼,以實現與USB背景工作的協同多工處理。
為連結器提供USB-CDC專用程式庫,產生最終的可執行的程式碼,然後對快閃記憶體晶片進行燒錄。
實務上,上述這種情況要求該應用程式使用的功能不可包括阻塞迴圈。也就是說,任何功能都不能占用100%的處理器時間,也不能妨礙USB背景工作的執行。 反之,所有USB專用控制函數、中斷、旗標和緩衝機制都由CDC類韌體以背景工作處理,設計工程師毋須關注細節。設計工程師所看到的只是一個非常類似於通用串列通訊埠資料庫的函數集。表1為部分函數示例。

表1 CDC類API範例
putsUSBUSART 向模擬的串列通訊埠發送null terminated字串。
getsUSBUSART 從模擬串列通訊埠接收字串。
mUSBUSARTIsTxTrfReady 驗證發送緩衝器是否已準備好向USB發送。
資料來源:作者整理

大多數讀者立即就可認出這些函數並將其與通用C語言庫中的函數對應起來。事實上,puts和gets函數可以直接用CDC類中對應的putsUSBUSART和getsUSBUSART函數來替代。透過其他專用實施函數還可以支援不同的字串類型(無效結尾與固定長度緩衝)和儲存類型(RAM或ROM字串表)。圖3所示為利用CDC-USB函數實現的HelloWorld程式。

 

資料來源:作者整理
圖3 CDC類實現的典型Hello World程式

 

圖4所包含的例子可用作範本進行快速修改。檔案格式相當簡單,大多數Windows程式設計師都能迅速了解。即使對不那麼熟悉的人,也能識別其由許多包含在中括號的不同部分組成,中括號裡含有一或多個由參數名稱和參數值組成。
[Device List]部分包括由USB設計論壇(USB-IF)取得授權的公司和應用產品獨有的VID/PID號碼對以及其他資訊。
[Strings]部分包含作業系統在隨插即用階段,於不同的對話方塊中使用的不同字串和標題,並辨認硬體管理中的設備。

 

點圖放大
資料來源:作者整理
圖4 inf檔範例

 

VID授權後終身有效  

儘管設計人員可以修改製造商部分(Manufacturer Section)和字串部分(Strings Section)的內容,但VID和PID代碼則是不可更動的。USB-IF負責指定一組16位元VID代碼予一個欲銷售和生產USB產品的製造商。VID代碼須通過授權許可並得支付註冊費方能獲得(本文寫作時註冊費為1,500美元)。  

一旦分配了VID代碼,製造商就可以利用65,536(16位元)PID代碼來分辨其不同型號的產品。換句話說,VID代碼是終生有效的,因此很容易攤平一開始的VID註冊成本。  

當然,就單純開發目的,並不須完成整個認證過程,因為不同的製造商通常都提供「開發用VID/PID代碼組合」。為進一步鼓勵小型企業、剛起步的企業、顧問業以及其他非常小量生產企業,有些微控制器製造商還提供免費再授權個別VID/PID組合。  

讓工程師專心於應用開發  

若一切順利,待隨插即用機制準備就緒,一個新的串列設備就會出現在硬體的管理員中。系統會自動為它指定一個可用的埠號。例如,已經安裝了COM2和COM1,就會出現COM3。  

用戶可使用程式來連結此埠(如所有Windows都有的HyperTerminal程式)。與PC上最快的串列通訊埠相比,除了通訊速度提高一到兩級,其他功能並無二致。Visual Basic或C++程式可通過標準的Windows OpenFile()、ReadFile()和WriteFile()API來對模擬的COM埠進行讀寫,不用改變任何代碼。  

現在市場上已有USB相容的全功能快閃微控制器。這些單晶片解決方案為嵌入式控制設計工程師提供最低的成本和最大的彈性。  

透過使用CDC類資料庫、串列通訊埠模擬,工程師們可改採更具效率的USB接頭,並且避免Windows開發可能帶來的障礙。按照上述步驟,嵌入式設計工程師可以快速地從串列通訊埠轉移到USB,並將100%的精力集中到嵌入式應用的領域。  

(本文作者任職於微芯科技先進微控制器架構部門)

http://bbs.eeworld.com.cn/thread-307670-1-1.html

http://en.wikipedia.org/wiki/USB_communications_device_class

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 chenni037 的頭像
    chenni037

    Kenny's Blog

    chenni037 發表在 痞客邦 留言(0) 人氣()