This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

aic23B音频频谱

为什么采样到DMA哪里只能接收一次,为什么中断,什么的都没有触发它中断??进行的FFT运算也不可以??求解,,困惑好久了

/******************************************************************************/
/*  Copyright 2004 by SEED Electronic Technology LTD.                         */
/*  All rights reserved. SEED Electronic Technology LTD.                      */
/*  Restricted rights to use, duplicate or disclose this code are             */
/*  granted through contract.                                                 */
/*                                                                            */
/*  MODULE NAME... IIC and Mcbsp  */
/*  FILENAME...... 5502_CODEC.c    */
/*  DESCRIPTION:    */
/*  This is an audio signal sample and play example for CODEC of C5502  */
/*  This example is that the codec is controled by the IIC and Mcbsp  */
/*                                                                            */
/******************************************************************************/
#include <csl.h>
#include <csl_chip.h>
#include <csl_i2c.h>
#include <csl_pll.h>
#include <csl_mcbsp.h>
#include <csl_emif.h>
#include <csl_emifBhal.h>
#include <csl_std.h>
#include <csl_dma.h>
#include <csl_irq.h>
#include "E2PROM_Function.h"
#include "CODEC.h"
#include "i_cmplx.h"
#include <math.h>
#undef  CODEC_ADDR
#define CODEC_ADDR 0x1A
#define  AUDIOTRY      0xAA0A//音频试听
#define  AUDIOCOPY     0xAA07//音频存贮并回放
#define TESTCOMMAND     1    //操作命令选择 
short DataBuffer[1024]={0};
COMPLEX DDataBuffer[512*2]={0};  
Uint32 mod[512*2];
int i; 
unsigned int m=0;    
long n;    
short p,q;
/* Constants for the buffered ping-pong transfer */ 
#define BUFFSIZE          512 
#define PING              0 
#define PONG              1
//#define SCALE             1
/* Data buffer declarations - the program uses four logical buffers of size  * BUFFSIZE, one ping and one pong buffer on both receive and transmit sides.  */ 
#pragma DATA_SECTION (gBufferXmtPing, "buffer_sect"); 
Uint32 gBufferXmtPing[BUFFSIZE/2];  // Transmit PING buffer
 #pragma DATA_SECTION (gBufferXmtPong, "buffer_sect"); 
Uint32 gBufferXmtPong[BUFFSIZE/2];  // Transmit PONG buffer
 #pragma DATA_SECTION (gBufferRcvPing, "buffer_sect"); 
Int16 gBufferRcvPing[BUFFSIZE];  // Receive PING buffer
 
#pragma DATA_SECTION (gBufferRcvPong, "buffer_sect"); 
Int16 gBufferRcvPong[BUFFSIZE];  // Receive PONG buffer 
 
#pragma DATA_SECTION (gBufferRcvPingleft, "buffer_sect"); 
Int16 gBufferRcvPingleft[BUFFSIZE/2];  // Receive PING buffer 
#pragma DATA_SECTION (gBufferRcvPongleft, "buffer_sect");
Int16 gBufferRcvPongleft[BUFFSIZE/2];  // Receive PONG buffer
#pragma DATA_SECTION (gBufferRcvPingright, "buffer_sect");
Int16 gBufferRcvPingright[BUFFSIZE/2];  // Receive PING buffer
 #pragma DATA_SECTION (gBufferRcvPongright, "buffer_sect"); 
