基于ISP1581USB接口芯片的DMA傳輸應用
引言
隨著USB2.0規(guī)范的推出,USB總線的最高數(shù)據(jù)傳輸速率可達到480Mbit/s,這進一步延伸了它的使用范圍,越來越多的設(shè)計者在設(shè)計嵌入式系統(tǒng)或者計算機外圍設(shè)備時開始采用USB總線進行數(shù)據(jù)傳輸,為了保證高的數(shù)據(jù)傳輸速率,許多USB接口芯片提供了直接存儲器存取(DMA)方式,通過使用DMA方式,能使大量數(shù)據(jù)在計算機外圍設(shè)備與USB接口芯片之間直接傳輸,從而保證USB總線上數(shù)據(jù)的吞吐量。本文以Philips公司(現(xiàn)獨立為NXP公司)的ISP1581USB接口芯片為例,介紹USB接口芯片的DMA傳輸應用。
硬件電路設(shè)計
ISP1581是USB2.0接口芯片,它有7個IN端點,7個OUT端點和1個固定的控制IN/OUT端點,內(nèi)部集成8K字節(jié)的多結(jié)構(gòu)FIFO 存儲器,特別是它有一個靈活的高速DMA接口,大大增加了數(shù)據(jù)的吞吐量,其內(nèi)部DMA組成框圖如圖1所示。
圖1 ISP1581DMA組成框圖
DMA硬件由DMA接口及DMA控制器組成,通過初始化DMA相關(guān)寄存器及發(fā)送DMA命令可以選擇DMA的工作方式,即兩字節(jié)的通用DMA傳輸或者三字節(jié)的IDE規(guī)范傳輸,本文主要介紹通用DMA的應用,通用DMA有兩種工作方式,即主機DMA(MDMA)和從機DMA(GDMA)方式,MDMA時芯片內(nèi)的DMA控制器作為主控方,由它產(chǎn)生DMA傳輸需要的控制時序,GDMA時,需要在外部單獨設(shè)計一個DMA控制器(外設(shè)DMA控制器)并作為主控方,并由它產(chǎn)生傳輸所需控制時序。由于DMA控制器和USB 內(nèi)核使用的是同一個FIFO(內(nèi)部RAM),所以DMA 控制器接收到DMA命令后,可直接控制數(shù)據(jù)從內(nèi)部RAM傳送到外部DMA設(shè)備或從外部DMA設(shè)備傳送到內(nèi)部RAM。圖1中各信號的含意如下:
D0~D15:DMA傳輸數(shù)據(jù)線,雙向。
DREQ:DMA請求信號,GDMA時輸出,MDMA時輸入。
DACK:DMA應答信號,GDMA時輸入,MDMA時輸出。
DIOR:DMA讀信號,GDMA時輸入,MDMA時輸出。
DIOW:DMA寫信號,GDMA時輸入,MDMA時輸出。
EOT:GDMA傳送終止信號,輸入,主要用在GDMA方式。
其它信號主要用在IDE規(guī)范傳輸中,在此不作介紹。由于GDMA方式數(shù)據(jù)傳輸速度更高且使用靈活,所以下面主要介紹GDMA的應用。
圖2 DMA從機方式應用原理框圖
圖2是GDMA應用框圖,是某自動測試設(shè)備數(shù)字I/O板的一部分,圖中 ISP1581外接單片機(AT89C55)作為控制器,單片機同時也是該板的控制核心,存儲器選用256K×18bit雙口RAM(IDT70V631),ISP1581采用GDMA方式讀寫該雙口RAM,外設(shè)DMA控制器在可編程器件FPGA中實現(xiàn)。
系統(tǒng)的工作過程是:當主控計算機需要和數(shù)字I/O板大批量交換數(shù)據(jù)時,向ISP1581發(fā)出批量傳輸命令,批量傳輸命令中包含了數(shù)據(jù)的傳輸方向,數(shù)據(jù)個數(shù)等信息,ISP1581接收到命令后,通過中斷方式通知單片機中的固件讀取該命令,固件完成對DMA的初始化,如選擇DMA端點,初始化DMA計數(shù)器,發(fā)送DMA命令等,ISP1581內(nèi)部的DMA控制器在準備好后,將發(fā)出DREQ信號給外設(shè)DMA控制器,外設(shè)DMA控制器接收到DREQ信號后,做好數(shù)據(jù)傳輸準備,回應一個DACK信號,然后產(chǎn)生DIOR或者DIOW完成DMA傳輸。
外設(shè)DMA控制器是在FPGA中完成設(shè)計的,要正確設(shè)計GDMA控制器必需了解GDMA模式的工作時序(見圖3)。圖中已經(jīng)初始化DREQ高有效,DACK低有效,DIOR和DIOW低有效,Tcy1為DMA讀寫周期,最快為12.8MHz,本設(shè)計使用10MHz。Tsu3為DIOR/DIOW有效前的DACK建立時間,最小可以為0。
圖3 GDMA從機模式時序
外設(shè)DMA控制器電路設(shè)計如圖4所示,當固件對ISP1581完成初始化并發(fā)出DMA傳輸命令后,ISP1581內(nèi)部的DMA控制器在準備好傳輸后發(fā)出DREQ信號(高電平),對該信號反相后可作為DACK信號(低電平),圖中R/信號為DMA讀寫控制信號,可以由固件控制產(chǎn)生,該信號和DACK及10MHz時鐘信號相或后產(chǎn)生DIOR及DIOW信號。例如GDMA工作于寫方式,數(shù)據(jù)從ISP1581內(nèi)部RAM傳送到外部雙口RAM,控制器在接收到有效的DREQ信號后,經(jīng)過反相,作為DACK信號回應ISP1581的DMA控制器,這時候固件通過控制R/W為高,該信號反相后與DACK及10MHz時鐘相或產(chǎn)生DIOR,控制數(shù)據(jù)從內(nèi)部RAM傳送到外部雙口RAM。雙口RAM的控制信號及地址產(chǎn)生電路設(shè)計較為簡單,可以結(jié)合DIOR及DIOW信號來產(chǎn)生。
圖4 DMA控制電路圖
軟件設(shè)計
USB固件中實現(xiàn)DMA傳輸?shù)南嚓P(guān)程序包括初始化程序及傳輸控制程序,其信息處理流程如圖5所示。
首先對DMA進行初始化,即設(shè)置一系列相關(guān)寄存器:DMA配置寄存器、DMA硬件寄存器、DMA中斷使能寄存器、DMA中斷源寄存器、DMA端點寄存器、DMA傳輸計數(shù)器寄存器、DMA命令寄存器等,初始化程序如下:
void DMA_Init(void)
{
//GDMA
D14_Cntrl_Reg.D14_D MA_COMMAND=0x11; //DMA復位
//設(shè)置DMA配置寄存器
//GDMA,16bit數(shù)據(jù),DIOR/DIOW有效,允許DMA計數(shù)器,DREQ一直保持到傳完數(shù)據(jù)
D14_Cntrl_Reg.D14_GDMA _CONFIG.VALUE=0x01;
D14_Cntrl_Reg.D14_UDM A_CONFIG.VALUE=0;
//設(shè)置DMA硬件寄存器
//DIOR/DIOW低電平有效,DREQ高電平有效,DACK低有效,GDMA從機方式,EOT低有效,正常數(shù)據(jù)
D14_Cntrl_Reg.D14_DMA _HARDWARE.VALUE=0x04;
//設(shè)置DMA中斷使能寄存器
//DMA傳輸計數(shù)器為零中斷,檢測到一個外部或者內(nèi)部EOT中斷
D14_Cntrl_Reg.D14_DMA_INT_E NABLE.VALUE=0x000d;
}
初始化完成后,接收PC機發(fā)來的DMA傳輸命令,該命令包含了數(shù)據(jù)的傳輸方向,數(shù)據(jù)個數(shù)等信息,然后設(shè)置DMA傳輸標志,主程序在檢測到該標志后,調(diào)用DMA傳輸子程序,在該子程序中,根據(jù)DMA傳輸方向情況分別進行DMA讀寫處理,在發(fā)出DMA讀或者寫命令前還需要對DMA端點寄存器、DMA傳輸計數(shù)器寄存器進行初始化,完成這些工作后,ISP1581DMA控制器將向外設(shè)DMA控制器發(fā)送DMA傳輸請求信號DREQ,外設(shè)在準備好傳輸后,返回應答信號DACK,然后啟動外設(shè)DMA控制器開始DMA傳輸,一次DMA傳輸最大1024個字節(jié),一次是否傳輸完成通過檢測DMA中斷寄存器的標志位DMA_XFER_OK及EXT_EOT進行判斷,DMA_XFER_OK為1,表明DMA傳輸結(jié)束,EXT_EOT是強行結(jié)束GDMA傳輸?shù)耐獠啃盘?,本設(shè)計沒有使用,已經(jīng)固定接為高電平(無效狀態(tài)),如果需要傳輸?shù)臄?shù)據(jù)大于1024字節(jié),則需要多次傳輸才能完成,在傳輸完成后清除DMA傳輸標志。
圖5 GDMA固件信息處理流程圖
結(jié)語
通過采用DMA傳輸方式,USB在傳輸不大于1024字節(jié)數(shù)據(jù)時傳輸速度達到10M字/秒,但當需要傳輸?shù)臄?shù)據(jù)遠大于1024字節(jié)時,由于DMA傳輸需要固件支持,實際的傳輸速度有所下降,設(shè)計中可以通過提高單片機的工作時鐘來改善USB的傳輸速度。本設(shè)計已經(jīng)成功應用到某測試設(shè)備中,提高了系統(tǒng)的數(shù)據(jù)傳輸速度,達到設(shè)計要求。