代月松,董力科,孫正席,陳昌鑫
(中北大學 儀器科學與動態測試教育部重點實驗室,山西 太原 030051)
USB是英文Universal Serial Bus的縮寫,中文含義是“通用串行總線”。它是一種應用在PC領域的接口技術。USB以其可以熱插拔和即插即用的特性,獲得廣泛的市場認可。USB1.0標準于1996年1月提出,傳輸速度為1.5 Mb/s的低速模式;1998年9月提出的USB1.1標準則將速度提高到12 Mb/s的全速模式,并且增加了中斷傳輸的傳輸方式。USB2.0標準于2000年4月提出,將傳輸速度提高了40倍,達到了480 Mb/s的高速模式,足以滿足大多數外設的速率要求[1]。
系統的硬件設計原理框圖如圖1所示,硬件電路部分主要包含電源轉換、數據傳輸接口電路、并轉串電路、程序存儲部分等4個部分。
本系統采用具有微處理器的USB接口CY7C68013A,工作過程:系統接入計算機,系統上電,單片機從外接EEPROM中下載程序,初始化自身的寄存器,并且設置外圍電路狀態,計算機識別USB設備后,客戶軟件將要確認打開USB設備以及工作狀態,由計算機發出讀數請求和參數設置請求,二者是相互獨立進行的,就可以完成PC機和測試系統之間的數據交換工作,這些都需要單片機固件和硬件電路的配合。

圖1 系統總體設計圖Fig.1 Whole system design diagram
Cypress公司生產的EZ-USB FX2 CY7C68013A集成了USB2.0收發器、SIE(串行接口引擎)、增強的8051微控制器可編程的外圍接口。CY7C68013A可提供480 Mb/s的傳輸率。CY7C68013A的內部FIFO緩沖區中有4個端點,可以通過配置相應的EPxFIFOCFG寄存器配置為2倍、3倍、4倍緩沖區,這種設計可以把數據包可用的時間延時減至最小,從而增加帶寬的吞吐量。該芯片有3種工作模式,分別為普通端口模式、GPIF主控模式、和從屬FIFO模式[2]。
本設計采用GPIF主控模式,GPIF作為CY7C68013A端點FIFO的主控制器。在普通端口模式下,所有I/O引腳都可作為8051的通用I/O口。在“從FIFO”模式下,外部邏輯或外部處理器直接與FX2端點FIFO相連。在這種模式下,GPIF不被激活,外部主控端既可以是異步方式,也可以是同步方式,并可以為FX2接口提供自己的獨立時鐘。GPIF主控模式是在高速傳輸的過程中,8051內核不介入傳輸通道,并行數據的讀入和打包全部由硬件完成。在GPIF配置這些硬件時,Cypress公司有個獨特的設計構想,8051僅用來配置波形描述符,配置完成后,8051退出數據傳輸通路,GPIF通過讀入的波形描述符,在相應引腳上產生一系列信號,包括控制信號和讀寫數據總線的信號。為了提高數據傳輸速率,讀取數據時的傳輸類型使用批量傳輸方式。USB規范限定了批量傳輸的數據包長度:對于USB1.1規范,數據包長度為最大64字節,而USB2.0規范,數據包長度只能為512字節。就是說在USB1.1主機控制下,在讀取數據時一次最大能讀取64字節數據,在USB2.0主機控制下,在讀取數據時一次只能讀取512字節數據。具體讀取數據時GPIF方式的啟動次數將與數據讀寫量結合計算得到,并且由上位機程序和單片機固件配合使用[3]。
固件是指存儲在USB接口芯片或微控器中的代碼,于控制硬件系統運行,各種USB標準請求的處理,以及USB閑置模式的電源管理服務,實現主機與外設之間的通信和數據傳輸。固件程序采用C51語言來編程,使用Keil軟件作為編程工具[4]。Cypress公司為FX2固件開發提供了一個固件庫和固件框架,固件庫提供了一些常量、數據結構、函數來方便用戶對芯片的使用。C語言環境,同時保留了匯編代碼高效、快速的特點,代碼在Keil軟件中編譯通過后,將固件代碼下載到FX2中,就可以實現GPIF多字節讀等操作。
固件程序框架流程圖如圖2所示。
復位上電時,固件先初始化一些全局變量,接著調用初始化任務調度函數TD_INIT(),開中斷,等待設備重枚舉完成(端點0接收到SETUP包),最后進入循環語句,執行任務調度,函數包括:
1)TD_Poll( )任務調度函數。
2)如果發現USB控制請求則執行。
3)如果發現USB空閑置位,則調用TD_Suspend(),函數執行成功則將內核掛起,直到出現USB遠程喚醒信號,調用TD_Resume( ),喚醒內核。
GPIF波形設計是CY7C68013A的最核心特點之一。根據測試系統的讀數時序要求,采用GPIF Designer工具設計時序波形,其時序信號具有很好的編程分辨率,并且導出生成 .c文件加載到單片機固件中。