Int16 gBufferRcvPongright[BUFFSIZE/2];  // Receive PONG buffer
MCBSP_Config Mcbsp1Config = {  
0x2080,
/* MCBSP_SPCR1_RMK(        
    MCBSP_SPCR1_DLB_OFF,    // DLB    = 0  
    MCBSP_SPCR1_RJUST_LZF,          // RJUST  = 0,right justify the data and zero fill the MSBs 
    MCBSP_SPCR1_CLKSTP_DISABLE,     // CLKSTP = 0  
    MCBSP_SPCR1_DXENA_ON,           // DXENA  = 1,DX delay enabler on     
    0,                                  // Reserved   = 0  
    MCBSP_SPCR1_RINTM_RRDY,         // RINTM  = 0      
    MCBSP_SPCR1_RSYNCERR_NO,        // RSYNCER = 0 
    MCBSP_SPCR1_RFULL_NO,           // RFULL = 0  
    MCBSP_SPCR1_RRDY_NO,            // RRDY = 0       
    MCBSP_SPCR1_RRST_DISABLE     // RRST   = 0; Disable receiver  
   ),*/
   0x00c4,
/* MCBSP_SPCR2_RMK(   
   MCBSP_SPCR2_FREE_NO,            // FREE   = 0     
   MCBSP_SPCR2_SOFT_NO,            // SOFT   = 0  
   MCBSP_SPCR2_FRST_FSG,          // FRST   = 1  Enable the frame-sync logic     
   MCBSP_SPCR2_GRST_CLKG,// GRST   = 1 The sample rate generator is take out of its reset state
   MCBSP_SPCR2_XINTM_XRDY,         // XINTM  = 0    
   MCBSP_SPCR2_XSYNCERR_NO,        // XSYNCER =0   //   
   MCBSP_SPCR2_XEMPTY_NO,          // XEMPTY = 0  
   MCBSP_SPCR2_XRDY_NO,            // XRDY   = 0                  
   MCBSP_SPCR2_XRST_DISABLE      // XRST   = 0 Disable transimitter  
   ),*/
  // 单数据相,接受数据长度为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 No companding,any size data, MSB received first  
    MCBSP_RCR2_RFIG_YES,      // RFIG    = 1 Frame-sync ignore  
    MCBSP_RCR2_RDATDLY_1BIT    // RDATDLY = 1 1-bit data delay    
  ),
 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    = 1 Unexpected Frame-sync ignore     
    MCBSP_XCR2_XDATDLY_1BIT         // XDATDLY = 1 1-bit data delay    
  ),              
 MCBSP_SRGR1_DEFAULT,  
 MCBSP_SRGR2_DEFAULT,   
 MCBSP_MCR1_DEFAULT, 
 MCBSP_MCR2_DEFAULT,  
 0X0007,
/* 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 Tranmit frame-syn is provided by AIC23B  
   MCBSP_PCR_FSRM_EXTERNAL,         // FSRM     = 0 Receive frame-syn is provided by AIC23B  
   MCBSP_PCR_CLKXM_INPUT,    // CLKR is input  
   MCBSP_PCR_CLKRM_INPUT,           // CLKX is input  
   MCBSP_PCR_SCLKME_NO,      // SCLKME=0 CLKG is taken from the McBSP internal input clock  
    //  MCBSP_PCR_CLKSSTAT_0,            // The signal on the CLKS pin is low      
   MCBSP_PCR_DXSTAT_0,              // Drive the signal on the DX pin low  
 // MCBSP_PCR_DRSTAT_0,              // The signal on the DR pin is low     
   MCBSP_PCR_FSXP_ACTIVEHIGH,    // FSXP  = 1 Because a falling edge on LRCIN or LRCOUT starts data transfer   
   MCBSP_PCR_FSRP_ACTIVELOW,        // FSRP     = 1    
   MCBSP_PCR_CLKXP_FALLING,       // CLKXP    = 1   The falling edge of BCLK starts data transfer 
   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_Config  dmaRcvConfig = { 
DMA_DMACSDP_RMK(                   //源和目的参数寄存器
 DMA_DMACSDP_DSTBEN_NOBURST,    
 DMA_DMACSDP_DSTPACK_OFF,             //对数据进行打包
 DMA_DMACSDP_DST_DARAMPORT1,         //目的地址是内存端口1
 DMA_DMACSDP_SRCBEN_NOBURST,    
 DMA_DMACSDP_SRCPACK_OFF,     
 DMA_DMACSDP_SRC_PERIPH,       //源地址是外设
 DMA_DMACSDP_DATATYPE_16BIT 
  ),                                       /* DMACSDP  */  
 DMA_DMACCR_RMK(                   //通道控制寄存器
 DMA_DMACCR_DSTAMODE_POSTINC,     
 DMA_DMACCR_SRCAMODE_CONST,    
 DMA_DMACCR_ENDPROG_OFF,    /* ENDPROG OFF */ 
 DMA_DMACCR_WP_DEFAULT,    
 DMA_DMACCR_REPEAT_OFF,   
 DMA_DMACCR_AUTOINIT_ON,    /* AUTOINIT ON */ 
 DMA_DMACCR_EN_STOP,     
 DMA_DMACCR_PRIO_LOW,    
 DMA_DMACCR_FS_DISABLE,    
 DMA_DMACCR_SYNC_REVT1 
  ),                                       /* DMACCR   */   
