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