色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          ADSP2116中DMA的應(yīng)用

          作者: 時(shí)間:2004-12-06 來源:網(wǎng)絡(luò) 收藏
          摘要:直接內(nèi)存存取()是DSP芯片中用于快速數(shù)據(jù)交換的重要技術(shù),文中對(duì)AD公司的浮點(diǎn)系列芯片x中方法作了詳細(xì)介紹,同時(shí)重點(diǎn)介紹了鏈?zhǔn)?a class="contentlabel" href="http://cafeforensic.com/news/listbylabel/label/DMA">DMA的操作方法,給出了一些實(shí)際中的例子。

          關(guān)鍵詞:DMA 鏈?zhǔn)紻MA 浮點(diǎn)系列芯片 x

          1 DMA概述

          直接內(nèi)存存?。ǎ模停粒┦怯?jì)算機(jī)系統(tǒng)提高運(yùn)行效率的一項(xiàng)重要技術(shù)。它可以在CPU運(yùn)行指令的同時(shí),使系統(tǒng)從外部存儲(chǔ)器或設(shè)備中存取數(shù)據(jù)?也可以在核心處理器不參與的情況下由專用的DMA設(shè)備存取數(shù)據(jù)。

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

          高效的DSP系統(tǒng)通常采用圖1所示的結(jié)構(gòu)。該結(jié)構(gòu)的內(nèi)部帶有輸入、輸出緩沖區(qū),而數(shù)據(jù)的獲得則依靠DMA控制器。這樣,核心運(yùn)算單元就可以專門進(jìn)行信號(hào)處理,而將外界數(shù)據(jù)的獲取交給 DMA來完成。

          2?。粒模樱校玻保保叮械模模停?/B>

          2.1 ADSP2116x中DMA的數(shù)據(jù)傳輸類型

          ADSP2116x中的DMA包含14條獨(dú)立通道,可完成下列類型的數(shù)據(jù)傳輸操作:

          ●片內(nèi)存儲(chǔ)器與片外存儲(chǔ)器或片外設(shè)備之間的傳輸操作;

          ●片內(nèi)存儲(chǔ)器與其它ADSP2116x的片內(nèi)存儲(chǔ)器之間的傳輸操作;

          ●片內(nèi)存儲(chǔ)器與主處理器之間的傳輸操作;

          ●片內(nèi)存儲(chǔ)器與串行口之間的傳輸操作;

          ●片內(nèi)存儲(chǔ)器與Link口之間的傳輸操作;

          ●片內(nèi)存儲(chǔ)器與SPI口之間的傳輸操作;

          ●片外存儲(chǔ)器與片外設(shè)備之間的傳輸操作。

          2.2 ADSP2116x中與DMA有關(guān)的寄存器

          DMA的編程實(shí)際上是通過內(nèi)部核心處理單元或外部主機(jī)對(duì)片內(nèi)有關(guān)的I/O寄存器設(shè)置來完成的,與DMA有關(guān)的I/O寄存器如表1所列??刂萍拇嫫髦饕脕碓O(shè)置數(shù)據(jù)傳輸?shù)姆较?、?shù)據(jù)格式、是否鏈?zhǔn)降炔僮?;參?shù)寄存器用來設(shè)置數(shù)據(jù)傳輸?shù)牡刂?、?shù)目等信息;數(shù)據(jù)緩存器則主要用來緩存?zhèn)鬏數(shù)臄?shù)據(jù),以提高數(shù)據(jù)的傳輸率。這些I/O寄存器都被映射到片內(nèi)存儲(chǔ)器的前256個(gè)地址上。

          表1 x中的DMA緩存器

          DMA通道號(hào)控制寄存器參數(shù)寄存器數(shù)據(jù)緩存器說 明
          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發(fā)送口
          9IILB1,IMLB1,CLB1,CPLB1,GPLB1 IISTX,IMSTX,CSTX,GPSTXLUBF1 SPITXLink1口SPI發(fā)送口
          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一般傳輸過程的設(shè)置

          DMA一般傳輸過程的設(shè)置步驟如下:

          (1)設(shè)置對(duì)應(yīng)通道的參數(shù)寄存器?

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

          (3)開始DMA數(shù)據(jù)傳輸?

          (4)DMA傳輸結(jié)束后,產(chǎn)生對(duì)應(yīng)的中斷,并通過程序?qū)χ袛噙M(jìn)行處理。

          2.4 ADSP2116x中的鏈?zhǔn)剑模停?/P>

          為了減少由DMA引起的中斷,ADSP2116x中的DMA控制器提供了鏈?zhǔn)剑模停凉δ?。所謂鏈?zhǔn)剑模停粒侵冈诋?dāng)前的DMA結(jié)束時(shí),I/O處理器能夠自動(dòng)加載DMA參數(shù)并開始下一個(gè)DMA傳輸。利用這種特性,程序能夠設(shè)置多個(gè)具有不同屬性的DMA傳輸。在鏈?zhǔn)剑模停吝^程中,通常先把每次DMA傳輸?shù)挠嘘P(guān)參數(shù)寫成一個(gè)傳輸控制塊(TCB),并把它們存儲(chǔ)在片內(nèi)。傳輸過程中,在當(dāng)前的DMA結(jié)束時(shí),I/O處理器將對(duì)鏈?zhǔn)街羔樇拇嫫鳎ǎ茫校┻M(jìn)行控制以使其指向存儲(chǔ)在片內(nèi)的下一個(gè)TCB。

          表2 TCB中各相關(guān)參數(shù)寄存器的排列順序

          地 址外部口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在鏈?zhǔn)剑模停林芯哂蟹浅V匾淖饔?,它是一個(gè)19位的寄存器,其中低18位是偏移地址,在ADSP2116x中,這組偏移地址加上0x00040000后才是片內(nèi)存儲(chǔ)器中的實(shí)際地址,其中最高一位為中斷控制位。該位在被設(shè)置的情況下,I/O處理器將在鏈?zhǔn)剑模停两Y(jié)束時(shí)產(chǎn)生一個(gè)中斷,實(shí)際上CPx指向的是TCB的最大地址,在TCB中,各有關(guān)DMA參數(shù)寄存器的排列順序如表2所列。表中的“x”代表所用到的DMA通道。鏈?zhǔn)剑模停羵鬏斶^程的設(shè)置步驟如下:

          (1)在片內(nèi)存儲(chǔ)器中設(shè)置好所有的TCB?

          (2)設(shè)置對(duì)應(yīng)通道的控制寄存器,并將其中的DMA使能位和鏈?zhǔn)绞鼓芪辉O(shè)為有效?

          (3)將第一個(gè)TCB的最大地址寫到CPx中,并開始鏈?zhǔn)剑模停恋膫鬏?

          (4)傳輸結(jié)束后,產(chǎn)生對(duì)應(yīng)的中斷。

          有兩點(diǎn)要特別注意:第一是鏈?zhǔn)剑模停林荒馨l(fā)生在同一DMA通道內(nèi);二是SPI口不支持鏈?zhǔn)剑模停痢?BR>
          3 幾種常用的DMA操作

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

          3.1 片內(nèi)存儲(chǔ)器和片外存儲(chǔ)器之間的DMA

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

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

          //設(shè)置片內(nèi)存儲(chǔ)器參烽寄存器

          R0=0x50000; dm(IIEP0)=R0;? //設(shè)置片內(nèi)存儲(chǔ)器起始地址

          R0=1; dm(EMEP0)=R0;? //設(shè)置片內(nèi)存儲(chǔ)器地址增加值

          R0=32; dm(ECEP0)=R0;? // 設(shè)置片內(nèi)存儲(chǔ)器計(jì)數(shù)寄存器

          //設(shè)置片外參數(shù)寄存器

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

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

          R0=32; dm(CEP0)=R0;? //設(shè)置片外存儲(chǔ)器計(jì)數(shù)寄存器

          //設(shè)置對(duì)應(yīng)通道的DMA控制寄存器

          Ustat1=0x00000000;

          Bit set ustat1 MASTER|PMODE4|TRAN|DEN;

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

          上面的例子是一般的DMA傳輸。而如果需要進(jìn)行兩段或兩段以上的數(shù)據(jù)傳輸,則要在中斷后重新設(shè)置參數(shù)寄存器,在這種情況下,用鏈?zhǔn)剑模停粮欣谔岣吆诵奶幚韱卧男?。假定要把片?nèi)存儲(chǔ)器地址0x50000~0x5001f中的32個(gè)數(shù)據(jù)和0x50040~0x5007f中的64個(gè)數(shù)據(jù)利用DMA通道10分別傳送到片外存儲(chǔ)器0x2000000~0x200001f和0x2000040~0x200007f中,可用下面的程序來實(shí)現(xiàn):

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

          1, //EMEP0

          0x2000000, // EIEP0

          0, // GPEP0

          tcb2+7-0x40000, // CPEP0,保證第一次DMA結(jié)束后自動(dòng)加載第二個(gè)TCB

          32, // CEP0

          1, // IMEP0

          0x50000; // IIEP0

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

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

          0x40000, //CPEP0,保證第二個(gè)DMA結(jié)束后產(chǎn)生DMA中斷

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

          r0=0,

          dm(DMAC10)=r0; //清空對(duì)應(yīng)通道的DMA控制器

          ustat0=0x00000000;

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

          dm(DMAC10)=ustat0; //設(shè)置為master和無打包模式,鏈?zhǔn)剑模停?/P>

          r0=tcb1+7-0x40000;

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

          開始DMA傳輸完第一段數(shù)據(jù)

          后自動(dòng)開始加載第二個(gè)TCB,

          直到兩段數(shù)據(jù)后產(chǎn)生中斷

          bit set mode1 IRPTEN? //設(shè)置全局中斷使能

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

          3.2 片內(nèi)存儲(chǔ)器與link口之間的DMA

          ADSP2116x具有很強(qiáng)的并行工作能力,它不需另加任何外部仲裁電路,便可以直接通過link口聯(lián)接在一起并行工作以實(shí)現(xiàn)片間數(shù)據(jù)的交換,在通常情況下可采用DMA方式,以便充分發(fā)揮其優(yōu)點(diǎn)。下面是兩片ADSP2116x之間通過link0口進(jìn)行數(shù)據(jù)傳輸?shù)睦?。假定要把第一片片?nèi)存儲(chǔ)器0x100000~0x1001ff中的512個(gè)數(shù)據(jù)傳送到第二片的片內(nèi)存儲(chǔ)器0x120000~0x1201ff中。其程序如下:

          //第一片

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

          //設(shè)置DMA TCB

          r0 = 0? dm?LCTL? = r0? //清空對(duì)應(yīng)通道的

          控制寄存器

          ustat1=dm?LCTL??

          bit clr ustat1 L0TRAN | LAB0 | L0CLKD0?

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

          //設(shè)置link0口為2x時(shí)鐘,發(fā)

          送數(shù)據(jù)模式,鏈?zhǔn)剑模停?/P>

          r1 = 0x00040000?

          r0 = txtcb_source + 7?

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

          dm?txtcb_source + 4? = r0? //設(shè)置TCB中的CPLB0

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

          開始鏈?zhǔn)剑模停?/P>

          //第二片

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

          //設(shè)置DMA TCB

          r0=0? dm?LCTL?=r0? //清空對(duì)應(yīng)通道的控制

          寄存器

          ustat1=dm?LCTL??

          bit clr ustat1 LAB0 | L0CLKD0?

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

          dm?LCTL?=ustat1? //設(shè)置DMA控制器LCTL

          //設(shè)置link0口為2x時(shí)鐘,

          接收數(shù)據(jù)模式,鏈?zhǔn)剑模停?/P>

          r1 = 0x00040000?

          r0 = rxtcb_dest + 7?

          r0 = r1 or r0? //設(shè)置CPLB0中的PCI位

          dm?rxtcb_dest + 4? = r0? //設(shè)置TCB中的CPLB0

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

          并開始鏈?zhǔn)剑模停?/P>

          4 結(jié)束語

          本文簡要介紹了ADSP2116x中DMA的基本原理,給出了幾種DMA操作時(shí)的編程實(shí)例,這些例子重點(diǎn)突出了鏈?zhǔn)剑模停恋膽?yīng)用。由于ADSP2116x中DMA操作功能強(qiáng)大,形式多樣。因此,只有熟練掌握和應(yīng)用各種DMA,才能使數(shù)據(jù)進(jìn)出芯片變得更加流暢,同時(shí)也才能使其核心處理單元的運(yùn)算能力發(fā)揮到極致。



          關(guān)鍵詞: 應(yīng)用 DMA ADSP2116

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