TI中文支持网
TI专业的中文技术问题搜集分享网站

DMA实现数据处理,实现声音采集,声音处理,及播放

运用5509a,通过配置DMA来实现中断处理,在中段处理函数中实现声音的处理和播放,但是不知道为何播放后的声音是不对的,单步调试的时候会出现声音处理迭代系数只有0和-1两种数字,希望能够得到各位的指教。

 

/* Define transmit and receive buffers */

#pragma DATA_SECTION(xmt,"dmaMem")

Uint16 xmt[N];

#pragma DATA_SECTION(rcv,"dmaMem")

Uint16 rcv[N];

 

/*锁相环的设置*/

PLL_Config myConfig     = {

0,   //IAI: the PLL locks using the same process that was underway

               //before the idle mode was entered

1,   //IOB: If the PLL indicates a break in the phase lock,

               //it switches to its bypass mode and restarts the PLL phase-locking

               //sequence

24,   //PLL multiply value; multiply 24 times

1             //Divide by 2 PLL divide value; it can be either PLL divide value

              //(when PLL is enabled), or Bypass-mode divide value

               //(PLL in bypass mode, if PLL multiply value is set to 1)

};

 

/*******************************************************************************************/

/**********************************MCBSP设置************************************************/

 

 

MCBSP_Config ConfigLoopBack16= {

MCBSP_SPCR1_RMK(

   MCBSP_SPCR1_DLB_OFF,                   /* DLB   = 0,禁止自闭环方式 */

   MCBSP_SPCR1_RJUST_LZF,                 /* RJUST = 2 */

   MCBSP_SPCR1_CLKSTP_DISABLE,           /* CLKSTP = 0 */

   MCBSP_SPCR1_DXENA_ON,                 /* DXENA = 1 */

   0,                                     /* ABIS   = 0 */

   MCBSP_SPCR1_RINTM_RRDY,               /* RINTM = 0 */

   0,                                    /* RSYNCER = 0 */

   MCBSP_SPCR1_RRST_DISABLE               /* RRST   = 0 */

   ),

   MCBSP_SPCR2_RMK(

   MCBSP_SPCR2_FREE_NO,                   /* FREE   = 0 */

   MCBSP_SPCR2_SOFT_NO,                   /* SOFT   = 0 */

   MCBSP_SPCR2_FRST_FSG,                 /* FRST   = 0 */

   MCBSP_SPCR2_GRST_CLKG,                 /* GRST   = 0 */

   MCBSP_SPCR2_XINTM_XRDY,               /* XINTM = 0 */

   0,                                     /* XSYNCER = N/A */          

 MCBSP_SPCR2_XRST_DISABLE               /* XRST   = 0 */

   ),

   /*单数据相,接受数据长度为16位,每相2个数据*/

MCBSP_RCR1_RMK(

    MCBSP_RCR1_RFRLEN1_OF(1),             /* RFRLEN1 = 1 */

    MCBSP_RCR1_RWDLEN1_16BIT               /* RWDLEN1 = 2 */

),

MCBSP_RCR2_RMK(    

   MCBSP_RCR2_RPHASE_SINGLE,             /* RPHASE = 0 */

   MCBSP_RCR2_RFRLEN2_OF(0),             /* RFRLEN2 = 0 */

   MCBSP_RCR2_RWDLEN2_8BIT,               /* RWDLEN2 = 0 */

   MCBSP_RCR2_RCOMPAND_MSB,               /* RCOMPAND = 0 */

   MCBSP_RCR2_RFIG_YES,                   /* RFIG   = 0 */

   MCBSP_RCR2_RDATDLY_1BIT               /* RDATDLY = 1 */

   ),

   MCBSP_XCR1_RMK(  

   MCBSP_XCR1_XFRLEN1_OF(1),             /* XFRLEN1 = 1 */

   MCBSP_XCR1_XWDLEN1_16BIT               /* XWDLEN1 = 2 */

  

),  

MCBSP_XCR2_RMK(  

   MCBSP_XCR2_XPHASE_SINGLE,             /* XPHASE = 0 */

   MCBSP_XCR2_XFRLEN2_OF(0),             /* XFRLEN2 = 0 */

   MCBSP_XCR2_XWDLEN2_8BIT,               /* XWDLEN2 = 0 */

   MCBSP_XCR2_XCOMPAND_MSB,               /* XCOMPAND = 0 */

   MCBSP_XCR2_XFIG_YES,                   /* XFIG   = 0 */

   MCBSP_XCR2_XDATDLY_1BIT               /* XDATDLY = 1 */

),          

MCBSP_SRGR1_DEFAULT,

MCBSP_SRGR2_DEFAULT,

MCBSP_MCR1_DEFAULT,

MCBSP_MCR2_DEFAULT,

MCBSP_PCR_RMK(

   MCBSP_PCR_IDLEEN_RESET,                 /* IDLEEN   = 0   */

   MCBSP_PCR_XIOEN_SP,                     /* XIOEN   = 0   */

   MCBSP_PCR_RIOEN_SP,                     /* RIOEN   = 0   */

   MCBSP_PCR_FSXM_EXTERNAL,               /* FSXM     = 0   */

   MCBSP_PCR_FSRM_EXTERNAL,               /* FSRM     = 0   */

   0,                                     /* DXSTAT = N/A   */

   MCBSP_PCR_CLKXM_INPUT,                 /* CLKXM   = 0   */

   MCBSP_PCR_CLKRM_INPUT,                 /* CLKRM   = 0   */

   MCBSP_PCR_SCLKME_NO,                   /* SCLKME   = 0   */

   MCBSP_PCR_FSXP_ACTIVEHIGH,             /* FSXP     = 0   */

   MCBSP_PCR_FSRP_ACTIVEHIGH,             /* FSRP     = 1   */

   MCBSP_PCR_CLKXP_FALLING,               /* CLKXP   = 1   */

   MCBSP_PCR_CLKRP_RISING                 /* CLKRP   = 1   */

),

MCBSP_RCERA_DEFAULT,

MCBSP_RCERB_DEFAULT,

MCBSP_RCERC_DEFAULT,

MCBSP_RCERD_DEFAULT,

MCBSP_RCERE_DEFAULT,

MCBSP_RCERF_DEFAULT,

MCBSP_RCERG_DEFAULT,

MCBSP_RCERH_DEFAULT,

MCBSP_XCERA_DEFAULT,

MCBSP_XCERB_DEFAULT,

MCBSP_XCERC_DEFAULT,

MCBSP_XCERD_DEFAULT,

MCBSP_XCERE_DEFAULT,

MCBSP_XCERF_DEFAULT,

MCBSP_XCERG_DEFAULT,

MCBSP_XCERH_DEFAULT

};    

 

