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