基於AVR單片機的通用USB介面模組設計
| [日期:2008-6-25] |
來源:中電網 作者:張洪,董秀成 |
[字型:大 中 小] |
1 引言
USB介面以其資料轉送快、串連簡單、易於擴充、支援熱插拔等特點已成為外設與PC通訊的主要方式之一。隨著嵌入式系統的發展,嵌入式微處理器需增加通用的USB介面,以便實現與PC等USB主機系統的通訊。針對這樣的需求,這裡採用PHILIPS公司的USB介面器件PDIUSBD12和Atmel公司的AVR系列單片機ATmega8設計一種通用的USB介面模組。該模組可方便為各種嵌入式微處理器增加USB介面,從而實現與USB主機系統的高速通訊。
2 系統硬體設計
該系統模組的控制核心是AVR高速單片機ATmega8。AVR單片機是新一代基於哈佛結構的高速RISC微控制器,具有速度快、價格低、可靠性高,I/O口線驅動能力強和片內整合外設資源豐富等特點,其內部整合有可進行ISP下載編程的Flash,EEPROM、熔絲位和鎖定位。AVR單片機的ISP下載電纜製作簡單、成本低廉,還有免費的下載軟體(例如PonyProg)支援。PDIUSBD12是一款高性價比USB介面器件,完全符合USB1.l規範,易於與各種微處理器介面。
系統模組AVR單片機與PDIUSBD12的電路串連1所示。
由圖1看出,由於AVR單片機具有高速性,可利用I/O連接埠線以軟體方式類比PDIUSBD12的時序,對其讀寫。這種方式可根據不同的微處理器速度靈活控制PDIUSBD12的時序和地址,無需解碼電路,從而簡化硬體設計,降低成本。
由於ATmega8片內整合了UART,SPI,I2C等介面,該介面模組可利用這些介面與其他系統通訊,使得該介面模組成為通用的介面轉換器。其系統硬體結構框圖2所示。
3 USB韌體程式設計
本系統模組的USB韌體程式採用符合ANSI C標準的GCC編譯器設計,結合分層次的模組化結構,可移植性強,只需稍微修改硬體介面層即可將其移植到別的硬體平台,可重複利用代碼。
USB韌體程式設計是基於狀態機器和標準的前後台式程式架構。整個同件程式的模組化階層3所示。首先編寫硬體介面層hal.c和PDIUSBD12器件的命令介面層,以供上層模組調用。硬體介面層含有對PDIUSBD12寫指令和讀寫資料的函數,以供上層模組調用。當CPU不同時,只需修改這些函數即可。由於CPU訪問PDIUS-BD12與普通儲存空間一樣,只需根據硬體串連關係,在硬體抽象層中編寫對PDIUSBD12寫指令、寫讀資料的函數,供上層調用即可。實現PDIUSBD12的命令介面層需調用硬體抽象層函數,供上層模組調用。再設計前背景程式及標準裝置請求程式模組。
先利用C語言的共用體與位域定義一個全域狀態變數如下所示:
使用者可根據需要增加相應的狀態標誌位,如UART,SPI,I2C等介面收發資料完成標誌來滿足各種情況下的需要,然後定義一個結構體變數用於存放USB的標準裝置請求。
在前台主程式中首先初始化全域變數和其他外圍裝置,然後在while(1)的死迴圈中檢測狀態變數值有無變化,根據不同的狀態變數值調用下層的相應函數完成相關操作。在背景中斷服務程式中,根據讀取的中斷寄存器值一方面將PDIUSBD12接收到的資料移入CPU記憶體或將記憶體中的資料寫入PDIUSBD12發送端點的緩衝區;另一方面根據具體情況改變狀態變數值。
以下給出了前台主程式的程式碼:以下為後台中斷服務程式:
當前台主程式檢測到狀態變數收到SETUP包事件bEvent_flags.bits.setup_packet為1時,該標誌位清零,再調用標準裝置請求模組stdreq.c的control_handler()函數完成對USB裝置的枚舉。
設計標準裝置請求模組,首先利用結構體定義USB枚舉所需的各種描述符,以供不同裝置請求使用,其次編寫11個標準的裝置請求處理函數。本層請求模組重要函數是協議控制子程式control han-dler(),它根據ControlData中標識的不同USB裝置請求類型調用11個函數中的任意一個。除此之外,本層請示求模組還實現中斷服務程式調用的控制端點接收與發送中斷處理函數。上述各函數及ControlData變數間關係4所示。
4 系統整合與應用
4.1 PC機驅動程式與應用程式的設計
利用該系統模組實現PC機通訊,需對PC機編寫相關驅動程式和應用程式,可利用DriverStudio軟體產生該系統模組在Windows環境下的驅動程式。應用程式的設計可使用諸如VB、VC、Delphi以及應用普遍的虛擬儀器軟體開發工具LabVIEW等軟體開發工具,直接調用驅動程式產生的動態連結程式庫中的API函數,可根據具體任務編寫相關應用程式。
4.2 應用於其他系統
利用AVR單片機的多種外設介面特點,例如UART、SPI、I2C介面等可以有效地實現與其他微處理器的通訊,將該模組嵌入各種系統,實現與其他器件的通訊。韌體程式中預留有UART、SPI、I2C等介面程式,只需通過簡單的跳線串連就可選擇相應的介面,從而實現應用系統增加USB介面。
4.3 韌體程式移植其他平台
由於韌體程式最大限度考慮到可移植性,所以將韌體程式稍加修改即可應用於各種已擁有C語言編譯器的微處理器,實現PDIUSBD12直接與微處理器的通訊。
移植韌體程式主要工作有:根據硬體串連關係,修改硬體抽象層中的3個讀寫函數,實現CPU與器件之間的通訊;通過調用PDIUSBD12命令介面層的讀取晶片ID函數傳回值是否為0x1012,測試CPU與器件之間的通訊是否正常。
5 在資料擷取器中的應用
由於ATmega8片內整合有逐次比較型ADC,具有6路的類比輸入通道,所以只需要針對採集的物理量選用相應感應器,並將輸出訊號調整至0~Vcc的範圍內就可利用該模組實現USB資料擷取器。AVR單片機整合有ADC內建採樣保持電路,具有內部參考電壓和基於睡眠模式的雜訊抑制器,從而大大提高ADC精度,實現高精度的資料擷取。而設計只需在相應的韌體程式巾增加擷取ADC結果的函數,並設定相應的狀態標誌位即可完成USB資料擷取器的設計。
6 結束語
以ATmega8和PDIUSBD12為核心,實現通用的USB介面模組設計,並應用於基於USB介面的資料擷取器中。實驗結果表明,該USB介面模組運行穩定可靠,通訊速度快,易於修改移植,滿足嵌人式系統對USB介面的需求,並能快速為各種微處理器增加USB介面,具有廣泛的應用前景。