,,,
(西安工程大學(xué) 電子信息學(xué)院,西安 710048)
USB設(shè)備因具備傳輸速率快,且通信較為穩(wěn)定、抗擾能力強(qiáng)以及便于插拔等特性,成為電子通信設(shè)計(jì)、有線數(shù)據(jù)傳輸中首選的通信接口[1]。其中USB1.0協(xié)議的全速USB設(shè)備理論速率可達(dá)12 Mbps,USB2.0協(xié)議的高速USB設(shè)備理論速率可達(dá)480 Mbps。
目前市場(chǎng)上大多數(shù)微處理器都具備USB功能但不同芯片的集成度不同,主要分為USB芯片集成于處理器內(nèi)部和需要外擴(kuò)USB芯片兩種模式[2]。當(dāng)芯片內(nèi)部集成時(shí),可以有效降低外部電路設(shè)計(jì)的復(fù)雜性[3]。故在數(shù)據(jù)傳輸速率要求不是很高的情況下,選用適當(dāng)?shù)脑O(shè)計(jì)方式可以有效提高設(shè)計(jì)效率[4]。但與此同時(shí)USB設(shè)備通信協(xié)議以及底層驅(qū)動(dòng)設(shè)計(jì)的復(fù)雜性仍然是制約USB應(yīng)用的主要原因[5],在傳統(tǒng)USB開(kāi)發(fā)中不僅要針對(duì)USB從機(jī)進(jìn)行相應(yīng)的定義,還要在主機(jī)設(shè)備上編寫(xiě)運(yùn)行相應(yīng)驅(qū)動(dòng)才能最終實(shí)現(xiàn)通信[6-7]。
本設(shè)計(jì)方案以USB數(shù)據(jù)采集[8]為設(shè)計(jì)背景,采用ST(意法半導(dǎo)體)開(kāi)發(fā)的基于HAL庫(kù)的STM32CubeMX快速完成USB從機(jī)端的通信協(xié)議配置[9-10],USB主機(jī)端使用LabVIEW編寫(xiě),并借助NI-VISA軟件生成USB驅(qū)動(dòng)[11-13],完成USB鏈接,實(shí)現(xiàn)主機(jī)、從機(jī)之間的全速USB設(shè)計(jì),從而極大節(jié)省開(kāi)發(fā)中底層驅(qū)動(dòng)及通信協(xié)議開(kāi)發(fā)的時(shí)間,降低了USB通信開(kāi)發(fā)的難度[14]。
本設(shè)計(jì)由作為數(shù)據(jù)采集核心的STM32F4x部分,以及在PC上由LabVIEW編寫(xiě)的包括采集數(shù)據(jù)展示以及速率測(cè)試等功能的數(shù)據(jù)處理部分構(gòu)成[15]。其中數(shù)據(jù)采集入口為STM32F4x本身所帶有的片上A/D轉(zhuǎn)換器來(lái)實(shí)現(xiàn),通信部分由片上全速USB實(shí)現(xiàn),無(wú)需進(jìn)行外擴(kuò)USB高速芯片電路設(shè)計(jì)[16],因而采集端主要由STM32F4x芯片以及相應(yīng)的外圍電路和STM32CubeMX生成再由MDK keil5進(jìn)行編譯的主程序構(gòu)成[17]。PC端主要由LabVIEW編寫(xiě)的可供鍵入采集指令以及進(jìn)行后期數(shù)據(jù)展示的上位機(jī)程序和利用NI-VISA生成的用于識(shí)別接口的驅(qū)動(dòng)構(gòu)成[18-20]。其程序流程為通過(guò)PC端LabVIEW程序發(fā)送數(shù)據(jù)采集持續(xù)時(shí)間等指令,啟動(dòng)采集端開(kāi)始采集數(shù)據(jù),經(jīng)過(guò)A/D轉(zhuǎn)換后由DMA傳輸至待發(fā)送緩存區(qū),通過(guò)全速USB反饋至PC端予以展示,同時(shí)對(duì)其傳輸速率等進(jìn)行實(shí)時(shí)測(cè)定。其總體框圖如圖1所示。
圖1 基于STM32的全速USB通信模塊設(shè)計(jì)方案
本文提出的全速USB通信模塊的設(shè)計(jì)方案以基于STM32的USB數(shù)據(jù)采集器為設(shè)計(jì)背景,主要構(gòu)成為STM32F4x的最小系統(tǒng),因USB1.0傳輸協(xié)議傳輸帶寬為12 Mbps,即理想環(huán)境下傳輸速率最大可達(dá)1.5 MB/s,可滿足設(shè)計(jì)需求,故設(shè)計(jì)中無(wú)需外擴(kuò)高速USB芯片,只需將全速USB引腳引出至USB接口即可,但實(shí)際電路設(shè)計(jì)中需注意USB中的D+、D-與STM32F4x的連接走線需遵循平行等長(zhǎng)的原則,否則可能出現(xiàn)USB無(wú)法識(shí)別或識(shí)別為未知設(shè)備而無(wú)法通信等問(wèn)題。實(shí)際電路原理如圖2所示。
圖2 USB通信模塊從機(jī)原理圖
本設(shè)計(jì)中軟件部分包括以LabVIEW編寫(xiě)的PC端程序,以及基于STM32CubeMX生成初始代碼再經(jīng)過(guò)MDK編譯的采集端程序。最后通過(guò)二者之間的通信來(lái)共同完成USB數(shù)據(jù)采集器的設(shè)計(jì)。
本部分程序主要包括作為STM32F4x的數(shù)據(jù)處理程序以及USB通信程序。首先利用STM32CubeMX進(jìn)行硬件初始化程序配置,從而完成原始代碼生成。其配置過(guò)程為:首先在STM32CubeMX中新建STM32F4x的工程,本設(shè)計(jì)選用的芯片型號(hào)為STM32F4IGT6,在新建工程時(shí)根據(jù)微處理器的型號(hào)進(jìn)行選擇,系列 Series 中選擇STM32F4,引腳Lines中STM32F407/417,封裝中Package選擇STM32F407IGTx,由此完成硬件的選擇;之后使能相關(guān)引腳并完成引腳定義,如使能全速USB功能引腳PA11、PA12,以及其它功能引腳。
根據(jù)設(shè)計(jì)需求在時(shí)鐘樹(shù)中通過(guò)分頻以及倍乘等工具完成時(shí)鐘的配置,之后對(duì)所用到的引腳進(jìn)行初始狀態(tài)的定義,例如對(duì)GPIO口的輸入/輸出設(shè)計(jì),以及ADC入口的狀態(tài)等進(jìn)行定義,隨后利用報(bào)告生成模塊生成整體配置的報(bào)告文件,進(jìn)行核對(duì)確認(rèn)無(wú)誤后即可生成基于HAL庫(kù)的初始代碼。
STM32CubeMX可生成支持EWARM、MDK等多個(gè)編譯器,此處選擇MDK編譯器生成工程。系統(tǒng)開(kāi)始運(yùn)行后首先進(jìn)行初始化操作,硬件中間層代碼在STM32CubeMX配置中已經(jīng)生成,在MDK中主要完成主程序的編寫(xiě)。主程序主要包含STM32F4x的硬件初始化、采集數(shù)據(jù)緩存處理、USB通信程序三個(gè)部分。
STM32F4x初始化主要包括:重置所有外設(shè),初始化Flash的HAL_Init()函數(shù),系統(tǒng)時(shí)鐘配置SystemClock_Config()函數(shù),以及初始化I/O的MX_GPIO_Init()函數(shù)等。同時(shí)需要進(jìn)行USB協(xié)議棧初始化,包括初始化設(shè)備庫(kù)、添加支持類和啟動(dòng)設(shè)備庫(kù)。完成初始化設(shè)置之后即可進(jìn)行USB發(fā)送程序編寫(xiě),首先設(shè)置1024字節(jié)的緩存區(qū)UserTxBuffer[1024],對(duì)緩存區(qū)進(jìn)行按位清零,判定USB接收標(biāo)志位(USB_FS_Receive_Flag)是否為0,若不為0,則進(jìn)行清零操作,當(dāng)標(biāo)志位清零后,開(kāi)始通過(guò)庫(kù)函數(shù)CDC_Transmit_FS進(jìn)行數(shù)據(jù)的發(fā)送,傳輸過(guò)程借鑒乒乓傳輸模式,將傳輸緩存區(qū)按順序分為前后兩段,每段設(shè)置為512,發(fā)送過(guò)程中每存滿512長(zhǎng)度即進(jìn)行一次傳輸,同時(shí)另半?yún)^(qū)繼續(xù)進(jìn)行緩存操作以提高程序運(yùn)行效率。最后進(jìn)行發(fā)送數(shù)據(jù)量的判斷,若發(fā)送數(shù)據(jù)幀數(shù)滿足預(yù)設(shè)值,則發(fā)送幀計(jì)數(shù)清零,程序跳回,判斷USB標(biāo)志位操作重新開(kāi)始下一循環(huán),若規(guī)定時(shí)間內(nèi)未發(fā)滿設(shè)定幀數(shù),則回到USB標(biāo)志清零處進(jìn)行單次發(fā)送以滿足條件。其程序流程如圖3所示。
圖3 采集端USB通信主程序流程圖
主機(jī)端程序由LabVIEW編寫(xiě),由前面板和后面板兩部分構(gòu)成,其中前面板主要用于用戶操作。具體包含數(shù)據(jù)幀計(jì)數(shù)模塊、數(shù)據(jù)計(jì)數(shù)模塊、采集器選擇模塊、各通道采集持續(xù)時(shí)間定義模塊以及波形顯示模塊。本設(shè)計(jì)PC端系統(tǒng)選用的是Windows10操作系統(tǒng),數(shù)據(jù)采集端所選用的通信方式為USB虛擬串口,故連接時(shí)需借助NI-VISA工具生成對(duì)應(yīng)驅(qū)動(dòng)以供PC端程序識(shí)別[16],此外后面板設(shè)計(jì)中需要用到的VISA函數(shù)如表1所列。
為了滿足數(shù)據(jù)通信的要求,首先應(yīng)保證LabVIEW程序能夠成功鏈接到USB設(shè)備中,這部分通過(guò)表1中的VISA打開(kāi)函數(shù)實(shí)現(xiàn),在選定USB設(shè)備后通過(guò)創(chuàng)建數(shù)組函數(shù)以及VISA函數(shù)寫(xiě)入采集持續(xù)時(shí)間等常量,隨后通過(guò)VISA讀取函數(shù)讀取數(shù)據(jù)采集器返回?cái)?shù)據(jù),并按照對(duì)應(yīng)幀格式進(jìn)行幀計(jì)數(shù)和數(shù)據(jù)計(jì)數(shù)。在讀取數(shù)據(jù)完成后,通過(guò)對(duì)數(shù)據(jù)進(jìn)行隊(duì)列操作和數(shù)據(jù)類型轉(zhuǎn)換,最后通過(guò)數(shù)組創(chuàng)建函數(shù)生成波形數(shù)據(jù),并通過(guò)波形顯示模塊予以展示。最后設(shè)置VISA關(guān)閉函數(shù),當(dāng)持續(xù)時(shí)間滿足鍵入值或通信出現(xiàn)錯(cuò)誤時(shí),關(guān)閉VISA函數(shù)停止數(shù)據(jù)采集。
表1 VISA函數(shù)
本設(shè)計(jì)中的USB通信測(cè)試是基于STM32CubeMX設(shè)計(jì)的數(shù)據(jù)采集下位機(jī)程序發(fā)送數(shù)據(jù)到基于LabVIEW編寫(xiě)的PC端程序的傳輸速率測(cè)試。方案設(shè)計(jì)速率要求為400 kbps。首先連接USB數(shù)據(jù)采集器至PC機(jī),在設(shè)備管理器中可見(jiàn)NI-VISA設(shè)備,若所選設(shè)備的識(shí)別碼與采集端程序預(yù)設(shè)相同,鏈接成功;接下來(lái)發(fā)送采集命令給采集端。
測(cè)試通過(guò)在順序結(jié)構(gòu)中設(shè)置兩個(gè)時(shí)間獲取控件來(lái)獲得傳輸開(kāi)始到結(jié)束所用的時(shí)間,通過(guò)數(shù)據(jù)讀取計(jì)數(shù)模塊來(lái)統(tǒng)計(jì)數(shù)據(jù)個(gè)數(shù),最后通過(guò)除法運(yùn)算計(jì)算傳輸速率。因硬件干擾等產(chǎn)生的傳輸誤差導(dǎo)致速率波動(dòng)過(guò)大,測(cè)速過(guò)程中為避免這種情況導(dǎo)致偶然性,故在LabVIEW上位機(jī)設(shè)計(jì)中采用了雙循環(huán)結(jié)構(gòu)進(jìn)行設(shè)計(jì),其中內(nèi)循環(huán)次數(shù)默認(rèn)設(shè)計(jì)為100,即每傳輸100幀數(shù)據(jù)利用除法運(yùn)算求出傳輸速率,并利用波形圖表予以顯示;最后利用LabVIEW中統(tǒng)計(jì)樣板中的Mean函數(shù)計(jì)算整體傳輸過(guò)程中的速率均值并通過(guò)顯示模塊展示,其中運(yùn)行150 000 ms的測(cè)試結(jié)果如圖4所示,經(jīng)過(guò)10次不同時(shí)長(zhǎng)測(cè)試得出的傳輸速率如表2所列,從而使得使用者能夠清晰直觀地觀測(cè)傳輸過(guò)程中的速率情況。此外,實(shí)時(shí)速率的圖表顯示也方便了使用者對(duì)干擾原因的定位以及修改驗(yàn)證。
圖4 速率測(cè)試結(jié)果
由于該方案是基于STM32的官方庫(kù)函數(shù)實(shí)現(xiàn)的,相比于直接針對(duì)寄存器的開(kāi)發(fā)來(lái)說(shuō),庫(kù)函數(shù)版本具有開(kāi)發(fā)便捷、操作難度小等特點(diǎn),同時(shí)也有代碼量較大、程序運(yùn)冗余較大而導(dǎo)致的程序運(yùn)行時(shí)間較長(zhǎng)等缺點(diǎn),因而本方案實(shí)驗(yàn)結(jié)果還存在優(yōu)化可能,使用寄存器直接開(kāi)發(fā)既可提升代碼效率也可獲取更高的效率。
表2 運(yùn)行時(shí)間及平均速率
本文給出的設(shè)計(jì)方案以STM32F4IGT6為例,以8位數(shù)據(jù)采集器位應(yīng)用背景,提出了一種基于STM32CubeMX的USB通信模塊設(shè)計(jì)方法,能夠高效、便捷地完成STM32微處理器與PC端 LabVIEW程序之間USB通信。
鄧鑫(研究生在讀),主要研究方向?yàn)樾盘?hào)與信息處理、嵌入式硬件設(shè)計(jì)。