新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ADSP2116中DMA的應用

        ADSP2116中DMA的應用

        作者: 時間:2004-12-06 來源:網絡 收藏
        摘要:直接內存存取()是DSP芯片中用于快速數據交換的重要技術,文中對AD公司的浮點系列芯片x中方法作了詳細介紹,同時重點介紹了鏈式的操作方法,給出了一些實際中的例子。

        關鍵詞:DMA 鏈式DMA 浮點系列芯片 x

        1 DMA概述

        直接內存存取(DMA)是計算機系統提高運行效率的一項重要技術。它可以在CPU運行指令的同時,使系統從外部存儲器或設備中存取數據?也可以在核心處理器不參與的情況下由專用的DMA設備存取數據。

        對于DSP芯片來講,DMA的作用尤為重要。眾所周知,DSP芯片主要面向實時信號處理?其核心運算部件具有很高的運算速度,常以MFLOPS(每秒百萬次浮點運算)來衡量。ADSP2116x的速度為600MFLOPS?此速度是以存儲在芯片內部存儲器中的程序和數據為前提的。在DSP內部,一般采用多總線的哈佛結構?數據總線和程序總線相互獨立,即指令的存取和數據的存取并行不悖,另外,在AD-SP2116x內部還有各種接口總線,可用以提高數據的流通能力,而在芯片的外部,所有的總線都被合并在一起了。為了發揮DSP核心運算單元的高速運算能力,必須先把外部數據傳輸到片內存儲器中。使用DMA操作可以減少核心處理器的負擔,提高運算速度。另一方面,DSP系統總要與各種外部信號打交道?它從外部輸入數字信號,經過各種算法處理后,還要輸出給其它外部設備。不僅如此,對于很多系統?數據的輸入和輸出常常是連續不斷的。試想?若用DSP的核心部件完成數據的輸入和輸出,將無法發揮DSP的高速運算能力。而AD公司的ADSP2116x系列則集成了DMA控制器,從而可用DMA來完成數據的輸入和輸出。

        高效的DSP系統通常采用圖1所示的結構。該結構的內部帶有輸入、輸出緩沖區,而數據的獲得則依靠DMA控制器。這樣,核心運算單元就可以專門進行信號處理,而將外界數據的獲取交給 DMA來完成。

        2 ADSP2116x中的DMA

        2.1 ADSP2116x中DMA的數據傳輸類型

        ADSP2116x中的DMA包含14條獨立通道,可完成下列類型的數據傳輸操作:

        ●片內存儲器與片外存儲器或片外設備之間的傳輸操作;

        ●片內存儲器與其它ADSP2116x的片內存儲器之間的傳輸操作;

        ●片內存儲器與主處理器之間的傳輸操作;

        ●片內存儲器與串行口之間的傳輸操作;

        ●片內存儲器與Link口之間的傳輸操作;

        ●片內存儲器與SPI口之間的傳輸操作;

        ●片外存儲器與片外設備之間的傳輸操作。

        2.2 ADSP2116x中與DMA有關的寄存器

        DMA的編程實際上是通過內部核心處理單元或外部主機對片內有關的I/O寄存器設置來完成的,與DMA有關的I/O寄存器如表1所列。控制寄存器主要用來設置數據傳輸的方向、數據格式、是否鏈式等操作;參數寄存器用來設置數據傳輸的地址、數目等信息;數據緩存器則主要用來緩存傳輸的數據,以提高數據的傳輸率。這些I/O寄存器都被映射到片內存儲器的前256個地址上。

        表1 x中的DMA緩存器

        DMA通道號控制寄存器參數寄存器數據緩存器說 明
        0SPCTL0II0A,IM0A,CP0A,GP0ARX0A,TX0A串口0A
        1II0B,IM0B,C0B,CP0B,GP0BRX0B,TX0B串口0B
        2SPCTL1II1A,IM1A,C1A,CP1A,GP1ARX1A,TX1A串口1A
        3II1B,IM1B,C1B,CP1B,GP1BRX1B,TX1B串口1B
        4SPCTL2II2A,IM2A,C2A,CP2A,GP2ARX2A,TX2A串口2A
        5II2B,IM2B,C2B,CP2B,GP2BRX2B,TX2B串口2B
        6SPCTL3II3A,IM3A,C3A,CP3A,GP3ARX3A,TX3A串口3A
        7II3B,IM3B,C3B,CP3B,GP3BRX3B,TX3B串口3B
        8LCTLSPICTLIILB1,IMLB1,CLB1,CPLB1,GPLB1 IISTX,IMSRX,CSRX,GPSRXLUBF0 SPIRXLink0口SPI發送口
        9IILB1,IMLB1,CLB1,CPLB1,GPLB1 IISTX,IMSTX,CSTX,GPSTXLUBF1 SPITXLink1口SPI發送口
        10DMAC10IIEP0,IMEP0,CEP0,CPEP0,GPEP0,EIEP0,EMEP0,ECEP0EPB0外部接口0
        11DMAC11IIEP1,IMEP1,CEP1,CPEP1,GPEP1,EIEP1,EMEP1,ECEP1EPB1外部接口1
        12DMAC12IIEP2,IMEP2,CEP2,CPEP2,GPEP2,EIEP2,EMEP2,ECEP2EPB2外部接口2
        13DMAC13GPEP3,EIEP3,CEP3,CPEP3,GPEP3,EIEP3,EMEP3,ECEP3EPB3外部接口3

        2.3 ADSP2116x中DMA一般傳輸過程的設置

        DMA一般傳輸過程的設置步驟如下:

        (1)設置對應通道的參數寄存器?

        (2)設置對應通道的DMA控制寄存器,并將其中的DMA使能位設為有效?

        (3)開始DMA數據傳輸?

        (4)DMA傳輸結束后,產生對應的中斷,并通過程序對中斷進行處理。

        2.4 ADSP2116x中的鏈式DMA

        為了減少由DMA引起的中斷,ADSP2116x中的DMA控制器提供了鏈式DMA功能。所謂鏈式DMA,是指在當前的DMA結束時,I/O處理器能夠自動加載DMA參數并開始下一個DMA傳輸。利用這種特性,程序能夠設置多個具有不同屬性的DMA傳輸。在鏈式DMA過程中,通常先把每次DMA傳輸的有關參數寫成一個傳輸控制塊(TCB),并把它們存儲在片內。傳輸過程中,在當前的DMA結束時,I/O處理器將對鏈式指針寄存器(CPx)進行控制以使其指向存儲在片內的下一個TCB。

        表2 TCB中各相關參數寄存器的排列順序

        地 址外部口Link口和串口
        CPx+0x00040000IIEPxIIx
        CPx-1+0x00040000IMEPxIMx
        CPx-2+0x00040000CEPxCx
        CPx-3+0x00040000CPEPxCPx
        CPx-4+0x00040000GPEPxGPx
        CPx-5+0x00040000EIEPx 
        CPx-6+0x00040000EMEPx 
        CPx-7+0x00040000ECEPx 
        CPx-8+0x00040000- 

        CPx在鏈式DMA中具有非常重要的作用,它是一個19位的寄存器,其中低18位是偏移地址,在ADSP2116x中,這組偏移地址加上0x00040000后才是片內存儲器中的實際地址,其中最高一位為中斷控制位。該位在被設置的情況下,I/O處理器將在鏈式DMA結束時產生一個中斷,實際上CPx指向的是TCB的最大地址,在TCB中,各有關DMA參數寄存器的排列順序如表2所列。表中的“x”代表所用到的DMA通道。鏈式DMA傳輸過程的設置步驟如下:

        (1)在片內存儲器中設置好所有的TCB?

        (2)設置對應通道的控制寄存器,并將其中的DMA使能位和鏈式使能位設為有效?

        (3)將第一個TCB的最大地址寫到CPx中,并開始鏈式DMA的傳輸?

        (4)傳輸結束后,產生對應的中斷。

        有兩點要特別注意:第一是鏈式DMA只能發生在同一DMA通道內;二是SPI口不支持鏈式DMA。

        3 幾種常用的DMA操作

        在基于ADSP2116x的DSP系統開發過程中,最常用的操作是片內存儲器和片外存儲器之間的DMA、link口之間的DMA、串口之間的DMA以及SPI之間的DMA等幾種。限于篇幅,本文只介紹前面兩種。

        3.1 片內存儲器和片外存儲器之間的DMA

        片內存儲器與片外存儲器之間的DMA傳輸可用通道10~13這四個通道中的任意一個來進行。下面通過一個例子來說明這種傳輸。假定要把片內存儲器地址0x50000~0x5001f中的32個數據?利用DMA通道10傳送到片外存儲器0x2000000~0x200001f中,則可用下面的程序來實現:

        R0=0;dm(DMAC10)=R0? //清空對應通道的DMA控制寄存器

        //設置片內存儲器參烽寄存器

        R0=0x50000; dm(IIEP0)=R0;? //設置片內存儲器起始地址

        R0=1; dm(EMEP0)=R0;? //設置片內存儲器地址增加值

        R0=32; dm(ECEP0)=R0;? // 設置片內存儲器計數寄存器

        //設置片外參數寄存器

        R0=0x2000000( dm?EIEP0)=R0? //設置片外存儲器起始地址

        R0=1; dm(IMEP0)=R0; //設置片外存儲器地址增加值

        R0=32; dm(CEP0)=R0;? //設置片外存儲器計數寄存器

        //設置對應通道的DMA控制寄存器

        Ustat1=0x00000000;

        Bit set ustat1 MASTER|PMODE4|TRAN|DEN;

        Dm(DMAC10)=ustat1; // 設置為master和無打包模式,并開始DMA傳輸

        上面的例子是一般的DMA傳輸。而如果需要進行兩段或兩段以上的數據傳輸,則要在中斷后重新設置參數寄存器,在這種情況下,用鏈式DMA更有利于提高核心處理單元的效率。假定要把片內存儲器地址0x50000~0x5001f中的32個數據和0x50040~0x5007f中的64個數據利用DMA通道10分別傳送到片外存儲器0x2000000~0x200001f和0x2000040~0x200007f中,可用下面的程序來實現:

        VAR tcb1[8] = 32,? //ECEP0

        1, //EMEP0

        0x2000000, // EIEP0

        0, // GPEP0

        tcb2+7-0x40000, // CPEP0,保證第一次DMA結束后自動加載第二個TCB

        32, // CEP0

        1, // IMEP0

        0x50000; // IIEP0

        VAR tcb2[8]=64,1,0x2000040,

        // ECEP0, EMEP0, EIEP0,0? //GPEP0

        0x40000, //CPEP0,保證第二個DMA結束后產生DMA中斷

        64,1,0x50040;//CEP0, IMEP0, IIEP0

        r0=0,

        dm(DMAC10)=r0; //清空對應通道的DMA控制器

        ustat0=0x00000000;

        bit set ustat0 INT32 |MASTER|PMODE4|CHEN|DEN|TRAN;

        dm(DMAC10)=ustat0; //設置為master和無打包模式,鏈式DMA

        r0=tcb1+7-0x40000;

        dm(CPEP0) =r0; //加載第一個TCB的CPEP0?

        開始DMA傳輸完第一段數據

        后自動開始加載第二個TCB,

        直到兩段數據后產生中斷

        bit set mode1 IRPTEN? //設置全局中斷使能

        bit set imask EP0I? //設置DMA通道#10中斷使能

        3.2 片內存儲器與link口之間的DMA

        ADSP2116x具有很強的并行工作能力,它不需另加任何外部仲裁電路,便可以直接通過link口聯接在一起并行工作以實現片間數據的交換,在通常情況下可采用DMA方式,以便充分發揮其優點。下面是兩片ADSP2116x之間通過link0口進行數據傳輸的例子。假定要把第一片片內存儲器0x100000~0x1001ff中的512個數據傳送到第二片的片內存儲器0x120000~0x1201ff中。其程序如下:

        //第一片

        .var txtcb_source?8?=0?0?0?0?0?512?1?0x100000?

        //設置DMA TCB

        r0 = 0? dm?LCTL? = r0? //清空對應通道的

        控制寄存器

        ustat1=dm?LCTL??

        bit clr ustat1 L0TRAN | LAB0 | L0CLKD0?

        bit set ustat1 L0EN | L0CLKD1 | L0DEN | L0CHEN ?dm?LCTL?=ustat1? //設置DMA控制器LCTL

        //設置link0口為2x時鐘,發

        送數據模式,鏈式DMA

        r1 = 0x00040000?

        r0 = txtcb_source + 7?

        r0 = r1 or r0? //設置CPLB0寄存器中的PCI位

        dm?txtcb_source + 4? = r0? //設置TCB中的CPLB0

        dm?CPLB0? = r0? //加載TCB中的CPLB0,并

        開始鏈式DMA

        //第二片

        .var rxtcb_dest?8?=0?0?0?0?0?512?1?0x120000?

        //設置DMA TCB

        r0=0? dm?LCTL?=r0? //清空對應通道的控制

        寄存器

        ustat1=dm?LCTL??

        bit clr ustat1 LAB0 | L0CLKD0?

        bit set ustat1 L0TRAN | L0EN | L0CLKD1 | L0DEN | L0CHEN ?

        dm?LCTL?=ustat1? //設置DMA控制器LCTL

        //設置link0口為2x時鐘,

        接收數據模式,鏈式DMA

        r1 = 0x00040000?

        r0 = rxtcb_dest + 7?

        r0 = r1 or r0? //設置CPLB0中的PCI位

        dm?rxtcb_dest + 4? = r0? //設置TCB中的CPLB0

        dm?CPLB0? = r0? //加載TCB中的CPLB0?

        并開始鏈式DMA

        4 結束語

        本文簡要介紹了ADSP2116x中DMA的基本原理,給出了幾種DMA操作時的編程實例,這些例子重點突出了鏈式DMA的應用。由于ADSP2116x中DMA操作功能強大,形式多樣。因此,只有熟練掌握和應用各種DMA,才能使數據進出芯片變得更加流暢,同時也才能使其核心處理單元的運算能力發揮到極致。



        關鍵詞: 應用 DMA ADSP2116

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 新晃| 买车| 祁阳县| 昌都县| 封开县| 清丰县| 白河县| 额济纳旗| 屏东市| 闵行区| 濉溪县| 雷州市| 周至县| 尉犁县| 类乌齐县| 商南县| 萨嘎县| 玛沁县| 蒲江县| 武宣县| 威海市| 黄浦区| 嘉义市| 东方市| 辛集市| 巧家县| 泰顺县| 澄江县| 土默特右旗| 读书| 德州市| 习水县| 开鲁县| 博白县| 天全县| 湄潭县| 商洛市| 皮山县| 滦平县| 北京市| 托克托县|