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.

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

Other Parts Discussed in Thread: CCSTUDIO

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++;

              }

       }

}

  • 问题已经解决,主要是中断中对地址的赋值操作不对,应该采用CSL赋值。其实一开始就是采用CSL更改地址,但是将目的地址和源地址搞反了,结果不进入中断,后来改为和初始化中相同的地址更改方式,中断进入正常,但是查看数组中的数据,发现只有一个数组有值,另一个数组始终没有值。现将中断中的地址赋值改为CSL库函数赋值方法,乒乓方式地址切换正常,AIC23输出声音连续。

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

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

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

  • 我得邮箱596121344@qq.com

  • 就是把中断中的

    dmaXmtConfig.dmacssal = (DMA_AdrPtr)ptraddrlow;

    dmaXmtConfig.dmacssau = ptraddrhi;

    改为

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

    其他部分程序都是对的。

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

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

  • 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格式的数据运算

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

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

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

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

  • 唉,我也将系数转过来了,因为我用的是DM642,也是顶点的,将系数乘以了一个2^15后再滤波,结果还是没有滤波效果,真是无语至极啊

  • 你好,我最近也在研究5509a采集声音的课题,看了你的程序自己改了下,逻辑上感觉没什么问题,还是硬件跑起来还是有问题,请问能看一下你完整的程序吗,邮箱chenshiyu1007@163.com   麻烦了

  • 额,你可能看错了,上面的代码是楼主的,不是我发上去的,我用的642,你要是确实需要可以发给你的,不过我用的MCASP,不是MCBSP

  • 雅儿嘞 ,不好意思, 不大会玩这论坛  ,刚开始接触DSP ,一个人搞郁闷的不行。。。

  • 楼主你好,我最近也在研究5509a采集声音的课题,看了你的程序自己改了下,主要是添加了头文件和一些定义,逻辑上感觉没什么问题,还是硬件跑起来还是有问题,主要是会出现:

    Trouble Halting Target CPU: Error 0x00000022/-2130 Error during: Memory, Execution, Cannot access memory address at 0x00000800 Sequence ID: 15 Error Code: -2130 Error Class: 0x00000022

    ,你遇到过类似的情况吗,请问能看一下你完整的程序吗,邮箱chenshiyu1007@163.com   麻烦了

  • 这次应该没有回复给你吧,请问你是做音频哪一块的,我现在也在做音频,可以一起讨论下。

  • 可以借鉴一下你的程序不

  • 楼主,我把你的程序调试很多错误,楼主用了哪几个include函数呢。  方便的话可以发我一份调试好的程序吗 729280242@qq.com 万分感谢

  • lan teng,你好, xfreebuf ,xpongbuf; rpongbuf;这几个缓冲区你是怎么赋值的,为什么我赋值进去都不对呢,得到的也不对,,想问问你怎么回事,,如果可以借鉴你的程序那就更好了,,我邮箱1067539081@qq.com

  • 你好,楼主,我也在学这块,搞了一个星期了,还是断断续续,求你发我一份完整程序吧,非常期待您的回复,我的邮箱是jiang_xiao2009@163.com

  • 楼主你好,我也是在学这方面的内容,不知是否可以发一份代码,让我学习学习,谢谢~邮箱249879466@qq.com。

  • 麻烦了,由于是DSP新手,可能有很多不太懂的部分,请教一下:

    1、’“ 每次上电后先进DMA的发送中断,隔一个采样时钟周期(采用8KHz采样率,相隔125us)后进入DMA接收中断,接收中断中将程序状态转到信号处理函数Signal_Process();”

    请问一下,这里怎么进入信号处理函数Signal_Process()的呢?

    我看了一下你的程序,使用的是“State_Work = State_Signal_Process;”,这是什么意思啊?

    2、这个主程序是什么啊,也就是main()函数,是while(1){}让DSP板子空循环么,还是什么?


    希望能得到您的解答,谢谢。

  • 一种是用操作系统,通过信号量之类的来唤醒任务。

    比如在ISR里SEM_POST()发信号量。

    在Task里SEM_PEND等信号量ready

    另一种就是上面这种主循环方式。

    main()

    {.....

    while(1)

    if(State_Work ==State_Signal_Process)

    {

    Signal_Process()

    State_Work = 0;

    }

    ..........

    }

  • 谢谢啦!

    我还有一个问题:

    我这个开发板,McBSP0和外扩的AIC23的数据口相接,以实现AIC23数据的输入输出。一般用MCBSP_read16()和MCBSP_write16(),这两个函数来进行读写。

    如果用DMA从McBSP接受和发送数据,那么是不是就不需要用MCBSP_read16()和MCBSP_write16()这两个函数了?
  • user5155731 说:
    如果用DMA从McBSP接受和发送数据,那么是不是就不需要用MCBSP_read16()和MCBSP_write16()这两个函数了?

    是的,DMA自动将数据从寄存器取到内存,或者从内存搬数据到McBSP寄存器,数据搬运不用CPU代码的参与。

  • 再请教一下:

    我这边的开发板,I2C作为AIC23的控制口,McBSP0作为AIC23的数据口,那么用AIC23做数据采集的时候,DMA是配置成:

    源地址是McBSP0,目标地址是内存?
    源地址是AIC23,目标地址是McBSP?

    也就是说,AIC23用McBSP0做数据口,不用DMA的时候就直接MCBSP_read16(),要是用了DMA,那么这两者之间还要DMA来传输么?