DMA_DMACICR_RMK(               //中断控制寄存器
 DMA_DMACICR_AERRIE_ON,    
 DMA_DMACICR_BLOCKIE_OFF,    
 DMA_DMACICR_LASTIE_OFF,    
 DMA_DMACICR_FRAMEIE_ON,    
 DMA_DMACICR_FIRSTHALFIE_OFF,    
 DMA_DMACICR_DROPIE_OFF,    
 DMA_DMACICR_TIMEOUTIE_OFF 
  ),                                       /* DMACICR  */     
(DMA_AdrPtr)(MCBSP_ADDR(DRR11)),       /* DMACSSAL */    
 0,                                     /* DMACSSAU */  
 NULL,              /* DMACDSAL, to be loaded by submit  */
 0,                                     /* DMACDSAU */   
 BUFFSIZE,                              /* DMACEN   */    
 1,                                     /* DMACFN   */     
 0,                                     /* DMACFI   */    
 0                                      /* DMACEI   */
};  
DMA_Config  dmaXmtConfig = {   
 DMA_DMACSDP_RMK(                      //源和目的参数寄存器
 DMA_DMACSDP_DSTBEN_NOBURST,    
 DMA_DMACSDP_DSTPACK_OFF,    
 DMA_DMACSDP_DST_PERIPH,                 //目的地址是外设
 DMA_DMACSDP_SRCBEN_NOBURST,   
 DMA_DMACSDP_SRCPACK_OFF,   
 DMA_DMACSDP_SRC_DARAMPORT0,            //源地址是内存端口0
 DMA_DMACSDP_DATATYPE_16BIT 
  ),                                       /* DMACSDP  */   
DMA_DMACCR_RMK(                         //通道控制寄存器
 DMA_DMACCR_DSTAMODE_CONST,             //固定
 DMA_DMACCR_SRCAMODE_POSTINC,   
 DMA_DMACCR_ENDPROG_ON,    
 DMA_DMACCR_WP_DEFAULT,   
 DMA_DMACCR_REPEAT_OFF,     
 DMA_DMACCR_AUTOINIT_OFF,    
 DMA_DMACCR_EN_STOP,    
 DMA_DMACCR_PRIO_LOW,    
 DMA_DMACCR_FS_DISABLE,    
 DMA_DMACCR_SYNC_XEVT1 
  ),                                       /* DMACCR   */   
DMA_DMACICR_RMK(                       //通道中断寄存器
 DMA_DMACICR_AERRIE_ON,   
 DMA_DMACICR_BLOCKIE_OFF,     
 DMA_DMACICR_LASTIE_OFF,     
 DMA_DMACICR_FRAMEIE_ON,    
 DMA_DMACICR_FIRSTHALFIE_OFF,    
 DMA_DMACICR_DROPIE_OFF,    
 DMA_DMACICR_TIMEOUTIE_OFF 
  ),                                       /* DMACICR  */ 
 NULL,                                  /* DMACDSAL, to be loaded by submit  */ 
 0,                                     /* DMACSSAU */     
 (DMA_AdrPtr)(MCBSP_ADDR(DXR11)),       /* DMACDSAL */    
 0,                                     /* DMACDSAU */     
 BUFFSIZE,                              /* DMACEN   */    
 1,                                     /* 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的句柄
MCBSP_Handle hMcbsp;
//volatile Uint16 transferComplete = FALSE; 
//Uint16 err = 0;
Uint16 old_intm; 
Uint16 xmtEventId, rcvEventId;
/* This symbol is defined in file vectors.s55        */ 
extern void VECSTART(void);
void copyData(unsigned long *inbuf, unsigned long *outbuf, Int16 length);
/* Protoype for interrupt functions */
interrupt void dmaXmtIsr(void); 
interrupt void dmaRcvIsr(void);
void taskFxn(void);
void copyData(unsigned long *inbuf, unsigned long *outbuf, Int16 length) 
    Int16 i = 0;       
  // rfft(inbuf,length,SCALE);   
 for (i = 0; i < length; i++)
    {         
outbuf[i]  = inbuf[i];     
}
}
void processBuffer(void)   //缓冲数据的处理
    Uint32 addr;
    //Int16 DataTemp;
    static Int16 pingPong = PING;   