/*******************************************************************************************/

/************************************DMA设置************************************************/

 

 

/* Create DMA Receive Side Configuration */

DMA_Config dmaRcvConfig = {

DMA_DMACSDP_RMK(

 

   DMA_DMACSDP_DSTBEN_NOBURST,   //Destination burst :-不使用突发

   DMA_DMACSDP_DSTPACK_OFF,       //Destination packing :-目标口禁止打包

   DMA_DMACSDP_DST_DARAM,         //Destination selection :-接收的目标口是DARAM

   DMA_DMACSDP_SRCBEN_NOBURST,   //Source burst :-源突发禁止

   DMA_DMACSDP_SRCPACK_OFF,       //Source packing :-源口禁止打包

   DMA_DMACSDP_SRC_PERIPH,       //Source selection :-外设mcbsp

   DMA_DMACSDP_DATATYPE_16BIT     //Data type :-设置数据类型16bit字长

 

),                               /* DMACSDP 源与目标参数寄存器 */

 

DMA_DMACCR_RMK(

 

   DMA_DMACCR_DSTAMODE_POSTINC,   //Destination address mode :-自动执行后增量(由于本程序中数据类型是16bit,所以+2)

   DMA_DMACCR_SRCAMODE_CONST,     //Source address mode :-源地址为恒定地址

   DMA_DMACCR_ENDPROG_ON,         //End of programmation bit :-

 

   DMA_DMACCR_REPEAT_ON,           //Repeat condition :-不管编程配置结束位,结束传输自动初始化开始

 

   //DMA_DMACCR_REPEAT_OFF,

   DMA_DMACCR_AUTOINIT_ON,         //Auto initialization bit :-

       //DMA_DMACCR_AUTOINIT_OFF,

   DMA_DMACCR_EN_STOP,             //Channel enable :-设置时先关闭通道

   DMA_DMACCR_PRIO_LOW,           //Channel priority :-设置为低优先级

   DMA_DMACCR_FS_ELEMENT,         //Frame/Element Sync :-单元事件同步

       //DMA_DMACCR_FS_DISABLE,

   DMA_DMACCR_SYNC_REVT0          //Synchronization control :-McBSP1 Receive Event(REVT1)

 

),                                       /* DMACCR 通道控制寄存器 */

 

DMA_DMACICR_RMK(

 

   DMA_DMACICR_BLOCKIE_ON,       //Whole block interrupt enable :-块传输完成后中断使能

   //DMA_DMACICR_BLOCKIE_OFF,

   DMA_DMACICR_LASTIE_OFF,       //Last frame interrupt enable :-

   DMA_DMACICR_FRAMEIE_OFF,     //Whole frame interrupt enable :-

       //DMA_DMACICR_FRAMEIE_ON,

   DMA_DMACICR_FIRSTHALFIE_OFF, //Half frame interrupt enable :-

   DMA_DMACICR_DROPIE_OFF,       //Sync. event drop interrupt enable :-

   DMA_DMACICR_TIMEOUTIE_OFF     //Time out interrupt enable :-

 

),                                       /* DMACICR 中断控制寄存器 */

 

   (DMA_AdrPtr)(MCBSP_ADDR(DRR10)),       /* DMACSSAL 源地址低位 */

   0,                                     /* DMACSSAU 源地址高位*/

   (DMA_AdrPtr)&rcv,                 /* DMACDSAL 目的地址低位*/

   0,                                     /* DMACDSAU 目的地址高位*/

   2,                                     /* DMACEN   1 帧内数据长度 16*2 两个数据一个帧*/

   N/2,                                   /* DMACFN 帧数大小 */

   0,                                     /* DMACFI */

   0                                     /* DMACEI */

 

};

 

