⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 codec_edma.c

📁 DSP系統設計和BIOS編程及應用實例-書籍光碟範例-第10章
💻 C
字号:

/*程序使用缓冲区地址递增的方式,顺次存储,顺次读取。EDMA只使能读通道中断。即读入数据直接输出,
没有对输出通道是否完成的判断。*/


#include <stdio.h>
#include <c6x.h>
#include "c6xdsk.h"
#include "codec_edma.h"
#include "c6xinterrupts.h"
#define  DATA_SIZE 2
#define  BLOCK_SIZE 80
#define  NUM_OF_BLOCKS 18
#define  DELAY 5

/* change to TI code */
#include "filter.h" 


int pcm_out,pcm_in,dma_index;
int src,dst;
short *in_ptr,*out_ptr;
short in[NUM_OF_BLOCKS*BLOCK_SIZE], out[NUM_OF_BLOCKS*BLOCK_SIZE];
int main()
{
 
  int i;
	/* dsp and periphiral initialization */    
	CSR=0x100;			         /* disable all interrupts            */
  IER=1;                   /* disable all interrupts except NMI */
  ICR=0xffff;              /* clear all pending interrupts      */
  *(unsigned volatile int *)EMIF_GCR = 0x3300; 	     /* EMIF global control               */
  *(unsigned volatile int *)EMIF_CE0 = 0x30;         /* EMIF CE0control                   */
  *(unsigned volatile int *)EMIF_CE1 = 0xffffff03;	 /* EMIF CE1 control, 8bit async      */
  *(unsigned volatile int *)EMIF_SDCTRL = 0x07117000; /* EMIF SDRAM control                */
  *(unsigned volatile int *)EMIF_SDRP = 0x61a;       /* EMIF SDRM refresh period          */
  *(unsigned volatile int *)EMIF_SDEXT = 0x54519; /* EMIF SDRAM extension    */

  for (i=0; i<NUM_OF_BLOCKS*BLOCK_SIZE; i++)     /* clear all buffers  */
  {
    in[i]=0;
    out[i]=0;
  }

  out[0] = 0xaa;
  out[1] = 0;
  out[2] = 0x1;
  out[3] = 0x0386;         /* data for software reset */
  out[4] = 0;

  
  out[5] = 0;
  out[6] = 0x1;
  out[7] = 0x0306;         /* set reg 3 for mic input */
  out[8] = 0;

  out[9] = 0;
  out[10] = 0x1;
  out[11] = 0x0400;         /* data for software reset */
  out[12] = 0;

  out[13] = 0;
  out[14] = 0x1;
  out[15] = 0x0502;         /* data for software reset */
  out[16] = 0;
  config_Interrupt_Selector(8, EDMA_INT);
  ICR = 0x100;
  IER |= 0x102;             /* enable int 8 (EDMA) */
  CSR |= 1;
  
   
  edma_init(); 
  mcbsp0_init();

  while (1) {}

 
}

void mcbsp0_init()
{
    /* set up McBSP0                                                                   */
    *(unsigned volatile int *)McBSP0_SPCR = 0;			        /*  reset serial port                         */
    *(unsigned volatile int *)McBSP0_PCR = 0;              /*  set pin control reg.;                     */
    *(unsigned volatile int *)McBSP0_RCR = 0x10040;        /*  set rx control reg. one 16 bit data/frame */
    *(unsigned volatile int *)McBSP0_XCR = 0x10040;        /*  set tx control reg. one 16 bit data/frame */
    *(unsigned volatile int *)McBSP0_DXR = 0;
    *(unsigned volatile int *)McBSP0_SPCR = 0x12001;       /*  setup SP control reg.;                    */
}

