趙曉娜
(山西大眾電子信息產(chǎn)業(yè)集團(tuán)有限公司,山西 太原 030024)
隨著嵌入式系統(tǒng)的不斷發(fā)展,通過單片機(jī)采集并發(fā)送數(shù)據(jù)到PC端供人們研究,已經(jīng)成為目前熱門的研究領(lǐng)域。單片機(jī)到PC之間數(shù)據(jù)的傳輸方式主要有并口傳輸、串口傳輸、I2C傳輸和USB傳輸?shù)取4蠖鄶?shù)的數(shù)據(jù)傳輸方式具有連接復(fù)雜,速度慢等缺點(diǎn),而USB傳輸有速度快,連接簡(jiǎn)單、擴(kuò)展性相對(duì)強(qiáng)、支持熱插拔等優(yōu)勢(shì),也是目前使用最廣泛且最方便的傳輸方式[1]。
本文主要是通過USB接口將上位機(jī)軟件的數(shù)據(jù)指令發(fā)送給STM32,對(duì)其指示燈進(jìn)行點(diǎn)亮。通過上位機(jī)軟件發(fā)送數(shù)據(jù)到單片機(jī),也是新的研究課題之一,具有很好的研究?jī)r(jià)值。
USB一般有主設(shè)備和從設(shè)備之分,并且當(dāng)主設(shè)備發(fā)起數(shù)據(jù)傳輸時(shí),作為從設(shè)備只能被動(dòng)地接收數(shù)據(jù)。本系統(tǒng)設(shè)計(jì)主要包含兩部分,下位機(jī)STM32端USB數(shù)據(jù)接收和上位機(jī)端USB數(shù)據(jù)發(fā)送。上位機(jī)通過自定義協(xié)議發(fā)送兩位字節(jié)數(shù)據(jù)給下位機(jī),下位機(jī)對(duì)數(shù)據(jù)進(jìn)行解析后將其指示燈進(jìn)行點(diǎn)亮控制,兩者相互配合實(shí)現(xiàn)了可靠、高速的數(shù)據(jù)傳輸。
該系統(tǒng)上位機(jī)軟件開發(fā)是在Windows操作系統(tǒng)下,通過VC6.0開發(fā)工具,采用MFC框架進(jìn)行界面設(shè)計(jì)的。該設(shè)計(jì)中USB驅(qū)動(dòng)程序的開發(fā)使用了LibUSB-Win32庫(kù)函數(shù)。主要的USB驅(qū)動(dòng)庫(kù)函數(shù)如圖1所示。
圖1 USB驅(qū)動(dòng)庫(kù)函數(shù)
上位機(jī)軟件的實(shí)質(zhì)就是Windows應(yīng)用程序,即通過界面的形式把與用戶的交互式命令形象地展示出來(lái)。它是通過消息對(duì)話框窗口實(shí)現(xiàn)命令交互,該窗口可以接收和反饋用戶的輸入數(shù)據(jù)、進(jìn)行多方位窗口拖動(dòng)和窗口關(guān)閉操作,具體設(shè)計(jì)流程如圖2所示[2]。
圖2 流程圖
界面的設(shè)計(jì)采用了模塊化的設(shè)計(jì)理念,主要分為HID設(shè)備模塊、報(bào)告模塊、發(fā)送模塊、狀態(tài)顯示模塊、發(fā)送數(shù)據(jù)輸入模塊(見圖3)。
圖3 界面圖
HID模塊的功能主要是通過查找輸入U(xiǎn)SB設(shè)備的VID和PID,點(diǎn)擊連接設(shè)備程序?qū)⑼ㄟ^不斷的掃描查找到與之匹配的設(shè)備,找到設(shè)備后就可以對(duì)設(shè)備進(jìn)行正常的輸入輸出操作。 當(dāng)輸入HID設(shè)備信息時(shí),其廠商ID(VID)和產(chǎn)品ID(PID)在電腦端設(shè)備管理器中可找到(見圖4)。
圖4 HID設(shè)備信息
在發(fā)送數(shù)據(jù)輸入模塊輸入ab或AB字符,點(diǎn)擊發(fā)送模塊的發(fā)送數(shù)據(jù),即可將數(shù)據(jù)發(fā)送出去,指示燈點(diǎn)亮,輸入其他的任意兩個(gè)字符數(shù)據(jù)都將熄滅指示燈。在發(fā)送模塊中對(duì)數(shù)據(jù)發(fā)送的端點(diǎn)進(jìn)行了默認(rèn)設(shè)置為端點(diǎn)2,同時(shí)對(duì)單片機(jī)的USB接收端也選擇了端點(diǎn)2接收。
狀態(tài)顯示模塊主要是提示設(shè)備有沒有連接成功,數(shù)據(jù)有沒有發(fā)送成功。報(bào)告模塊對(duì)報(bào)告描述符的ID設(shè)置為0,報(bào)告描述符大小設(shè)為32字節(jié)。點(diǎn)擊“退出”就關(guān)閉整個(gè)窗口。
該系統(tǒng)中上位機(jī)的界面設(shè)置實(shí)現(xiàn)了基本的USB設(shè)備的管理和數(shù)據(jù)傳輸功能,做到了簡(jiǎn)潔,直觀。
下位機(jī)軟件設(shè)計(jì)核心是對(duì)STM32芯片進(jìn)行USB固件庫(kù)的設(shè)計(jì)和使用。單片機(jī)中USB協(xié)議本身就很復(fù)雜,對(duì)于USB接口的程序設(shè)計(jì)相對(duì)難度也很大。ST公司專門提供了關(guān)于STM32系列芯片的USB固件庫(kù)驅(qū)動(dòng)程序,這樣就簡(jiǎn)化了USB接口的程序設(shè)計(jì),大大地縮短了軟件的開發(fā)周期。本系統(tǒng)也使用了STM32標(biāo)準(zhǔn)的固件庫(kù)程序,相關(guān)的程序文件如圖5所示[3]。
圖5 程序文件包
USB固件庫(kù)主要由內(nèi)核層(STM32_USB-FS-LIB)和應(yīng)用接口層(USB_OEM)組成,內(nèi)核層主要功能是對(duì)USB底層的控制傳輸處理、設(shè)備信息的注冊(cè)、協(xié)議的解析和硬件模塊的配置與實(shí)現(xiàn),所以內(nèi)核層在程序開發(fā)時(shí)一般不需要做大的改動(dòng);應(yīng)用接口層的函數(shù)是與上位機(jī)進(jìn)行通信的直接接口函數(shù),在實(shí)際的固件庫(kù)開發(fā)過程中,一般只需要對(duì)應(yīng)用接口層的函數(shù)進(jìn)行相應(yīng)的修改即可。
1) 配置描述符(Configuration Descriptor)用于定義設(shè)備的配置信息,一個(gè)設(shè)備同時(shí)可以有多個(gè)配置描述符。配置描述符中包含了描述符大小(0x09)、類型(USB_CONFIGURATION_DESCRIPTOR_TYPE)、數(shù)據(jù)長(zhǎng)度(KVMCLIENT_SIZE_CONFIG_DESC)、配置支持的接口數(shù)量(0x01)、配置參數(shù)選擇(0x01)、字符串索引(0x04)、供電模式選擇(0xa0)和最大電流消耗值(0x32)。
2) 接口描述符(InterfaceDescriptor)說(shuō)明了接口的配置。接口描述符中包含了描述符大小(0x09)、類型( USB_INTERFACE_DESCRIPTOR_TYPE)、接口編號(hào)(0x00)、備用接口標(biāo)號(hào)(0x00)、端點(diǎn)使用數(shù)目(0x02)、類型代碼(0x03)、子類型代碼(0x01)、協(xié)議代碼(0x01)、字符串索引(05)。
3) 端點(diǎn)描述符(Endpoint Descriptor)描述了接口使用的端點(diǎn)屬性(端點(diǎn)0除外)。端點(diǎn)描述符中設(shè)置了描述符大小(0x07)、類型(USB_ENDPOINT_DESCRIPTOR_TYPE)、端點(diǎn)地址(0x81)、端點(diǎn)屬性(0x03)、信息包大小(0x40)、數(shù)據(jù)傳輸時(shí)間間隔(0x0A)。本文將設(shè)置端點(diǎn)2 為輸入端。
使用USB數(shù)據(jù)線連接PC端的上位機(jī)與STM32單片機(jī),通過上位機(jī)發(fā)送數(shù)據(jù)指令ab(AB),點(diǎn)亮STM32端的指示燈;發(fā)送其他任意兩位字符指示燈熄滅,效果圖如圖6所示。
圖6 實(shí)驗(yàn)結(jié)果
本系統(tǒng)提出了一種PC機(jī)作為發(fā)送端,STM32單片機(jī)作為接收端,基于USB接口進(jìn)行數(shù)據(jù)傳輸?shù)姆椒?,兩者連接之后發(fā)送端首先進(jìn)行USB設(shè)備的識(shí)別,識(shí)別之后開始連接通信。發(fā)送端發(fā)送十六進(jìn)制形式的兩位數(shù)據(jù)字符給STM32單片機(jī),單片機(jī)端進(jìn)行數(shù)據(jù)的解析,最終實(shí)現(xiàn)了對(duì)其指示燈進(jìn)行開關(guān)控制,傳輸穩(wěn)定,速度快,具有很好的應(yīng)用價(jià)值。