黃國忠
(哈爾濱威克科技股份有限公司,黑龍江 哈爾濱 150000)
現在我們討論一種基于USB 協議的高速圖像數據傳輸方法。該方法以接口芯片CY7C68013A 為數據傳輸核心,解決了計算機和外設之間高速、大容量的圖像傳輸問題。
傳統的圖像傳輸普遍采用由PC 機主板所提供的各類接口來實現,如PCI 接口、EPP接口、IEEE 1394 接口等。以上三種接口分別存在無法作電磁屏蔽,傳輸慢,與外圍PC 無法兼容的等缺點。
該系統基于USB 總線技術,將CY7C68013A 芯片的Slave FIFO 塊傳輸接口模式和FPGA 技術相結合,實現了計算機與外設之間高速的圖像數據傳輸。
USB 接口單元的主要芯片是CY7C68013A,負責完成硬件系統與PC 之間的圖像傳輸。它與外設有三種接口方式:端口模式、可編程接口GPIF 和Slave FIFO。Slave FIFO 方式是從機工作方式,在具有外部數據處理邏輯的設備中,USB 數據在主機和外部邏輯設備中傳輸,通常不需要FX2LP的CPU參與,而是經過FX2LP 內部端點FIFO 來傳輸。外部控制器可對多個端點的FIFO 選擇讀寫。FX2LP的Slave FIFO 工作方式可設為同步或異步;工作時鐘均可由內部產生或外部輸入。基于該系統處理的是高速圖像的傳輸,需要外部控制器直接對FIFO 進行控制,故采用從機,即Slave FIFO 方式。
高速圖像傳輸的原理:首先圖像可由計算機上層應用軟件發送或者接收,再通過USB 接口芯片連接高速緩存。
USB 接口采用CY7C68013A 芯片的SlaveFIFO 接口模式,使得上層PC 與緩沖器之間能夠高速通信,并利用FPGA 控制USB的高速傳輸。CY7C68013A的主要功能信號及與FPGA 之間的握手信號。IFCLK 為時鐘信號,可以選擇由外部輸入或者內部輸出;FIFOADR[1:0]引腳選擇 4 個 FIFO(2,4,6 或 8)中的一個與USB 數據總線FD 連接。定義該系統中上行數據傳輸為FIFOADR[1:0]=10,即為EP6 端口;下行數據傳輸為FIFOADR[1:0]=01,即為EP2 端口。FLAGB,FLAGC 為所選擇FIFO的標志信號,FLAGB 代表FIFO 為滿;FLAGC 代表FIFO 為空;默認低電平有效。FPGA 可以通過不斷查詢這兩個標志信號決定是否進行讀或寫操作。SLOE 為讀/寫使能信號;SLWR,SLRD 分別為讀寫控制信號,在同步和異步模式下,控制信號不一;FD[15:0]為16位的雙向數據總線。PA0,PA1 為輸出信號,作為硬件系統工作狀態的控制信號。
圖像傳輸系統的軟件設計主要包括三個部分:固件程序設計、驅動程序設計和計算機上層應用軟件。固件程序是硬件中的軟件部分,主要包括初始化、處理標準的USB 設備請求以及USB 掛起時的電源管理等。固件首先初始化內部的狀態變量,然后調用用戶初始化函數TD_Init()從該函數返回后,固件初始化USB 接口到未配置狀態并使能中斷然后每間隔進行一次設備重枚舉直到端點0 接收到一個SETUP 包。一旦檢測到SETUP 包,固件函數將開始交互下述任務調度:調用用戶函數TD_Poll();判斷是否有標準設備請求等待處理。如果有,分析該請求并響應;判斷USB 內核是否收到USB 掛起信號。如果有,則調用用戶函TD_Suspend()。從該函數成功返回TRUE 值后,在檢測是否發生USB 喚醒事件。如果未檢測到,則處理器進入掛起方式;如果有,則調用用戶函數TD_Resume(),程序繼續運行。如果從TD_Suspend 函數返回FALSE,則程序繼續進行。TD_Init 函數負責CY7C68013A 進行初始化,首先設置時鐘為48 MHz,然后設置芯片工作于從屬FIFO 塊傳輸模式,并配置端點6 工作于自動塊傳輸IN,端點2 自動塊傳輸OUT 模式。其主要程序段如下:


圖1 接收機應用程序流程圖
DR_VendorCmnd 函數負責處理上位機發出的用戶自定義請求,通過控制PA0,PA1的高低電平,以控制整個硬件系統的運行。該系統中,使用0xB3 使PA0 置低進行圖像數據的上行操作,用0xB4 使PA0 置高進行圖像數據的下行操作,使用0xB5 使PA1 置低來通知硬件開始傳輸,使用0xB6 請求使PA1置高以通知硬件系統停止傳輸。USB 設備驅動程序負責建立起主機端和設備端的聯系。驅動程序主要有兩個:一是開機自動將固件程序下載至芯片RAM 中,以由增強性8051執行。結合CYPRESS 開發包EZ-Loader Drivers 以及HEX2C 和Windows DDK 即可生成所需要固件自動下載程序*.sys 文件。二是完成上位機應用程序和硬件設備之間的數據傳輸。其主要包括驅動程序入口例程、即插即用例程、分發例程、電源管理例程和卸載例程。本系統根據通用驅動結合自身需要,在DDK 環境下修改編譯,生成自己需要的驅動程序。USB 上層應用程序都通過I/O 控制來訪問設備驅動程序。上層應用程序首先通過調用Win32 函數CreaFile()來取得訪問設備驅動程序的句柄;然后應用程序使用Win32函數DeviceIo-Control()來提交I/O 控制碼,并且為CreaFile()函數返回的設備句柄設置I/O緩沖區。該系統中,設置USB 端口緩沖區FIFO 為1 024 B,端口非空即讀取,保持了傳輸的連續性,并且每次以幀結構包形式傳輸,每包的大小為512 B。以實驗中為例,每傳輸大小為245 KB的一幅圖像,需要490 個包進行傳輸。接收端應用程序流程圖如圖1 所示。發送端應用程序流程類似,少了判斷圖像是否完整一幅,而多了傳輸完畢之后的圖像數據校驗。
接收端應用程序流程圖如圖1 所示。發送端應用程序流程類似,少了判斷圖像是否完整一幅,而多了傳輸完畢之后的圖像數據校驗。
[1]趙鞭,唐俊,徐興.基于USB2.0的高速圖像傳輸系統設計[J].電子測試,2009-11-06.