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.

如何设置MCASP的多路音频。

Other Parts Discussed in Thread: TMS320C6748

TMS320C6748的demo   

AUDIO_MIC_IN ——Mic In  音频输入( (EMDA  方式)中讲了一路音频传输过来然后通过EDMA3传输,输入直接copy到输出。

static struct EDMA3CCPaRAMEntry const txDefaultPar = 
       {
           (unsigned int)(EDMA3CC_OPT_DAM  | (0x02 << 8u)), /* Opt field */
           (unsigned int)loopBuf, /* source address */
           (unsigned short)(BYTES_PER_SAMPLE), /* aCnt */
           (unsigned short)(NUM_SAMPLES_LOOP_BUF), /* bCnt */ 
           (unsigned int) SOC_MCASP_0_DATA_REGS, /* dest address */
           (short) (BYTES_PER_SAMPLE), /* source bIdx */
           (short)(0), /* dest bIdx */
           (unsigned short)(PAR_TX_START * SIZE_PARAMSET), /* link address */
           (unsigned short)(0), /* bCnt reload value */
           (short)(0), /* source cIdx */
           (short)(0), /* dest cIdx */
           (unsigned short)1 /* cCnt */
       };
/*
** Default paRAM for Receive section.  
*/
static struct EDMA3CCPaRAMEntry const rxDefaultPar =
       {
           (unsigned int)(EDMA3CC_OPT_SAM  | (0x02 << 8u)), /* Opt field */
           (unsigned int)SOC_MCASP_0_DATA_REGS, /* source address */
           (unsigned short)(BYTES_PER_SAMPLE), /* aCnt */
           (unsigned short)(1), /* bCnt */
           (unsigned int)rxBuf0, /* dest address */
           (short) (0), /* source bIdx */
           (short)(BYTES_PER_SAMPLE), /* dest bIdx */
           (unsigned short)(PAR_RX_START * SIZE_PARAMSET), /* link address */
           (unsigned short)(0), /* bCnt reload value */
           (short)(0), /* source cIdx */
           (short)(0), /* dest cIdx */
           (unsigned short)1 /* cCnt */
       };

现在我需要传输4路音频,该怎么设置MCASP,类似SOC_MCASP_0_DATA_REGS的地址

/** \brief Base address of McASP memory mapped registers                      */
#define SOC_MCASP_0_CTRL_REGS               (0x01D00000)
#define SOC_MCASP_0_FIFO_REGS               (0x01D01000)
#define SOC_MCASP_0_DATA_REGS               (0x01D02000)
  • 在多路时,一个事件触发DMA一次搬运多个数据。简单来说,ACNT为channel数*4 (因为McASP的数据只能按32-bit访问)

  • 你好,我这几天又查看了相关资料,渐渐看懂了些,

    就是说如果传输4路音频(8个声道)就需要配置4个接收串行器,4个发送串行器。每个串行器用I2S方式传输左右声道。

    现在还有三个小疑问:1.看到一些程序中把I2S_SLOTS设置成3了,这是什么原因,按理说应该是2(左右2个声道)。

    2.EDMA这块只需要改一下ACNT么,因为我要对每一路音频做处理,怎么把这4路分开处理,相互之间不影响。

    3.有时候只传输1路音频,有时候有2,3路,这样的话传输会不会受影响,会不会导致音频传输错乱或者混合了。
  • user5324036 说:
    就是说如果传输4路音频(8个声道)就需要配置4个接收串行器,4个发送串行器。每个串行器用I2S方式传输左右声道。

    是的。

    user5324036 说:
    1.看到一些程序中把I2S_SLOTS设置成3了,这是什么原因,按理说应该是2(左右2个声道)。

    是2.

    user5324036 说:
    2.EDMA这块只需要改一下ACNT么,因为我要对每一路音频做处理,怎么把这4路分开处理,相互之间不影响。

    要在后续的处理中,软件来将它分开。

    user5324036 说:

    3.有时候只传输1路音频,有时候有2,3路,这样的话传输会不会受影响,会不会导致音频传输错乱或者混合了。

    只要软件在配EDMA时相应的配置就好了。处理软件也做相应处理。

  • 恩恩,明白了。
    另外,不管是TDM格式还是I2S格式都要把ACNT改为channel数*4么?什么情况下改BCNT?
    麻烦指点指点~
  • B_CNT取决于你希望取多长数为一帧进行处理。在B减为0后,才会产生EDMA完成中断。它跟能不能正确收发多通道数据无关了。 

  • 好的,好像明白了。那这样看来这四路音频的左声道是不是就连在一起ABCDABCD.....存放在一块,右声道也同样。
  • 您好,像前面讨论过的,确实是需要,根据硬件配置,再确认代码中,使用的是否为,对应的串行器,例如创龙的开发板,使用的串行器11和12,也是在代码中,有对应关系的,如果您需要多路音频,也是参考配置即可,请您参考。

  • 是的,顺序是:左ABCD右ABCD左ABCD右ABCD....
    当用到FIFO时,可以考虑一下B,并用AB同步方式,以提高带宽。
  • 唐工,

          用4个串行器配置成I2S模式,传输4路立体声。

          按照EDMA的传输方式只是把这4路音频的左右声道分开了,左声道在一起按顺序ABCDABCD排列,右声道也是按顺序abcdabcd..排列。

          但是我需要的是把这几个都要细分开,设置8个缓冲区,例如:AAAAAAA的在一起,aaaaaa的在一起。

          EDMA能实现这样的划分吗?怎么设置

  • #1. 直接实现不了,因为多路串行器时,一个event必需把所有串行器的数据读出来,所以ACnt是4x串行器数,那么这几个数必然是连续的,没办法用BIdx来排序。

    #2. 可以尝试用Chain的方式来做,会有点复杂。大体上的思路是:在一帧EDMA完成后用Chain的方式触发新的EDMA parameter传输,而这个新的EDMA parameter配置为ITCCHEN,TCC配置为自己,即自己Chain自己,通过BIdx来将数据分开。

  • 好的好的,明白了。

    非常感谢~