/* Create DMA Transmit Side Configuration */

DMA_Config dmaXmtConfig = {

DMA_DMACSDP_RMK(

 

   DMA_DMACSDP_DSTBEN_NOBURST,   //Destination burst :-不使用突发

   DMA_DMACSDP_DSTPACK_OFF,       //Destination packing :-目标口禁止打包

   DMA_DMACSDP_DST_PERIPH,       //Destination selection :-接收的目标口是外设mcbsp

   DMA_DMACSDP_SRCBEN_NOBURST,   //Source burst :-源突发禁止

   DMA_DMACSDP_SRCPACK_OFF,       //Source packing :-源口禁止打包

   DMA_DMACSDP_SRC_DARAM,         //Source selection :源口为DARAM

   DMA_DMACSDP_DATATYPE_16BIT     //Data type :-设置数据类型16bit字长

 

),                                      /* DMACSDP 源与目标参数寄存器 */

 

DMA_DMACCR_RMK(

 

   DMA_DMACCR_DSTAMODE_CONST,   //Destination address mode :-目标口地址为恒定地址

   DMA_DMACCR_SRCAMODE_POSTINC, //Source address mode :-自动执行后增量(由于本程序中数据类型是16bit,所以+2)

   DMA_DMACCR_ENDPROG_ON,       //End of programmation bit :-

 

   DMA_DMACCR_REPEAT_ON,         //Repeat condition :-不管编程配置结束位,结束传输自动初始化开始

 

   //DMA_DMACCR_REPEAT_OFF,

   DMA_DMACCR_AUTOINIT_ON,       //Auto initialization bit :-

   //DMA_DMACCR_AUTOINIT_OFF,

   DMA_DMACCR_EN_STOP,           //Channel enable :-设置时先关闭通道

   DMA_DMACCR_PRIO_LOW,         //Channel priority :-设置为低优先级

   DMA_DMACCR_FS_ELEMENT,       //Frame/Element Sync :-单元事件同步

       //DMA_DMACCR_FS_DISABLE,

   DMA_DMACCR_SYNC_XEVT0        //Synchronization control :-McBSP1 Transmit Event(XEVT1)

),                                       /* DMACCR 通道控制寄存器   */

 

DMA_DMACICR_RMK(

 

   DMA_DMACICR_BLOCKIE_ON,       //Whole block interrupt enable :-块传输完成后中断使能

   //DMA_DMACICR_BLOCKIE_OFF,

   DMA_DMACICR_LASTIE_OFF,       //Last frame interrupt enable :-

   DMA_DMACICR_FRAMEIE_OFF,       //Whole frame interrupt enable :-

   //DMA_DMACICR_FRAMEIE_ON,

   DMA_DMACICR_FIRSTHALFIE_OFF, //Half frame interrupt enable :-

   DMA_DMACICR_DROPIE_OFF,       //Sync. event drop interrupt enable :-

   DMA_DMACICR_TIMEOUTIE_OFF     //Time out interrupt enable :-

 

),                                       /* DMACICR 中断控制寄存器 */

 

   (DMA_AdrPtr)&xmt[0],               /* DMACSSAL 源地址低位*/

   0,                                     /* DMACSSAU 源地址高位 */

   (DMA_AdrPtr)(MCBSP_ADDR(DXR10)),       /* DMACDSAL 目的地址低位*/

   0,                                     /* DMACDSAU 目的地址高位*/

   2,                                     /* DMACEN   1 帧内数据长度 16*2 两个数据一个帧*/

   N/2,                                   /* DMACFN 帧数大小 */

   0,                                     /* DMACFI   */

   0                                     /* DMACEI   */

 

};

 

 

