鄒連英,高 寧
(武漢工程大學(xué) 電氣信息學(xué)院,武漢430205)
在現(xiàn)代科學(xué)研究、工業(yè)生產(chǎn)和工作環(huán)境下,對各種電子設(shè)備產(chǎn)生的數(shù)據(jù)進行采集、處理和傳輸?shù)倪^程是必不可少的。USB 接口作為外設(shè)和主機間的一種高速、穩(wěn)定、靈活的雙向數(shù)據(jù)通道,在數(shù)據(jù)采集、工業(yè)控制和日常生活中具有廣泛的應(yīng)用[1]。由于其支持熱插拔且價格低廉的特性,如今已成為各種計算機和電子設(shè)備外設(shè)接口的首選解決方案[2]。
USB2.0 支持低速1.5 Mb/s、全速12 Mb/s、高速480 Mb/s 三種速率,本文結(jié)合USB2.0 的Slave FIFO工作方式和高速的傳輸速率,以Cypress 公司的CY7C68013 芯片為核心,設(shè)計和開發(fā)了滿足一般微處理器實現(xiàn)數(shù)據(jù)傳輸和控制的固件程序和上位機人機界面程序。
USB 芯片將USB 總線的底層協(xié)議封裝起來提供指令給用戶使用,使用戶脫離復(fù)雜的底層邏輯,直接通過發(fā)送指令控制數(shù)據(jù)傳輸實現(xiàn)主機和設(shè)備間的通訊和控制。為了實現(xiàn)復(fù)雜的數(shù)據(jù)傳輸和指令控制功能,一般USB 芯片需要通過多個I/O 接口驅(qū)動外圍邏輯電路[3-4]。
USB 接口芯片根據(jù)內(nèi)部是否嵌入微控制器分為2 種類型。內(nèi)部沒有嵌入微控制器的USB 接口芯片只能處理與USB 相關(guān)的通信工作,但價格比較低廉。這種類型的芯片有National Semiconductor 公司的USBN9602/9603,Philips 公 司 的PDIUSB11/11A/12 系列等。對于內(nèi)部已經(jīng)嵌入微控制器的USB 接口芯片類型,它們能夠完成擴展的USB 基礎(chǔ)功能,這類芯片資料豐富,一般具有官方例程提供API 函數(shù)實現(xiàn)USB 功能,易于芯片的開發(fā)。如Cypress 公司的基于增強型8051 內(nèi)核的EZ-USB FX2 系列,Atmel公司的基于AVR 的AT76C711 等。
在本設(shè)計中選擇Cypress 公司生產(chǎn)的CY7C68013A芯片。該芯片提供的資料豐富,功能完整,應(yīng)用比較廣泛,能夠滿足數(shù)據(jù)傳輸速度的要求,價格比較合理。此外,擁有內(nèi)嵌微處理器的CY7C68013A 可以將USB 固件程序通過USB 下載到片上RAM 存儲器,且不需要額外設(shè)備,開發(fā)比較方便。
EZ-USB 系列的芯片在進行數(shù)據(jù)的批量傳輸時,主要有Slave FIFO 和GPIF 兩種模式。Slave FIFO模式相對來說更加常用,這種工作模式將數(shù)據(jù)的傳輸都看作為對普通FIFO 的讀和寫,外部邏輯電路作為USB 的主控制器,上位機作為從控制器,USB芯片作為傳輸?shù)耐ǖ烂撾x出來。外部邏輯電路產(chǎn)生Slave FIFO 需要的傳輸時序,即可與上位機進行通訊。圖1為Slave FIFO 工作模式的連接示意圖。其中FD 數(shù)據(jù)總線作為外部邏輯和USB 芯片的傳輸通道,F(xiàn)IFOADR[1:0]用于選擇緩沖區(qū)端點,F(xiàn)LAGA、FLAGB、FLAGC 用于給出緩沖區(qū)空滿標志,SLRD和SLWR 分別是FIFO 讀/寫選通信號,SLOE 控制輸出。
由于Slave FIFO 的讀寫是由外部邏輯控制的,則需要在外部邏輯芯片上設(shè)計讀寫狀態(tài)機以控制讀寫引腳邏輯。為了便于對整個系統(tǒng)的控制,本設(shè)計對端點間FIFO 數(shù)據(jù)采用異步方式進行讀、寫。讀寫邏輯可以根據(jù)FIFO 的空滿標志,在外部邏輯上通過狀態(tài)機編程實現(xiàn)。
圖1 Slave FIFO 工作模式連接圖Fig.1 Slave FIFO connection diagram
設(shè)計固件程序的目的就是為了控制硬件設(shè)備完成預(yù)定的目標,基于微控制器及其外圍電路的硬件設(shè)備的正常工作都需要固件的參與和控制[5]。本設(shè)計采用了基于Slave FIFO 的自動數(shù)據(jù)傳輸模式,這種模式能將配置好后的端點FIFO 內(nèi)的數(shù)據(jù)自動發(fā)送或接收到USB 主機,只需要配置相應(yīng)寄存器即可。USB 芯片的固件程序主要負責處理上位機發(fā)來的USB 設(shè)備請求,同時也控制芯片的外圍電路進行數(shù)據(jù)傳輸。包括5 個方面:
(1)給特殊功能寄存器賦值,初始化設(shè)備;
(2)對主機的設(shè)備請求進行響應(yīng),完成主機對設(shè)備的控制;
(3)設(shè)備枚舉、數(shù)據(jù)傳輸、標準主機請求等動作過程中會向微控制器申請中斷,響應(yīng)這些中斷以保證USB 芯片的正常工作;
(4)對發(fā)送和接收數(shù)據(jù)的端點進行配置和控制,實現(xiàn)數(shù)據(jù)的正確發(fā)送和接收;
(5)對外圍電路進行控制,保證設(shè)備正常工作。
Cypress 公司的官方網(wǎng)站為設(shè)計者提供了開發(fā)固件的程序框架和豐富資料。設(shè)計者可以在這些框架的基礎(chǔ)上在相應(yīng)的地方添加合適的代碼以完成特定用戶需求,即可讓USB 固件完成和實現(xiàn)相關(guān)設(shè)計。
固件框架通過一個任務(wù)循環(huán)來控制和使用USB 傳輸,首先會初始化所有設(shè)備內(nèi)部狀態(tài)變量,然后調(diào)用用戶初始化函數(shù)TD_Init(),接著進行重枚舉,重枚舉完成后固件程序開始進行任務(wù)調(diào)度。主要任務(wù)有用戶任務(wù)函數(shù)TD_Poll(),標準設(shè)備請求和掛起事件。其中TD_Init()函數(shù)需要定義全局變量和參數(shù)的初始化,設(shè)置Slave FIFO 的時鐘頻率、傳輸方向、端點選擇、端點深度等。TD_Poll()函數(shù)實現(xiàn)任務(wù)的調(diào)度和實施,包含了用戶預(yù)期工作任務(wù)的主要部分,通過主循環(huán)不斷被調(diào)用,本設(shè)計端點工作方式為自動讀寫,所以這個函數(shù)沒有相應(yīng)設(shè)置。
USB 數(shù)據(jù)采集系統(tǒng)應(yīng)用場合多、領(lǐng)域廣,界面程序的開發(fā)不同于其他部分開發(fā)的特殊要求,用戶一般希望界面可以實現(xiàn)設(shè)備管理和數(shù)據(jù)處理的功能并且盡可能的直觀、簡潔。從用戶的需求出發(fā)在上位機界面上有如下構(gòu)想:
(1)上位機的角色一般由PC 機來承擔,工作在Windows 操作系統(tǒng)下,所以上位機界面的設(shè)計需要Windows 平臺下的開發(fā)工具,如VB、VS、LabVIEW、DELPHI 等,本設(shè)計采用Visual Studio 2010(簡稱VS2010)。
(2)應(yīng)用軟件采用在MFC 框架基礎(chǔ)上開發(fā)的對話框程序界面。MFC(Microsoft Foundation Classes)是微軟基礎(chǔ)類庫的簡稱,主要封裝了大部分Windows API 函數(shù)。本質(zhì)上MFC 類庫是C++語言和Windows 操作系統(tǒng)間的接口,使用MFC 編程是選擇類庫中合適的類,通過調(diào)用類中的成員函數(shù)實現(xiàn)相應(yīng)功能[6]。使用MFC 框架的程序界面可以使用戶更容易學(xué)習和熟悉程序的使用方法。
(3)使用Cypress 公司提供的開發(fā)包中的CyAPI控制函數(shù)類庫,在使用Cypress 公司的通用USB 驅(qū)動程序的基礎(chǔ)上,在VS2010 的界面工程中加入CyAPI.h 和CyAPI.lib 即可調(diào)用USB 設(shè)備控制函數(shù),完成USB 傳輸任務(wù)。
Windows 應(yīng)用程序工作的基本流程是與用戶發(fā)出的命令進行交互,然后把交互處理結(jié)果輸出到屏幕,這樣的過程就需要用戶接口,即對話框,也即一個可以接收消息、反饋消息、被移動、被關(guān)閉的窗口。綜合用戶的功能要求對界面的模塊進行了劃分,整個界面分為了設(shè)置區(qū)、設(shè)備區(qū)、路徑保存區(qū)和執(zhí)行區(qū)4 個部分,如圖2所示。
其中設(shè)置區(qū)對USB 設(shè)備的端點進行選擇,設(shè)置每個包傳輸?shù)淖畲蟠笮?、傳輸初值和遇錯停止等。設(shè)備區(qū)的下拉菜單選擇連接到上位機的USB 設(shè)備,刷新程序。路徑選擇區(qū)點擊按鈕選擇文件存儲路徑。執(zhí)行區(qū)能夠開始和停止USB 傳輸任務(wù),復(fù)位USB 設(shè)備和查看USB 任務(wù)執(zhí)行過程中的信息。
圖2 上位機界面圖Fig.2 Interface diagram of upper computer
應(yīng)用程序在訪問硬件設(shè)備時需要通過驅(qū)動程序作為軟件接口,驅(qū)動程序讓應(yīng)用程序在訪問硬件時,屏蔽具體設(shè)備的物理連接和底層協(xié)議。USB 總線設(shè)備驅(qū)動程序遵循由微軟定義的Win32 驅(qū)動程序模型WDM(Windows Drivers Model),擴展名一般為.sys。WDM 驅(qū)動程序負責在一個特權(quán)層實現(xiàn)應(yīng)用程序和操作系統(tǒng)的通信,例如一個驅(qū)動程序通過允許或保留某個應(yīng)用程序?qū)τ布氖褂脵?quán)限實現(xiàn)對硬件中斷的響應(yīng)和DMA 傳輸[7]。開發(fā)驅(qū)動程序是整個USB 開發(fā)中最難、涉及知識最多、實現(xiàn)方式較底層的部分,但Cypress 公司針對EZ-USB 系列芯片提供了一套通用的驅(qū)動程序(ezusb.sys),能夠完成一般的USB 任務(wù)。除非項目中需要特殊USB 功能,通常使用通用驅(qū)動程序即可。
Windows 使用USB 設(shè)備描述符中的產(chǎn)商ID(VID)和產(chǎn)品ID(PID)來尋找匹配設(shè)備的驅(qū)動程序。INF 文件描述了驅(qū)動程序和VID、PID 的連接關(guān)系。當Windows 發(fā)現(xiàn)新的設(shè)備連入時,會掃描所有可以選擇的INF 文件,選擇與ID 最匹配的INF 文件,若找不到則需用戶指定地址。找到INF 文件后,系統(tǒng)將驅(qū)動程序可執(zhí)行文件復(fù)制到正確地址,驅(qū)動程序被裝入內(nèi)存,然后就可以進行正常的I/O 操作了。
對數(shù)據(jù)采集的結(jié)果進行驗證,在上位機程序中選定USB 設(shè)備并輸入開始按鈕特征值,點擊開始按鈕,外部電路或模擬信號收到開始特征值數(shù)據(jù)包并解析其中參數(shù),根據(jù)開始包中的參數(shù)確定實驗時間和實驗次數(shù)。系統(tǒng)開始工作后上位機接收到的數(shù)據(jù)會直接存入txt 文件中,測試結(jié)果如圖3所示,可以看出,經(jīng)實際測試,數(shù)據(jù)傳輸準確無誤,沒有出現(xiàn)數(shù)據(jù)的丟包、混亂等錯誤,傳輸速率可達30 MHz/s 以上,滿足設(shè)計要求。
圖3 數(shù)據(jù)傳輸結(jié)果圖Fig.3 Result diagram of data transmission
本文以外部電路的數(shù)字信號采集平臺和PC 機之間的數(shù)據(jù)傳輸及指令控制的工程研究為背景,進行了基于USB 總線技術(shù)的Slave FIFO 工作模式的數(shù)據(jù)傳輸系統(tǒng)的設(shè)計與實現(xiàn),并對這個系統(tǒng)的功能和模塊進行了詳細的研究和分析。USB 控制器CY7C68013 已經(jīng)被廣泛應(yīng)用到許多數(shù)據(jù)傳輸領(lǐng)域,由于USB 具有靈活的接口和可編程特性,提高了系統(tǒng)可靠性和可擴展性。希望本文能夠為數(shù)據(jù)采集和傳輸?shù)难芯繉W(xué)者提供一些參考和啟發(fā)。