摘 要: 針對一般USB裝置只能在PC機周圍進行數(shù)據(jù)通信的限制,,提出了基于USB OTG接口與STM32微控制器相結合的智能通信的設計方法。該方法是在基于Cortex內核的32 bit RAM芯片STM32F107上集成USB OTG接口上實現(xiàn),,它利用了STM32集成度高,、成本低、功耗低,、開發(fā)方便,、性能可靠和USB OTG雙角色特性等優(yōu)點,解決了無PC機時USB從設備之間數(shù)據(jù)傳送難的問題。并在金牛開發(fā)板上實現(xiàn)它與PC機以及U盤之間的通信,,完成了USB嵌入式設備之間數(shù)據(jù)的傳輸,。
關鍵詞: USB OTG; STM32F107,; U盤
移動數(shù)據(jù)的交換和存儲, 是近年來IT行業(yè)的熱點,。隨著USB技術的產(chǎn)生,USB技術已逐漸應用在移動數(shù)據(jù)領域中,。目前使用的USB移動設備都只能通過PC機進行相互的文件和數(shù)據(jù)交換,。隨著USB技術的逐漸成熟,人們希望通過移動設備直接與USB外設通信, 使得USB能應用在沒有PC的領域中,。
USB OTG(On The Go)[1]可滿足這些要求,,即一個擁有OTG 功能的設備既可以扮演主機的角色操縱其他USB從設備,同時又可以擔當從設備的角色接受主機的支配,。例如,照相機可以直接連到USB打印機上打印數(shù)據(jù),。當今USB主機的嵌入式應用就成了USB領域新的研究焦點。該技術對于便攜式設備,、野外作業(yè)設備間的數(shù)據(jù)傳輸將是一個重要突破,。基于Cortex-M3內核的STM32系列的ARM嵌入式處理器因其高的性價比而正被廣泛應用,。將USB與ARM相結合是進行數(shù)據(jù)采集,、處理與傳輸?shù)睦硐虢鉀Q方案,。本文重點討論基于STM32的USB OTG的數(shù)據(jù)通信,。
1 USB OTG規(guī)范
USB OTG規(guī)范是USB 2.0規(guī)范的補充,,它完全遵守USB 2.0規(guī)范的外圍設備。在USB OTG規(guī)范之下, 任意兩個符合規(guī)范的USB產(chǎn)品都可以互相連接進行通信, 而不是必須通過PC機才能通信, 從而實現(xiàn)了各類USB產(chǎn)品完全脫離電腦進行數(shù)據(jù)傳輸?shù)墓δ堋?br />
雙重角色設備必須具備有限的主機能力,,同時還需要一個OTG目標列表,,即包括與之通信的設備信息、設備類型,、制造商等,。它支持會話請求協(xié)議SRP和主機交換協(xié)議HNP。SRP協(xié)議用于B設備向A設備請求開始USB會話, HNP協(xié)議用于USB會話過程中在A設備和B設備之間傳遞主機地位[2],。
2 STM32的USB OTG全速控制器
ST公司在基于ARM公司的Cortex-M3架構上研發(fā)出32 bit STM32處理器后,,憑借其豐富的外圍模塊、高速指令執(zhí)行速度,、低功耗,、低價格而備受市場青睞。2009年又推出了STM32F107互聯(lián)型系列微控制器,,它集成了USB OTG接口,,配合了USB HOST和SPI功能,讓微控制器可以讀取USB大容量外存,、MP3播放器,、SD記憶卡等文件。STM32F107芯片內集成了USB OTG模塊功能圖如圖1所示,。
USB OTG全速控制器從復位和時鐘控制模塊(RCC)中獲得時鐘,,微控制器內核(CPU)通過AHB外設總線訪問OTG全速控制器的寄存器,USB事件由單獨的USB OTG中斷控制線通知微控制器內核[3],。
每個發(fā)送FIFO都配置了一個PUSH寄存器,,微控制器以向PUSH寄存器寫32 bit數(shù)據(jù)的方式向USB控制器傳輸數(shù)據(jù),每一個OUT端點或IN通道都有一個POP寄存器,,微控制器通過讀POP寄存器獲得來自USB總線的32 bit數(shù)據(jù),,這些數(shù)據(jù)自動從共享的接收FIFO中載入,接收FIFO位于總共1.25 KB的USB數(shù)據(jù)RAM區(qū),。
USB協(xié)議層由串行接口控制器(SIE)驅動,,并連接到由內置物理層(PHY)支持的USB全速/低速收發(fā)模塊。OTG PHY由OTG全速控制器控制,,并通過UTMI+總線(UTMIFS)的全速子集來收發(fā)控制和數(shù)據(jù)信號,。它包括了上拉/下拉電阻的ECN電路。內置了ID線的上拉電阻,,用于區(qū)分是主機狀態(tài)還是設備狀態(tài),,若ID線浮空,內置的上拉電阻將檢測到ID線的高電平,此時控制器處于默認的設備模式下,。若ID線接地,。自動切換到主機模式,并需要軟件初始化主機模式,。
DP/DM線內置了上拉和下拉電阻[4],,在設備模式下,當VBUS線上出現(xiàn)了有效的電平,,控制器使能DP線的上拉電阻,,向主機通告接入一個USB全速設備。在主機模式下,,控制器同時使能DP和DM線的下拉電阻,。上拉和下拉電阻可以在控制器通過主機協(xié)商協(xié)議(HNP)切換角色類型時動態(tài)地切換。
3 USB OTG軟件設計
STM32F107芯片集成了USB OTG功能,,USB OTG固件程序的設計可以完成數(shù)據(jù)傳輸?shù)乃胁僮骷肮δ?。其結構圖如圖2所示。其中驅動程序棧包括主機驅動程序棧,、從機驅動程序棧,、USB OTG驅動程序棧。當完成固定程序設計后,,系統(tǒng)軟件會根據(jù)硬件的連接檢查ID線的狀態(tài)來選擇工作模式是設備模式還是主機模式,。程序流程圖如圖3所示。
如果工作于主機模式下,,則進行相應初始化,、檢測端口,在檢測到有設備接入時復位總線,、枚舉并配置從機設備,,在完成對從機識別后,可通過查詢從機的OTG性能描述符判斷是否支持HNP協(xié)議(即是否為兩用OTG設備),。當工作在從機狀態(tài)時則等待主機對其完成枚舉,。本文是在STM32開發(fā)工具RealView MDK的基于STM32固件庫上進行開發(fā),實現(xiàn)與U盤,、PC機間的通信,。
3.1 U盤讀寫的實現(xiàn)
U盤屬于USB 大容量存儲設備,它具有容量大,、可移動,、數(shù)據(jù)交互方便等優(yōu)點,因而實現(xiàn)與U盤的讀寫具有很強的應用價值和市場前景,。要實現(xiàn)U盤讀寫,,USB 主機必須具有相應的驅動[5],對各種讀寫指令進行封裝、解釋和執(zhí)行。
在系統(tǒng)進入主機模式前應先給開發(fā)板提供5 V供電,開啟系統(tǒng)時鐘,、USB OTG時鐘,然后調用void HOST_Init (USB_OTG_CORE_DEVICE *pdev)函數(shù)將USB OTG初始化為主機模式,,接著調用HOST_ChannelInit(USB_OTG_CORE_DEVICE *pdev,USB_OTG_HC *pHost
Channel)初始化傳輸通道,其中包括總傳輸長度,、期望接收到的數(shù)據(jù)包數(shù),、設備端點傳輸類型,、速度,、方向的配置。最后根據(jù)主機傳輸協(xié)議在初始化通道內進行傳輸,可以調用下列函數(shù)uint32_t HOST_StartXfer (USB_OTG_CORE_DEVICE *pdev, USB_OTG_HC *pHostChannel)進行通信,。
U盤是大容量存儲設備,,支持Bulk-Only 傳輸協(xié)議,USB主機在能夠正確操縱U盤之前必須先完成USB總線的枚舉,,在控制傳輸階段先獲取從設備的信息,,然后根據(jù)這些信息對從設備進行重配置后, 才能建立主從通信。此外, 程序中還要實現(xiàn)標準Mass Storge 類協(xié)議中的磁盤操作命令UFI, 它能完成讀,、寫,、格式化磁盤等。最后建立了FATFS 文件系統(tǒng),它兼容了FAT16,、FAT32文件系統(tǒng),,它是UFI 與移動盤上文件數(shù)據(jù)連接的橋梁, UFI命令的所有數(shù)據(jù)流只有按照FATFS 標準協(xié)議傳輸, 才能順利實現(xiàn)文件讀、寫等功能,。
程序中實現(xiàn)U盤的BOT傳輸,,除了規(guī)定控制傳輸端點0之外,還定義了輸入,、輸出端點,,BOT狀態(tài)機的5個狀態(tài),兩個狀態(tài)寄存器CBW,、CSW,。端點輸出中斷程序完成寫U盤,端點輸入完成讀U盤操作,。其流程圖分別如圖4,、圖5所示。
3.2 與PC機之間通信
與PC機進行通信,,系統(tǒng)作為USB從設備時, 要應答PC主機的標準請求,、處理USB總線事務和用戶功能[6]。首先調用void USB_OTG_USBD_Init ()將USB OTG工作模式配置成從機模式,,接著調用底層驅動API函數(shù)USB_OTG_USBD_EP_Open ()來激活端點進行數(shù)據(jù)傳輸,,USB OTG定義了三個端點, 程序中定義端點0在控制傳輸中應答設備枚舉,端點1的功能為向PC機發(fā)送數(shù)據(jù), 端點2的功能為接受PC機發(fā)送的數(shù)據(jù)。PC主機枚舉系統(tǒng)設備時, 必須先獲得USB OTG端點的配置參數(shù),。最后通過調用如下的PCD層API函數(shù)完成SETUP包,、IN包、OUT包的傳輸,。
uint32_t USB_OTG_USBD_EP_Read();
uint32_t USB_OTG_USBD_EP_Write();
uint32_t USB_OTG_USBD_EP_Stall();
uint32_t USB_OTG_USBD_EP_ClrStall();
uint32_t USB_OTG_USBD_EP_Flush();
本文采用意法半導體公司互聯(lián)型控制芯片STMF107集成的USB OTG接口, 在基于金牛開發(fā)板上實現(xiàn)了從設備和主機的數(shù)據(jù)傳輸,,作為從設備, PC機端的應用程序可以通過USB OTG 開發(fā)板的SDRAM進行數(shù)據(jù)的讀寫,可穩(wěn)定在500 kb/s,;作為主機, 可以枚舉連接到USB OTG 接口上的U盤實現(xiàn)了對U盤的讀寫,最高讀寫速率可達800 kb/s,。
本文利用了STM32F107芯片高度集成的USB OTG接口,其開發(fā)系統(tǒng)性能好,、可靠性高,、開發(fā)方便,開發(fā)者只需在軟件上編程實現(xiàn)數(shù)據(jù)傳輸,。同時STM32芯片提供了相關固件庫,,在此基礎上進行開發(fā)提高了效率。本文的創(chuàng)新點就在于充分結合和利用了STM32處理器低成本,、低功耗,、高可靠性與USB OTG技術的優(yōu)點,對于已經(jīng)編程實現(xiàn)的主機,、從機棧程序有很好的移植性,, 對于以后數(shù)據(jù)傳輸?shù)拈_發(fā)具有很好的參考性。將USB與STM32相結合實現(xiàn)USB嵌入式設備之間的數(shù)據(jù)傳輸,,將會在移動數(shù)據(jù)傳輸領域具有很好的應用前景,。
參考文獻
[1] On The Go Supplement to the USB2.0 Specification,Rev1.0[S].www.usb.org,2001.
[2] 周立功.USB 2.0與OTG規(guī)范及開發(fā)指南[M].北京:北京航空航天大學出版社, 2004.
[3] 王永虹,徐煒,,郝立平.STM32 系列ARM Cortex-M3微控制器原理與實踐[M]. 北京:北京航空航天大學出版社,,2008.
[4] ST Microelectronics. STM32 Reference manual[Z].2009.
[5] 宋宇寧,周兆英,趙煥軍. USB OTG 擴展子板的實現(xiàn)[J].電子技術應用,2006,32(5):2-3.
[6] 張洪波,江海河,賈先德. USB OTG 技術在數(shù)據(jù)采集系統(tǒng)的應用[J]. 微計算機信息,,2006,(22):2-3.