/* Define a DMA_Handle object to be used with DMA_open function */

DMA_Handle hDmaRcv, hDmaXmt;

 

/* Define a MCBSP_Handle object to be used with MCBSP_open function */

MCBSP_Handle hMcbsp;

 

volatile Uint16 transferComplete = FALSE;

Uint16 err = 0;

Uint16 old_intm;

Uint16 xmtEventId, rcvEventId;

 

//———Function prototypes———

/* Reference start of interrupt vector table   */

/* This symbol is defined in file, vectors.s55 */

extern void VECSTART(void);

 

/* Protoype for interrupt functions */

interrupt void dmaXmtIsr(void);

interrupt void dmaRcvIsr(void);

void taskFxn(void);

 

 

 

/*******************************************************************************************/

/***********************************I2C的设置和AIC的设置************************************/

 

 

 

/* This next struct shows how to use the I2C API */

/* Create and initialize an I2C initialization structure */

I2C_Setup I2Cinit = {

       0,             /* 7 bit address mode */

       0,         /* own address – don't care if master */

       144,           /* clkout value (Mhz) */

       50,           /* a number between 10 and 400*/

       0,             /* number of bits/byte to be received or transmitted (8)*/

       0,             /* DLB mode on*/

       1               /* FREE mode of operation on*/

};

 

 

/*数字音频接口格式设置

AIC23为主模式,数据为DSP模式,数据长度16位*/  

Uint16 digital_audio_inteface_format[2]={0x0e,0x53};

/*AIC23的波特率设置,采样率为44.1K*/

Uint16 sample_rate_control[2] = {0x10,0x23};

/*AIC23寄存器复位*/

Uint16 reset[2] ={0x1e,0x00};

/*AIC23节电方式设置,所有部分均所与工作状态*/

Uint16 power_down_control[2] ={0x0c,0x00};

 

/*AIC23模拟音频的控制

DAC使能,ADC输入选择为mic*/

Uint16 analog_aduio_path_control[2] ={0x08,0x10};

//Uint16 analog_aduio_path_control[2] ={0x08,0x15};//MIC IN 有增益

//Uint16 analog_aduio_path_control[2] ={0x08,0x14};//MIC IN 无增益

//Uint16 analog_aduio_path_control[2] ={0x08,0x10};//Line IN

 

/*AIC23数字音频通路的控制*/

Uint16 digital_audio_path_control[2] ={0x0a,0x05};

/*AIC23数字接口的使能*/

Uint16 digital_interface_activation[2] ={0x12,0x01};

