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