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

C5509A用DMA乒乓缓冲方式从MCBSP接收和发送数据,AIC23的输出声音不连续。

C5509A的DMA采用乒乓方式从MCBSP接收和发送数据,DMA设置为块中断,每次进入中断后,设置下一次的地址,最终的效果是,从AIC23的音频输入口输入声音信号,从输出口听到的声音不连续,感觉有停顿感。主要代码如下,麻烦请帮我看看是哪里的问题。

 每次上电后先进DMA的发送中断,隔一个采样时钟周期(采用8KHz采样率,相隔125us)后进入DMA接收中断,接收中断中将程序状态转到信号处理函数Signal_Process();,其余时间都不调用信号处理函数,在信号处理函数中将接收到的数据分为左右通道,然后再将左右通道的数据组合后赋给发送数组。

MCBSP_Config Mcbsp1Config= {

  MCBSP_SPCR1_RMK(

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

    MCBSP_SPCR1_RJUST_LZF,                 /* RJUST  = 2 left justify the data and zero fill LSBS */

    MCBSP_SPCR1_CLKSTP_DISABLE,            /* CLKSTP = 0 Clock stop mode disable */

    MCBSP_SPCR1_DXENA_ON,                  /* DXENA  = 1 DX delay enabler on */

    MCBSP_SPCR1_ABIS_DISABLE,              /* ABIS   = 0 reserved always write 0*/

    MCBSP_SPCR1_RINTM_RRDY,                /* RINTM  = 0 sends a receive INT request to CPU when the RRDY bit

                                            change from 0 to 1, indicating that receive data is ready to be read*/

    0,                                     /* RSYNCER = 0 receive frame-sync error bit, no error*/

    MCBSP_SPCR1_RRST_DISABLE               /* RRST   = 0 reset the receiver*/

       ),

    MCBSP_SPCR2_RMK(

    MCBSP_SPCR2_FREE_NO,                   /* FREE   = 0 free run bit, The McBSP transmit and receive clocks are affected as determined by the SOFT bit*/

    MCBSP_SPCR2_SOFT_NO,                   /* SOFT   = 0 Soft stop bit, Hard stop*/

    MCBSP_SPCR2_FRST_FSG,                  /* FRST   = 0 Frame-sync logic reset bit*/

    MCBSP_SPCR2_GRST_CLKG,                 /* GRST   = 0 Sample rate generator reset bit */

    MCBSP_SPCR2_XINTM_XRDY,                /* XINTM  = 0 transmit interrupt mode bits XRDY bit changes from 0 to1 */

    0,                                     /* XSYNCERR = N/A transmit frame-sync error bit, no error*/           

    MCBSP_SPCR2_XRST_DISABLE               /* XRST   = 0 transmit ready bit, not ready*/

       //注意:开始一定要设置为disable,否则不能设置它的寄存器,全部为默认值,导致不能正常接收,

       //在程序调用C库函数mcbspstart时会在设为1,McBSP便退出reset状态开始工作

   ),

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

  MCBSP_RCR1_RMK(

    MCBSP_RCR1_RFRLEN1_OF(1),              /* RFRLEN1 = 1 Receive frame length 1 bits(1 to 128 words),Frame length=(RFRLEN1+1)words*/

      MCBSP_RCR1_RWDLEN1_16BIT               /* RWDLEN1 = 2 Receive word length 1 bits, 16bit*/

  ),

 MCBSP_RCR2_RMK(   

    MCBSP_RCR2_RPHASE_SINGLE,              /* RPHASE  = 0 Receive phase number bit, single-phase frame*/

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

    MCBSP_RCR2_RWDLEN2_8BIT,               /* RWDLEN2 = 0 */

    MCBSP_RCR2_RCOMPAND_MSB,               /* RCOMPAND = 0 receive companding mode bits, 0, no companding,MSB received first*/

    MCBSP_RCR2_RFIG_YES,                   /* RFIG    = 0 Receive frame-sync ignore bit, 1, frame-sync detect */

    MCBSP_RCR2_RDATDLY_1BIT                /* RDATDLY = 1 Receive data delay bits, 1-bit data delay*/

    ), 

   MCBSP_XCR1_RMK(   

    MCBSP_XCR1_XFRLEN1_OF(1),              /* XFRLEN1 = 1 Transmit frame length 1(1 to 128 words),Frame length=(XFRLEN1+1)words */

    MCBSP_XCR1_XWDLEN1_16BIT               /* XWDLEN1 = 2 Transmit word length 1.16bit*/

   ),  

 MCBSP_XCR2_RMK(  

    MCBSP_XCR2_XPHASE_SINGLE,              /* XPHASE  = 0 Transmit phase number bit, single-phase frame*/

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

    MCBSP_XCR2_XWDLEN2_8BIT,               /* XWDLEN2 = 0 */

    MCBSP_XCR2_XCOMPAND_MSB,               /* XCOMPAND = 0 Transmit companding mode bits, 0, no companding,MSB received first*/

    MCBSP_XCR2_XFIG_YES,                   /* XFIG    = 0 Transmit frame-sync ignore bit, 1, frame-sync detect */

    MCBSP_XCR2_XDATDLY_1BIT                /* XDATDLY = 1 Transmit data delay bits, 1-bit data delay*/

  ),  

 MCBSP_SRGR1_DEFAULT,                      /*(0x0001u)FWID=0,CLKGDV=1 */

 MCBSP_SRGR2_DEFAULT,                      /*(0x2000u)CLKSM=1,Sample rate generator input clock mode bit */

 MCBSP_MCR1_DEFAULT,

 MCBSP_MCR2_DEFAULT,

 MCBSP_PCR_RMK(

   MCBSP_PCR_IDLEEN_RESET,                 /* IDLEEN   = 0 The McBSP remains active when the PERIPH domain is idled */

   MCBSP_PCR_XIOEN_SP,                     /* XIOEN    = 0 Transmit I/O enable bit, CLKX,FSX,DX,CLKS pins are serial port pins*/

   MCBSP_PCR_RIOEN_SP,                     /* RIOEN    = 0 Receive I/O enable bit, CLKR,FSR,DR,CLKS pins are serial port pins*/

   MCBSP_PCR_FSXM_EXTERNAL,                /* FSXM     = 0 Transmit frame-sync mode bit,0:transmit fram-sync is supplied by an external source via the FSX pin*/

   MCBSP_PCR_FSRM_EXTERNAL,                /* FSRM     = 0 Receive frame-sync mode bit,0:transmit fram-sync is supplied by an external source via the FSR pin*/

   0,                                      /* DXSTAT = N/A   */

   MCBSP_PCR_CLKXM_INPUT,                  /* CLKXM    = 0 Transmit clock mode bit*/

   MCBSP_PCR_CLKRM_INPUT,                  /* CLKRM    = 0 Receive clock mode bit*/

   MCBSP_PCR_SCLKME_NO,                    /* SCLKME   = 0 Sample rate generator input clock mode bit,used with CLKSM to select the input clock*/

   MCBSP_PCR_FSXP_ACTIVEHIGH,              /* FSXP     = 0 Transmit frame-sync polarity bit, 0,transmit frame-sync pulses are active high*/

   MCBSP_PCR_FSRP_ACTIVEHIGH,              /* FSRP     = 1 Receive frame-sync polarity bit, 0,receive frame-sync pulses are active high*/

   MCBSP_PCR_CLKXP_FALLING,                /* CLKXP    = 1 Transmit clock polarity bit,1,transmit data is driven on the rising edge of CLKX */

   MCBSP_PCR_CLKRP_RISING                  /* CLKRP    = 1 Receive clock polarity bit*/

 ),

 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

};    

 /* 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_EN_STOP,             //Channel enable :-设置时先关闭通道

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

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

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

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

  DMA_DMACICR_RMK(

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

    DMA_DMACICR_LASTIE_OFF,       //Last frame interrupt enable :-

    DMA_DMACICR_FRAMEIE_OFF,      //Whole frame interrupt enable :-

    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(DRR11)),        /* DMACSSAL 源地址低位 */

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

    (DMA_AdrPtr)&pingrcv,                      /* 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_EN_STOP,           //Channel enable :-设置时先关闭通道

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

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

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

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

  DMA_DMACICR_RMK(

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

    DMA_DMACICR_LASTIE_OFF,       //Last frame interrupt enable :-

    DMA_DMACICR_FRAMEIE_OFF,       //Whole frame interrupt enable :-

    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)&pingxmt[0],                   /* DMACSSAL 源地址低位*/

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

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

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

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

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

    0,                                     /* DMACFI   */

    0                                      /* DMACEI   */

};

  void AIC23_DataTransfer_Init()