/*AIC23左通路音频调节*/

Uint16 left_line_input_volume_control[2] ={0x00,0x17};

/*AIC23右通路音频调节*/

Uint16 right_line_input_volume_control[2] ={0x02,0x17};

/*AIC23耳机左通路音频调节*/

Uint16 left_headphone_volume_control[2] ={0x05,0xFF};

/*AIC23耳机右通路音频调节*/

Uint16 right_headphone_volume_control[2] = {0x07,0xFF};

 

 

 

/*******************************************************************************************/

/*******************************************************************************************/

 

 

 

void delay(Uint32 k)

{

   while(k–);

}

 

 

 

/*******************************************************************************************/

/*******************************************************************************************/

 

 

 

void CODEC(void)

{

   //printf ("%s\n","CODEC");

       /*I2C is undet reset*/

       I2C_RSET(I2CMDR,0);

       /*设置预分频寄存器,I2C的mode clock is 10MHz*/

       delay(100);

       I2C_RSET(I2CSAR,0x001A);

       I2C_RSET(I2CMDR,0x0620); 

   I2C_setup(&I2Cinit);

    /*设置I2C的Mater clock*/

       I2C_RSET(I2CCLKL,100);

       I2C_RSET(I2CCLKH,100);

 

 

 

   /*reset AIC23*/

   i2c_status = I2C_write( reset,         //pointer to data array

                                2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                 1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                   );

       delay(1000);

   /*设置AIC23各部分均工作*/

   i2c_status = I2C_write( power_down_control,//pointer to data array

                                2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                   );          

       /*设置AIC23的数字接口*/

       i2c_status = I2C_write( digital_audio_inteface_format,//pointer to data array

                                2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                  );

       /*设置AIC23模拟通路*/

       i2c_status = I2C_write( analog_aduio_path_control,//pointer to data array

                                2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                   );

       /*设置数字通路*/

       i2c_status = I2C_write( digital_audio_path_control,//pointer to data array

                                2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                  );       

       /*设置AIC23的采样率*/

       i2c_status = I2C_write( sample_rate_control,//pointer to data array

                                2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                );

       /*设置耳机音量*/

       i2c_status = I2C_write( left_headphone_volume_control,//pointer to data array

                                 2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                );

       i2c_status = I2C_write( right_headphone_volume_control,//pointer to data array

                                2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                );

       /*设置Line输入的音量*/

       i2c_status = I2C_write( left_line_input_volume_control,//pointer to data array

                                2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                );

       i2c_status = I2C_write( right_line_input_volume_control,//pointer to data array

                                2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                );

       /*启动AIC23*/

       i2c_status = I2C_write( digital_interface_activation,//pointer to data array

                                2,                         //length of data to be transmitted

                                1,                         //master or slaver

                                CODEC_ADDR,         //slave address to transmit to

                                1,                         //transfer mode of operation

                                30000                   //time out for bus busy

                                );

}

 

 

int ShiftArray(int *Sx,int lastx)

{

   int i;

   for(i=n-1;i>0;i–)

       {

          Sx[i]=Sx[i-1];

       }

          Sx[0]=lastx;

          return(0);

}

 

int dotProd(int *Firx,int *Firh)

{

   int i;

   int sum=0;

   for(i=0;i<n;i++)

   {

     sum+=(Firx[i]*Firh[i]);

   }

       return(sum);

}

 

int fxlms(int *xx,int *XX,int ee)

{

   int yy;

   int i;

   long temp;

   ShiftArray(en,e);

   e=dotProd(en,H3);

   x=e-d;

   ShiftArray(xn,x);

   X=dotProd(xn,H3);

   ShiftArray(Xn,X);

   for(i=0;i<n;i++)

   {

     temp=(long)(XX[i]*ee*u);

       wn[i]=wn[i]+(temp)>>(15);

       }

   for(i=0;i<n;i++)

   {

       yy+=xx[i]*wn[i];

   }

   return(yy);

}

//———main routine———

void main(void)