while(DMA_FGETH (hDmaRcv, DMACCR, ENDPROG))
     }  
    // Determine which ping-pong state we're in     
if (pingPong == PING)    
  { 
        // Configure the receive channel for pong input data        
  addr = ((Uint32)gBufferRcvPong) << 1;         
DMA_RSETH(hDmaRcv, DMACDSAL, addr & 0xffff);        
  DMA_RSETH(hDmaRcv, DMACDSAU, (addr >> 16) & 0xffff);   // Set new state to PONG 
      pingPong = PONG;    
      }    
  else    
  { 
        // Configure the receive channel for ping input data      
  addr = ((Uint32)gBufferRcvPing) << 1;        
  DMA_RSETH(hDmaRcv, DMACDSAL, addr & 0xffff);        
  DMA_RSETH(hDmaRcv, DMACDSAU, (addr >> 16) & 0xffff);   // Set new state to PING  
  pingPong = PING;     
}
DMA_FSETH (hDmaRcv, DMACCR, ENDPROG, 1); 
// DMA_FSETH (hDmaXmt, DMACCR, ENDPROG, 1);   
    if (pingPong == PONG)    
  {  
//Insert your application program here 
       // copyData(gBufferRcvPing, gBufferXmtPing, BUFFSIZE); 
for(i=0;i<(BUFFSIZE/2);i++)   
{  
gBufferRcvPingleft[i]=gBufferRcvPing[2*i];    
gBufferRcvPingright[i]=gBufferRcvPing[2*i+1]; 
  } 
for(i=0;i<(BUFFSIZE/2/2);i++)  
DDataBuffer[i].real=gBufferRcvPingleft[2*i];  //short int      
DDataBuffer[i].imag=gBufferRcvPingleft[2*i+1];  //short int 
    fft256(DDataBuffer,256);    
m=0;     
for(i=0;i<128;i++)
      {   
             p=DDataBuffer[i].real;     //    实部     
q=DDataBuffer[i].imag;      //虚部
             n=(long)p*(long)p+(long)q*(long)q;             
  mod[m]=sqrt(n);  //幅度谱
             m++;                            
         }
for(i=0;i<BUFFSIZE/2/2;i++)  
  {    //gBufferXmtPing[i]=-(gBufferXmtPing[i]<<16);    
gBufferXmtPing[i]=-(mod[i]<<16); 
  } 
for(i=0;i<(BUFFSIZE/2/2);i++) 
  { 
DDataBuffer[i].real=gBufferRcvPingright[2*i];  //short int     
DDataBuffer[i].imag=gBufferRcvPingright[2*i+1];  //short int 
}
fft256(DDataBuffer,256); 
m=0; 
for(i=0;i<128;i++)      
{   
             p=DDataBuffer[i].real;              
q=DDataBuffer[i].imag;      
             n=(long)p*(long)p+(long)q*(long)q;              
mod[m]=sqrt(n);  
             m++;                            
         }
for(i=0;i<BUFFSIZE/2/2;i++)   
{    //gBufferXmtPing[i]=-(gBufferXmtPing[i]<<16);    
gBufferXmtPing[i+BUFFSIZE/2/2]=-(mod[i]<<16);   
}
addr = ((Uint32)gBufferXmtPing) << 1;        
  DMA_RSETH(hDmaXmt, DMACSSAL, addr & 0xffff);        
DMA_RSETH(hDmaXmt, DMACSSAU, (addr >> 16) & 0xffff);       
  }