void edma_init()
{ 
  *(unsigned volatile int *)ECR = 0xffff;    /* clear all pending edma event */
  *(unsigned volatile int *)EER = 0x3000;    /* enable event 12 & 13 */

  *(unsigned volatile int *)CIPR = 0xffff;   /* clear all pending edma interrupts */
  *(unsigned volatile int *)CIER = 0x100;    /* enable CCE8 */
  pcm_in = (int)&in;
  pcm_out = (int)&out;
  in_ptr = (short *)pcm_in;
  out_ptr = (short *)( pcm_out + DELAY*BLOCK_SIZE*DATA_SIZE);

  dma_index = 1;
  /* set up edma for mcbsp0 transmitter */
  *(unsigned volatile int *)(EVENTC_PARAMS+OPT) = 0x49000002;
  *(unsigned volatile int *)(EVENTC_PARAMS+SRC) = pcm_out;
  *(unsigned volatile int *)(EVENTC_PARAMS+CNT) = BLOCK_SIZE;
  *(unsigned volatile int *)(EVENTC_PARAMS+DST) = McBSP0_DXR;
  *(unsigned volatile int *)(EVENTC_PARAMS+IDX) = 0;
  *(unsigned volatile int *)(EVENTC_PARAMS+LNK) = EVENTN_PARAMS;
  
  /* set up edma for mcbsp0 receiver  */
  *(unsigned volatile int *)(EVENTD_PARAMS+OPT) = 0x48380002;
  *(unsigned volatile int *)(EVENTD_PARAMS+SRC) = McBSP0_DRR;
  *(unsigned volatile int *)(EVENTD_PARAMS+CNT) = BLOCK_SIZE;
  *(unsigned volatile int *)(EVENTD_PARAMS+DST) = pcm_in;
  *(unsigned volatile int *)(EVENTD_PARAMS+IDX) = 0;
  *(unsigned volatile int *)(EVENTD_PARAMS+LNK) = EVENTO_PARAMS;

  src = pcm_out+BLOCK_SIZE*DATA_SIZE;
  dst = pcm_in+BLOCK_SIZE*DATA_SIZE;
  
  /* set up edma reload params for mcbsp0 transmitter  */
  *(unsigned volatile int *)(EVENTN_PARAMS+OPT) = 0x49000002;
  *(unsigned volatile int *)(EVENTN_PARAMS+SRC) = src;
  *(unsigned volatile int *)(EVENTN_PARAMS+CNT) = BLOCK_SIZE;
  *(unsigned volatile int *)(EVENTN_PARAMS+DST) = McBSP0_DXR;
  *(unsigned volatile int *)(EVENTN_PARAMS+IDX) = 0;
  *(unsigned volatile int *)(EVENTN_PARAMS+LNK) = EVENTN_PARAMS;

  /* set up edma reload params for mcbsp0 receiver  */
  *(unsigned volatile int *)(EVENTO_PARAMS+OPT) = 0x48380002;
  *(unsigned volatile int *)(EVENTO_PARAMS+SRC) = McBSP0_DRR;
  *(unsigned volatile int *)(EVENTO_PARAMS+CNT) = BLOCK_SIZE;
  *(unsigned volatile int *)(EVENTO_PARAMS+DST) = dst;
  *(unsigned volatile int *)(EVENTO_PARAMS+IDX) = 0;
  *(unsigned volatile int *)(EVENTO_PARAMS+LNK) = EVENTO_PARAMS;
  
}

interrupt void edma_isr()
{
    int i,temp;
    if ( dma_index  == NUM_OF_BLOCKS -1) 
    {
		dma_index =0;
		dst = pcm_in;	 
		src =  pcm_out;
    }
    else 
    {
		dma_index++;		
		src += BLOCK_SIZE*DATA_SIZE;
		dst += BLOCK_SIZE*DATA_SIZE;
    }

    *(unsigned volatile int *)CIPR |= 0x100;  /* clear CCE8 bit  */
    *(unsigned volatile int *)(EVENTN_PARAMS+SRC) = src;
    *(unsigned volatile int *)(EVENTO_PARAMS+DST) = dst;

    temp = (int)in_ptr - pcm_in - NUM_OF_BLOCKS*BLOCK_SIZE*DATA_SIZE;
    if (temp >= 0) 
    {
      in_ptr = (short *)pcm_in;  
    }
      
    temp = (int)out_ptr - pcm_out - NUM_OF_BLOCKS*BLOCK_SIZE*DATA_SIZE;
    if (temp >= 0) 
    {
      out_ptr = (short *)pcm_out;  
    }

    for (i=0;i<BLOCK_SIZE;i++) *out_ptr++ = *in_ptr++ & 0xfffe;


// ProcBlock(in_ptr,out_ptr, BLOCK_SIZE);
 in_ptr  += BLOCK_SIZE;
 out_ptr += BLOCK_SIZE;
 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -