基于ISP1581的USB數據采集系統的實(shí)現
本設計中選用了Philips公司的USB2.0接口芯片ISP1581,該芯片屬于純粹的USB接口芯片。這類(lèi)USB接口芯片價(jià)格較低,接口方便,靈活性高,針對不同的硬件環(huán)境可以配合多種MCU使用,如單片機、DSP、FPGA。ISP1581支持2種工作模式:通用處理器模式和斷開(kāi)總線(xiàn)模式。本設計中采用DSP來(lái)控制ISP1581,連接方式選用通用處理器模式,原理圖如圖3所示。
2 USB接口軟件開(kāi)發(fā)
軟件分為USB固件程序開(kāi)發(fā)和USB設備驅動(dòng)程序開(kāi)發(fā)兩大部分。
2.1 USB固件程序開(kāi)發(fā)
所有基于微處理器及其外圍電路的功能設備的正常工作都離不開(kāi)固件的參與,固件的作用就是輔助硬件,即控制硬件來(lái)完成預期的功能,如沒(méi)有固件的參與和控制,硬件設備只是芯片簡(jiǎn)單的堆砌,無(wú)法實(shí)現預期的功能,如同一臺沒(méi)有安裝操作系統的計算機,無(wú)法正常工作。因此,用戶(hù)必須編寫(xiě)固件程序來(lái)輔助硬件完成USB通信任務(wù)。具體如下:
(1)初始化。主要是設置一些特殊寄存器的初值,以實(shí)現所需的設備屬性或功能,例如開(kāi)中斷、使能端點(diǎn)、配置端口等。
(2)輔助硬件完成設備的重新枚舉(ReNumeration)過(guò)程。包括模擬設備的斷開(kāi)與重新連接,對收到的設置包進(jìn)行分析判斷,從而對主設備請求做出適當的響應,完成對設備的配置任務(wù)。
(3)對中斷的處理。
(4)數據的接收和發(fā)送。
(5)外圍電路的控制。
固件程序設計成中斷驅動(dòng)模式,采用模塊化設計,其總體結構如圖4所示。
各模塊的主要功能如下:
(1)主程序:完成DSP及USB接口芯片的初始化、數據發(fā)送/接收標志位的判斷及中斷請求等待。
(2)中斷服務(wù)程序:中斷服務(wù)程序是整個(gè)固件程序設計的重點(diǎn)。首先通過(guò)讀取ISP1581中斷寄存器的值判斷所發(fā)生中斷的類(lèi)型,然后根據具體的中斷類(lèi)型進(jìn)入相應的處理子程序或設置相應的標志位。中斷服務(wù)程序中需要處理的有總線(xiàn)復位中斷、高速狀態(tài)變化中斷、SETUP中斷及端點(diǎn)的IN/OUT中斷。在所有的中斷處理程序中,EP0SETUP中斷處理是最重要的,它是USB設備與PC機間建立通信鏈路的基礎。
(3)請求處理程序:USB標準請求處理程序負責處理枚舉階段主機發(fā)給設備的標準請求,以及正常工作時(shí)主機發(fā)送的廠(chǎng)商請求。USB2.0協(xié)議中規定了11種USB標準請求,對這11種標準請求作出正確的響應是設備成功枚舉的重中之重。當固件接收到第1個(gè)SETUP中斷后,就進(jìn)入USB枚舉過(guò)程,其過(guò)程是由主機發(fā)出一系列USB標準設備請求并要求及時(shí)得到設備響應,如果不需要進(jìn)行操作,也必須指示一個(gè)空響應,使主機能為該設備準備其所請求的資源,建立好兩者之間的信息溝通機制。
(4)數據接收/發(fā)送程序:當用戶(hù)通過(guò)主機端應用程序向設備索要數據或向設備發(fā)送數據時(shí),DSP調用數據發(fā)送/接收子程序完成數據的發(fā)送/接收。數據的發(fā)送和接收過(guò)程如下:
發(fā)送數據:選擇端點(diǎn)索引→寫(xiě)發(fā)送緩沖區長(cháng)度寄存器→寫(xiě)發(fā)送數據到數據端口寄存器→等待發(fā)送完畢標志。
接收數據:選擇端點(diǎn)索引→讀接收緩沖區長(cháng)度寄存器→從數據端口寄存器讀取接收到的數據。
(5)硬件接口訪(fǎng)問(wèn)程序:硬件接口程序負責完成DSP對ISP1581的讀寫(xiě)操作,它是整個(gè)固件程序中最底層也是使用最頻繁的部分,在這里主要定義了2種類(lèi)型的函數:ISP1581常用寄存器訪(fǎng)問(wèn)函數和數據端口寄存器訪(fǎng)問(wèn)函數。
常用寄存器訪(fǎng)問(wèn)函數:
void outport(unsigned int *reg_addr, unsigned short value);
unsigned short inport(unsigned int *reg_addr);
數據端口寄存器訪(fǎng)問(wèn)函數:
void write_ep(unsigned short *addr, unsigned short size);
unsigned short read_ep(unsigned short *addr);
write_ep為寫(xiě)端點(diǎn)發(fā)送緩沖區函數,其中參數*addr為指向待發(fā)送緩沖區的起始地址指針,參數size為要發(fā)送數據的字節數;read_ep為讀端點(diǎn)接收緩沖區函數,參數含義與write_ep函數相同,返回值為接收數據的字節數。
評論