else     
{
for(i=0;i<(BUFFSIZE/2);i++)  
    {   
 
    gBufferRcvPongleft[i]=gBufferRcvPong[2*i];    
gBufferRcvPongright[i]=gBufferRcvPong[2*i+1]; 
    } 
for(i=0;i<(BUFFSIZE/2/2);i++)   
{  
DDataBuffer[i].real=gBufferRcvPongleft[2*i];  //short int      
DDataBuffer[i].imag=gBufferRcvPongleft[2*i+1];  //short int   
    fft256(DDataBuffer,256);  
m=0; 
        for(i=0;i<128;i++) 
{   
             p=DDataBuffer[i].real;              
q=DDataBuffer[i].imag;      
             n=(long)p*(long)p+(long)q*(long)q;             
  mod[m]=sqrt(n);  
             m++;                            
        } 
for(i=0;i<BUFFSIZE/2/2;i++) 
  {    //gBufferXmtPing[i]=-(gBufferXmtPing[i]<<16);    
gBufferXmtPong[i]=-(mod[i]<<16); 
  }
for(i=0;i<(BUFFSIZE/2/2);i++)    
{
  DDataBuffer[i].real=gBufferRcvPongright[2*i];  //short int        
DDataBuffer[i].imag=gBufferRcvPongright[2*i+1];  //short int 
}
fft256(DDataBuffer,256);  
m=0; 
  for(i=0;i<128;i++)      
  {   
             p=DDataBuffer[i].real;              
q=DDataBuffer[i].imag;      
             n=(long)p*(long)p+(long)q*(long)q;             
mod[m]=sqrt(n);  
m++;
  }
for(i=0;i<BUFFSIZE/2/2;i++)  
  {    //gBufferXmtPing[i]=-(gBufferXmtPing[i]<<16);    
gBufferXmtPong[i+BUFFSIZE/2/2]=-(mod[i]<<16); 
}
addr = ((Uint32)gBufferXmtPong) << 1;         
DMA_RSETH(hDmaXmt, DMACSSAL, addr & 0xffff);         
DMA_RSETH(hDmaXmt, DMACSSAU, (addr >> 16) & 0xffff);  
}
/*------------------------------------------------------------------------------------*/
//
// FUNCTION: MAIN
//
/*------------------------------------------------------------------------------------*/
                  
void main(void) 
Uint16 i;
   /* Uint16  DataTempLeft = 0; // 暂存采样数据
    Uint16  DataTempRight = 0;
Uint16  TestCommand =0;
Int16  DataTemp;
CSL_init(); 
#if TESTCOMMAND==1
TestCommand =AUDIOTRY;//试听
#endif */
// The main frequency of system is 240MHz 
// 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数   12*20=240  
PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0);  
    //EMIF初始化    
    Emif_Config();
// Open McBSP port 1 and get a McBSP type handle 打开通道1 
hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET); 
 
// Config McBSP port 1 by use previously defined structure  MCBSP初始化
MCBSP_config(hMcbsp, &Mcbsp1Config);   
 
//I2C初始化  
I2C_cofig();  
     
//CODEC寄存器初始化 
  inti_AIC(); 
    /* Set IVPH/IVPD to start of interrupt vector table */     
IRQ_setVecs((Uint32)(&VECSTART));  
    for (i = 0; i <= BUFFSIZE - 1; i++)
    {          
  gBufferXmtPing[i] = 0;      
    gBufferXmtPong[i] = 0;    
  }  
    /* Call function to effect transfer */    
  taskFxn();
/* while(1)
{ switch(TestCommand)
{
//音频试听/
case AUDIOTRY:
    // 左通路数据 /
while(!MCBSP_rrdy(hMcbsp)){};
DataTempLeft = MCBSP_read16(hMcbsp);
    
    // 右通路数据 /
    while(!MCBSP_rrdy(hMcbsp)){};
    DataTempRight = MCBSP_read16(hMcbsp);
   
// 左声道耳机输出 /
while(!MCBSP_xrdy(hMcbsp)) {};
MCBSP_write16(hMcbsp,DataTempLeft);
// 右声道耳机输出 /
while(!MCBSP_xrdy(hMcbsp)) {};
MCBSP_write16(hMcbsp,DataTempRight); 
// gBufferRcvPing[i]=DataTemp;
  break;
default:
break;
}
}*/
}
void taskFxn(void)
    Uint16 srcAddrHi, srcAddrLo;     