{

    Uint16 i;

    Uint16 srcAddrHi, srcAddrLo;

    Uint16 dstAddrHi, dstAddrLo; 

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

       {

           pingrcv[i] = 0;

              pongrcv[i] = 0;

              pingxmt[i] = 0;

              pongxmt[i] = 0;

       }

    /* 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(DRR11))) >> 15) & 0xFFFFu;

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

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

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

 

    dmaRcvConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;

    dmaRcvConfig.dmacssau = srcAddrHi;

    dmaRcvConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;

    dmaRcvConfig.dmacdsau = dstAddrHi;

 

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

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

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

    dstAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DXR11))) << 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_PORT1, 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, &Mcbsp1Config);

   

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

    DMA_config(hDmaRcv,&dmaRcvConfig);

DMA_config(hDmaXmt,&dmaXmtConfig);

 

    xfreebuf = xpongbuf;

       rfreebuf = rpongbuf;

/* 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);

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

   

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

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

    dmaRcvConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;

    dmaRcvConfig.dmacdsau = dstAddrHi;

      

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

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

    dmaXmtConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;

    dmaXmtConfig.dmacssau = srcAddrHi;

   

       DMA_FSETH(hDmaRcv, DMACCR, ENDPROG,1);

       DMA_FSETH(hDmaXmt, DMACCR, ENDPROG,1);

}

 

 

interrupt void dmaXmtIsr(void) {

       static int * ptr;

       unsigned int ptraddrhi, ptraddrlow;

 

       DMA_FSETH(hDmaXmt,DMACSR,BLOCK,0);

       if(xfreebuf == xpingbuf)

       {

              xfreebuf = xpongbuf;

              ptr = pongxmt;

       }

       else

       {

              xfreebuf = xpingbuf;

              ptr = pingxmt;

       }

       while(DMA_FGETH(hDmaXmt, DMACCR, ENDPROG));

       //修改DMA地址

       ptraddrhi = (unsigned int)(((unsigned long)(ptr)) >> 15) & 0xFFFFu;

       //因为DMA都使用字节地址,所以必须左移一位

       ptraddrlow= (unsigned int)(((unsigned long)(ptr)) << 1) & 0xFFFFu;

       dmaXmtConfig.dmacssal = (DMA_AdrPtr)ptraddrlow;

    dmaXmtConfig.dmacssau = ptraddrhi;

       DMA_FSETH(hDmaXmt, DMACCR, ENDPROG,1);

}

 

interrupt void dmaRcvIsr(void) {

    static int * ptr;

       unsigned int ptraddrhi, ptraddrlow;

 

       DMA_FSETH(hDmaRcv,DMACSR,BLOCK,0);

       if(rfreebuf == rpingbuf)

       {

        rfreebuf = rpongbuf;

              ptr = pongrcv;

       }

       else

       {

        rfreebuf = rpingbuf;

              ptr = pingrcv;

       }

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

       //修改DMA地址

       ptraddrhi = (unsigned int)(((unsigned long)(ptr)) >> 15) & 0xFFFFu;

       //因为DMA都使用字节地址,所以必须左移一位

       ptraddrlow= (unsigned int)(((unsigned long)(ptr)) << 1) & 0xFFFFu;

    dmaRcvConfig.dmacdsal = (DMA_AdrPtr)ptraddrlow;

    dmaRcvConfig.dmacdsau = ptraddrhi;

       DMA_FSETH(hDmaRcv, DMACCR, ENDPROG,1);

       State_Work = State_Signal_Process;

}

 void Signal_Process()

{

    Uint16 i,j=0;

       if(rfreebuf == rpongbuf)//(PingPong == PING)

       {

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

              {

                   Leftchannel_Buffer[j] = pongrcv[i];

             Rightchannel_Buffer[j] = pongrcv[i+1];

                      j++;

              }

       }

       else

       {

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

              {

                  Leftchannel_Buffer[j] = pingrcv[i];

            Rightchannel_Buffer[j] = pingrcv[i+1];

                     j++;

              }

   }

    j = 0;

       if(xfreebuf == xpongbuf)

       {

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

              {

                   pongxmt[i] = Leftchannel_Buffer[j];

             pongxmt[i+1] = Rightchannel_Buffer[j];

                      j++;

              }

       }

       else

       {

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

              {

                   pingxmt[i] = Leftchannel_Buffer[j];

             pingxmt[i+1] = Rightchannel_Buffer[j];

                      j++;

              }

       }

}

li wan1:

回复 lan teng:

可以问您一下具体是修改了哪些地方吗?我用的DM642,也要做音频处理

lan teng:

回复 li wan1:

中断中的地址更新方式,应该用CSL库函数更新地址。

li wan1:

回复 lan teng:

可以把你的程序发我一份吗?我没有完整的EDMA案例,我这边一直被EDMA卡着,发现库函数中的EDMA的操作句柄的结构体类型不对,

li wan1:

回复 lan teng:

我得邮箱596121344@qq.com

lan teng:

回复 li wan1:

就是把中断中的

dmaXmtConfig.dmacssal = (DMA_AdrPtr)ptraddrlow;

dmaXmtConfig.dmacssau = ptraddrhi;

改为

DMA_RSETH(hDmaXmt, DMACSSAU, ptraddrhi); DMA_RSETH(hDmaXmt, DMACSSAL, ptraddrlow);

其他部分程序都是对的。

li wan1:

回复 lan teng:

这样啊,谢谢你啊!不过你能不能补发一个EDMA_Handle在库函数中的定义贴出来,我的在csl_edma.h中的类型定义是Uint 32,这应该不对吧,所以麻烦你把这个也贴出来,万分感谢

lan teng:

回复 li wan1:

我用的是5509A,你在CCS安装目录下找CCStudio_v3.3\C5500\csl\include中就有。

li wan1:

回复 lan teng:

lan teng ,你好,我在DM642的板子上使用AIC23B和MCASP做音频信号的回响测试和FIR滤波时出现很大的杂声,你能不能帮忙看看是什么原因:

问题描述:

1、将采集进来的数据不经任何处理直接发送出去,声音很清晰,且无杂声;

2、当测试简单的回响时,将回响信号x和原始信号y进行一个简单的算法,比如a=(x+3*y)/4,再把a通过XBUF播放出去,这是出现了很大的杂声,但是当算法设定为a=x+3*y或者a=x+y时,有没有杂声出现,可以很清晰的听到回响的效果

3、当测试FIR低通滤波时,将采集的音频信号和一个已知的低通滤波器系数相乘后发出时,就出现了很大的杂声;但是当我把滤波系数扩大10000倍,变成整数后,杂声就变得小些了,但还是存在

因为回响和FIR滤波在C6713上测试时是没杂声的,在C6713上的数据类型均是使用的float,一开始我以为是数据类型不对,所以将数据类型也修改为float,问题还是没有解决,后来有尝试了不同的数据类型,比如unsigned int等,问题同样没能解决。后来突然想到C6713是浮点DSP,而DM642是定点DSP,你觉得会是这个原因吗?网上也有人说,定点的DSP在做浮点运算是要通过Q格式的数据运算

不知道您或者您身边的同事有没有遇到过这样问题,遇到后你们是怎么解决的。或者你们觉得问题出在哪?

lan teng:

回复 li wan1:

不好意思,我这边没有深入研究过AIC23,只是简单的用它采集音频信号,然后进行处理后输出。但是,之前我遇到过采集信号处理后,输出声音有杂音的现象,具体怎么改的忘了,好像是数据处理部分的问题。

从你的描述看,没杂音的算法都比较简单,有杂音的算法相对复杂一些,所以,我感觉你还是在算法的实现方式上查查。

对于滤波系数,因为我用的定点DSP,所以一般都是设计好滤波器系数后,转换为相应的位数,如以16位表示,就乘以2^16。滤波效果还可以,你试试。其它的就帮不上了。

赞(0)
未经允许不得转载:TI中文支持网 » C5509A用DMA乒乓缓冲方式从MCBSP接收和发送数据,AIC23的输出声音不连续。
分享到: 更多 (0)