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

如何设置MCASP的多路音频。

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)
Tony Tang:

在多路时,一个事件触发DMA一次搬运多个数据。简单来说,ACNT为channel数*4 (因为McASP的数据只能按32-bit访问)

user5324036:

回复 Tony Tang:

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

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

现在还有三个小疑问:1.看到一些程序中把I2S_SLOTS设置成3了,这是什么原因,按理说应该是2(左右2个声道)。2.EDMA这块只需要改一下ACNT么,因为我要对每一路音频做处理,怎么把这4路分开处理,相互之间不影响。
3.有时候只传输1路音频,有时候有2,3路,这样的话传输会不会受影响,会不会导致音频传输错乱或者混合了。

Tony Tang:

回复 user5324036:

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

是的。

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

是2.

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

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

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

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

user5324036:

回复 Tony Tang:

恩恩,明白了。
另外,不管是TDM格式还是I2S格式都要把ACNT改为channel数*4么?什么情况下改BCNT?
麻烦指点指点~

Tony Tang:

回复 user5324036:

B_CNT取决于你希望取多长数为一帧进行处理。在B减为0后,才会产生EDMA完成中断。它跟能不能正确收发多通道数据无关了。 

user5324036:

回复 Tony Tang:

好的,好像明白了。那这样看来这四路音频的左声道是不是就连在一起ABCDABCD…..存放在一块,右声道也同样。

Trolong_support:

回复 user5324036:

您好,像前面讨论过的,确实是需要,根据硬件配置,再确认代码中,使用的是否为,对应的串行器,例如创龙的开发板,使用的串行器11和12,也是在代码中,有对应关系的,如果您需要多路音频,也是参考配置即可,请您参考。

Tony Tang:

回复 user5324036:

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

user5324036:

回复 Tony Tang:

唐工,

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

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

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

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

Tony Tang:

回复 user5324036:

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

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

赞(0)
未经允许不得转载:TI中文支持网 » 如何设置MCASP的多路音频。
分享到: 更多 (0)