Uint16 dstAddrHi, dstAddrLo;
srcAddrHi = (Uint16)(((Uint32)(MCBSP_ADDR(DRR11))) >> 15) & 0xFFFFu;      //从McBSP把数据送到SDRAM
srcAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DRR11))) << 1) & 0xFFFFu;     
dstAddrHi = (Uint16)(((Uint32)(&gBufferRcvPing)) >> 15) & 0xFFFFu;     
dstAddrLo = (Uint16)(((Uint32)(&gBufferRcvPing)) << 1) & 0xFFFFu;  
    dmaRcvConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;      //源地址低  ////第一次把数据从McBSP送到SDRAM的地址寄存器
dmaRcvConfig.dmacssau = srcAddrHi; 
    dmaRcvConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;     
dmaRcvConfig.dmacdsau = dstAddrHi;    
srcAddrHi = (Uint16)(((Uint32)(&gBufferXmtPing)) >> 15) & 0xFFFFu; //从SDRAM把数据送到McBSP
  srcAddrLo = (Uint16)(((Uint32)(&gBufferXmtPing)) << 1) & 0xFFFFu;    
  dstAddrHi = (Uint16)(((Uint32)(MCBSP_ADDR(DXR11))) >> 15) & 0xFFFFu;    
  dstAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DXR11))) << 1) & 0xFFFFu;  
    dmaXmtConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;     ////第一次把数据从SDRAM送到McBSP的地址寄存器
dmaXmtConfig.dmacssau = srcAddrHi; 
    dmaXmtConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;     
dmaXmtConfig.dmacdsau = dstAddrHi;
  /* Open DMA channels 4 & 5 and set regs to power on defaults */  
  hDmaRcv = DMA_open(DMA_CHA4,DMA_OPEN_RESET);       //打开通道4.5
hDmaXmt = DMA_open(DMA_CHA5,DMA_OPEN_RESET);  
  /* Get interrupt event associated with DMA receive and transmit */     
xmtEventId = DMA_getEventId(hDmaXmt);     //得到DMA事件ID
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);    //使能DMA中断
  IRQ_enable(rcvEventId);  
    /* 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, &Mcbsp1Config);       
    /* Write values from configuration structure to DMA control regs */    
  DMA_config(hDmaRcv,&dmaRcvConfig);     //设置DMA工作方式
DMA_config(hDmaXmt,&dmaXmtConfig);
 /* Enable all maskable interrupts */    
IRQ_globalEnable();   //全局中断使能//
    /* Start Sample Rate Generator and Enable Frame Sync */     
MCBSP_start(hMcbsp, 
                MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,             
    0x300u);   
DMA_FSETH (hDmaRcv, DMACCR, ENDPROG, 1); 
   // DMA_FSETH (hDmaXmt, DMACCR, ENDPROG, 1);  
    /* 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);    
   /* Wait for DMA transfer to be complete */     
while (TRUE)
{  
    /* 左通路数据 */
while(!MCBSP_rrdy(hMcbsp)){};
DataTempLeft = MCBSP_read16(hMcbsp);
    /* 右通路数据 */
    while(!MCBSP_rrdy(hMcbsp)){};
    DataTempRight = MCBSP_read16(hMcbsp);
/* 左声道耳机输出 */
while(!MCBSP_xrdy(hMcbsp)) {};
MCBSP_write16(hMcbsp,DataTempLeft);
/* 右声道耳机输出 */
while(!MCBSP_xrdy(hMcbsp)) {};
MCBSP_write16(hMcbsp,DataTempRight);              
}
/* 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)
 {   
// Read the DMA status register to clear it so new interrupts will be seen 
DMA_RGETH(hDmaXmt, DMACSR);  
DMA_start(hDmaXmt); 
//   DMA_stop(hDmaXmt); 
 //  IRQ_disable(xmtEventId);
 }  
interrupt void dmaRcvIsr(void)
 { 
processBuffer();   //数据处理
// Read the DMA status register to clear it so new interrupts will be seen    
  DMA_RGETH(hDmaRcv, DMACSR);  
//   IRQ_disable(rcvEventId);
 //   transferComplete = TRUE; 
}
/******************************************************************************/
// No more
/******************************************************************************/
x 出现错误。请重试或与管理员联系。