{

   Uint16 i;

   for(i=n-1;i>0;i–)

       {

       wn[i]=0;

       xn[i]=0;

       yn[i]=0;

       en[i]=0;

       }

   /* Initialize CSL library – This is REQUIRED !!! */

   CSL_init();

   /* Set IVPD/IVPH to start of interrupt vector table */

   IRQ_setVecs((Uint32)(&VECSTART));

       PLL_config(&myConfig);

 

   /* Call function to effect transfer */

       CODEC();

   taskFxn();

      

}

 

void taskFxn(void)

{

   Uint16 srcAddrHi, srcAddrLo;

   Uint16 dstAddrHi, dstAddrLo;

   Uint16 i;

   /* By default, the TMS320C55xx compiler assigns all data symbols word */

   /* addresses. The DMA however, expects all addresses to be byte       */

   /* addresses. Therefore, we must shift the address by 2 in order to   */

   /* change the word address to a byte address for the DMA transfer.   */

   srcAddrHi = (Uint16)(((Uint32)(MCBSP_ADDR(DRR10))) >> 15) & 0xFFFFu;

   srcAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DRR10))) << 1) & 0xFFFFu;

   dstAddrHi = (Uint16)(((Uint32)(&rcv)) >> 15) & 0xFFFFu;

   dstAddrLo = (Uint16)(((Uint32)(&rcv)) << 1) & 0xFFFFu;

 

   dmaRcvConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;

   dmaRcvConfig.dmacssau = srcAddrHi;

   dmaRcvConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;

   dmaRcvConfig.dmacdsau = dstAddrHi;

 

   srcAddrHi = (Uint16)(((Uint32)(&xmt[0])) >> 15) & 0xFFFFu;

   srcAddrLo = (Uint16)(((Uint32)(&xmt[0])) << 1) & 0xFFFFu;

   dstAddrHi = (Uint16)(((Uint32)(MCBSP_ADDR(DXR10))) >> 15) & 0xFFFFu;

   dstAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DXR10))) << 1) & 0xFFFFu;

 

   dmaXmtConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;

   dmaXmtConfig.dmacssau = srcAddrHi;

   dmaXmtConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;

   dmaXmtConfig.dmacdsau = dstAddrHi;

 

   /* Open MCBSP Port 1 and set registers to their power on defaults */

   hMcbsp = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);

 

   /* Open DMA channels 4 & 5 and set regs to power on defaults */

   hDmaRcv = DMA_open(DMA_CHA4,DMA_OPEN_RESET);

   hDmaXmt = DMA_open(DMA_CHA5,DMA_OPEN_RESET);

 

   /* Get interrupt event associated with DMA receive and transmit */

   xmtEventId = DMA_getEventId(hDmaXmt);

   rcvEventId = DMA_getEventId(hDmaRcv);

  

   /* Temporarily disable interrupts and clear any pending */

   /* interrupts for MCBSP transmit */

   old_intm = IRQ_globalDisable();

  

   /* Clear any pending interrupts for DMA channels */

   IRQ_clear(xmtEventId);

   IRQ_clear(rcvEventId);

 

   /* Enable DMA interrupt in IER register */

   IRQ_enable(xmtEventId);

   IRQ_enable(rcvEventId);

 

   /* Set Start Of Interrupt Vector Table */

   IRQ_setVecs(0x10000);

  

   /* Place DMA interrupt service addresses at associate vector */

   IRQ_plug(xmtEventId,&dmaXmtIsr);

   IRQ_plug(rcvEventId,&dmaRcvIsr);

 

   /* Write values from configuration structure to MCBSP control regs */

   MCBSP_config(hMcbsp, &ConfigLoopBack16);

  

   /* Write values from configuration structure to DMA control regs */

   DMA_config(hDmaRcv,&dmaRcvConfig);

   DMA_config(hDmaXmt,&dmaXmtConfig);

 

#if 0

   /* Take MCBSP transmit and receive out of reset */

   MCBSP_start(hMcbsp,

               MCBSP_XMIT_START | MCBSP_RCV_START,

               0u);

   /* Prime MCBSP DXR */

   while (!(MCBSP_xrdy(hMcbsp))){

     ;

   }

   MCBSP_write16(hMcbsp,xmt[0]);

  

   /* Enable all maskable interrupts */

   IRQ_globalEnable();

  

   /* Enable DMA */

   DMA_start(hDmaRcv);

   DMA_start(hDmaXmt);

      

   /* Start Sample Rate Generator and Enable Frame Sync */

   MCBSP_start(hMcbsp,

               MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,

               0x300u);

       printf ("%s\n""IF");

