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