圖2 固件程序框架流程圖Fig.2 Flow chart of firmware framework
下面根據并口擦除時序為例,利用GPIF Designer畫出相應的波形圖。如圖3所示。

圖3 并口擦除過程時序波形設計圖Fig.3 Waveform design of parallel erase process timing
S0~S3狀態ERE始終為高,ERET始終為低,外圍測試系統單片機接收到這兩個信號同時滿足的話則擦除開始,擦除過程中READY信號一直為低,擦除完畢后變高。這里S4也設置了判斷點檢測READY信號,如果為高就到IDLE狀態結束擦除,否則回到S3繼續執行前面的工作。
USB系統驅動程序由3部分組成:USB設備驅動程序、USB總線驅動程序和USB主控制器驅動程序。其中,Windows操作系統已經提供了處于驅動程序棧底的USB總線驅動程序和USB主控制器驅動程序;而USB設備驅動程序由設備開發者編寫,通過向USB總線驅動程序發送包含URB(USB Request Block)的 IRP(I/O RequestPacket),以實現 USB 外設之間的信息交換。本系統的USB通用驅動程序采用Cypress公司提供的通用驅動ezusb.sys,固件下載驅動程序可以根據編譯好的固件在DDK的環境下編譯生成[5]。
主機加載USB驅動程序是要先通過讀取USB設備的VID和PID,然后才能正確識別并加載的。為了使設備驅動程序能夠正確加載運行,還必須為它配備一個安裝信息文件即.inf文件。Windows系統使用該.inf文件將USB外設的VID&PID(固件下載時由EEPROM或EZ-USB內核提供,重枚舉后由固件程序描述符表提供)與相應的驅動程序綁定到一起。這樣,系統在知道了USB外設的VID&PID后就可以通過存儲在.inf文件中的信息查找到正確的驅動程序并加載。
用戶應用程序通過I/O控制調用訪問USB設備驅動程序達到控制USB設備的目的,應用程序首先通過調用Win32函數CreateFile()來取得訪問設備驅動程序的句柄,再利用Win32函數DeviceIoControl()對設備進行I/O控制[6]。
系統的應用程序界面如圖4所示。

圖4 系統應用程序界面Fig.4 Interface of system application programming
客戶應用程是測試系統軟件的核心,由Visual Basic來編寫完成,其對USB設備的操作功能為:開啟或關閉USB設備、檢測USB設備、設置USB數據傳輸管道、設置數據端口的初始狀態、通過USB接口回傳數據、存儲、顯示并分析數據。因此,應用程序要調用動態鏈接庫DLL68013.d11中封裝的 API函數。首先要將 DLL68013.dll拷貝到系統盤的“C:Windows\System”下面,然后在 Visual Basic的集成編程環境下的模塊Module1中聲明引用動態連接庫 DLL68013.dll中的API函數。
動態鏈接庫文件的使用,需要在應用程序的全局變量定義模塊中顯式調用.dll文件應用程序會在其所在目錄和系統目錄下查找.dll文件。在聲明過程中需要注意數據類型的匹配問題。
系統連接外設進行測試記錄各階段波形,采用Bus Hound實時記錄總線狀態變化,查看VB讀數軟件中的數據文件,得到的數據正確。并用原并口進行相應測試記錄各階段波形,對比兩次波形發現基本吻合,從而驗證了數據傳輸的正確性。
利用CY7C68013A完成了采用GPIF模式的并口轉USB的數據傳輸模塊的硬件和軟件設計。多次實驗證明,此系統運行穩定,能夠滿足目前舊測試系統并口轉USB口的需求。另外,試驗中實際的傳輸速率120 Mb/s,大大提高了原測試系統的傳輸速率。
[1]周立功.USB2.0與OTG規范及開發指南[M].北京:北京航空航天大學出版社,2004.
[2]錢峰.EZ-USB FX2單片機原理、編程及應用[M].北京:北京航空航天大學出版社,2005.
[3]張念淮,江浩.USB總線接口開發指南[z].北京:國防工業出版社,2001.
[4]李英偉,王成儒,練秋生,等.USB2.0原理與工程開發[M].第2版.北京:國防工業出版社,2007.
[5]EZ-USB Fx2 technical reference manual version2.0[S].Cypress Semionductor Corp data book,2001.
[6]張弘.USB接口設計[M].西安:西安電子科技大學出版社,2002.