#else

       /* Enable all maskable interrupts */

   IRQ_globalEnable();

  

   /* Start Sample Rate Generator and Enable Frame Sync */

   MCBSP_start(hMcbsp,

               MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,

               0x300u);

              

   /* Enable DMA */

   DMA_start(hDmaRcv);

   DMA_start(hDmaXmt);

  

   /* Take MCBSP transmit and receive out of reset */

   MCBSP_start(hMcbsp,

               MCBSP_XMIT_START | MCBSP_RCV_START,

               0u);

       printf ("%s\n","ELSE");

#endif

 

 

   //while(DMA_FGETH(hDmaRcv, DMACCR, ENDPROG));

   /* Wait for DMA transfer to be complete */

   //DMA_FSETH(hDmaRcv, DMACCR, ENDPROG,1);

   //DMA_FSETH(hDmaXmt, DMACCR, ENDPROG,1);

   //printf ("%s\n","AGAIN");

 

 

 

 

 

 

       //while(DMA_FGETH(hDmaRcv, DMACCR, ENDPROG)); 

       //DMA_FSETH(hDmaRcv, DMACCR, ENDPROG,1);

   //DMA_FSETH(hDmaXmt, DMACCR, ENDPROG,1);

       //printf ("%s\n",err?"TEST FAILED" : "TEST PASSED");

 

 

   /* Restore status of global interrupt enable flag */

   //IRQ_globalRestore(old_intm);

      

   /* We're done with MCBSP and DMA , so close them */

   //MCBSP_close(hMcbsp);

   //DMA_close(hDmaRcv);

   //DMA_close(hDmaXmt);                    

}

 

interrupt void dmaXmtIsr(void) {

   Uint16 i;

   //DMA_stop(hDmaXmt);

   //IRQ_disable(xmtEventId);

   //printf ("%s\n","dmaXmtIsr");

   //DMA_start(hDmaRcv);

   //DMA_start(hDmaXmt);

   TestflagT++;

 

}

 

interrupt void dmaRcvIsr(void) {

   //DMA_stop(hDmaRcv);

   //IRQ_disable(rcvEventId);

  

   //printf ("%s\n","dmaRcvIsr");

//   Uint16 i;

   //DMA_start(hDmaRcv);

   //DMA_start(hDmaXmt);

//   for(i = 0; i <= N – 1; i++)

//   {

//       xmt[i]=rcv[i];

//   }

   //DMA_start(hDmaRcv);

       int i;

       for(i = 0; i < N; i++)

       {

       e=rcv[i];

       y=fxlms(xn,Xn,e);

       xmt[i]=y;

     ShiftArray(yn,y);

       d=dotProd(yn,H3)+e;

       }

   DMA_start(hDmaXmt);

   TestflagR++;

}  

Shine:

先看一下不用DMA方式,McBSP+AIC23能正确播放声音吗?

user5321810:

回复 Shine:

没加数据处理程序以及没配置DMA的时候,我利用code程序配置了MCBSP和AIC23进行过音频的接收和播放,是没有问题的。只是音量比较低而已。现在利用DMA配置中断加入处理程序,输出的声音并不是处理后的声音

Shine:

回复 user5321810:

调试的时候建议功能一个个往上加,这样可以排除是哪块引起的,接下来调通mcbsp+AIC23+DMA或mcbsp+AIC23+处理程序,最后调mcbsp+AIC23+DMA+处理程序。

user5321810:

回复 Shine:

我想问一下如果不采用DMA模式的话,直接用mcbsp+aic23+音频处理程序的话,我的数据处理程序怎么获取mcbsp接收到的数据?或者说我如何让mcbsp接收到的数据将其存在一个数组中,然后进行处理?

赞(0)
未经允许不得转载:TI中文支持网 » DMA实现数据处理,实现声音采集,声音处理,及播放
分享到: 更多 (0)