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音频采集疑问



Hi All

在用DaVinci处理器的McASP采集音频:

1. 音频时序是立体声2个声道,时钟,数据,同步三个信号输入给McASP;

2. FrameSync是高电平时长32个bit,低电平时长32个bit;

3. 有效数据是左对齐,时长16个bit;

问题是这样的:

1. McASP采集这样的时序,是按照16bit采集,还是32bit采集?

2. 配置McASP的寄存器:XFMT的SLOT为32,WORD为16,RROT为4,MASK为0000FFFF是否正确?

3. 从Linux用户空间看,采集进来的数据是16bit还是32bit?

  • 你好,

    请问你使用的是具体哪款芯片?不同芯片的Mcasp也会有些区别。

    从frame sync配置的寄存器看,只有两个选择,一个bit,或者一个word,所以word配置16的话,frame sync的宽度就有问题,所以word还是需要配置为32-bit。

    Receive Frame Sync Control Register (AFSRCTL)
    4 FRWID Receive frame sync width select bit indicates the width of the receive frame sync (AFSR) during its
    active period.
    0 Single bit.
    1 Single word. Single word is not supported if RMOD is set to burst mode.

    我没有使用过RROT/RMASK,但我觉得这两个寄存器只能改变输入的数据,但不能改变McASP内部认为的数据的宽度。你可以尝试确认一下。

    最好还是能够调整外部音频信号的格式。

  • Hi Chris

    感谢回复,我贴几个图,详细说明一下,CPU目前是DM385;

     现在McASP的输入的音频时序是这样的,如下图,黄色的波形是48KHz的FrameSync同步脉冲,蓝色的是数据,数据是MSB,16bit,左对齐;
     
     
     
      我仔细通读了TRM里的McASP一个章节,在TRM里P1856页定义了Slot,Word,Slot表示Sync脉冲开槽时间,Word表示有效数据长度,在我们这个时序要求下,SLOT=32bit,WORD=16bit
      
       在P1885页,对于左对齐,MSB在前的数据,RROT=SLOT-WORD,RRVRS=1,结合后面的图可以看懂,McASP左对齐MSB在前的先陆续进入FIFO,然后由于RRVRS=1,做一个左右对调的操作,MSB就在高比特这一侧了,
       然后做一个右移RROT比特的操作,对于我们的这个时序,应该是读入16bit有效数据再读入16bit无效数据,然后左右镜像对调,再右移16bit,得到:PPPP-PPPP-PPPP-PPPP-M .... L 这样一个32bit的数据。
       
      
      那么问题来了,在驱动里的mcasp_davinci.c函数里,配置时序的函数认为 SLOT是等于WORD的,可以看出 下面一段代码的 DAVINCI_AUDIO_WORD_X 下面设置的 fmt 值就是SLOT值,对于我们
      这样的时序,应该怎么修改呢? 
      是否在:DAVINCI_AUDIO_WORD_16 这个分支 下设置SLOT=32,RROT=4(右移16bit),MASK=0000FFFF,这样通过ALSA接口读出来的是16bit的有效数据?
  • Jason,

    你的问题我基本清楚。

    我提到的frame sync宽度设置问题,你是否如何想的?

  • (AFSRCTL) 这个寄存器对FrameSync的设置有2个地方:

    1. FrameSync宽度是bit-width还是word-width,FRWID位,对于word-width描述的很清楚,McASP对FrameSync的高电平期间的全部有时钟的数据都采集进来作为一个声道,在FrameSync的低电平期间的全部有时钟的数据采集进来作为另一个声道,如果用这种模式,我这个时序只能按照32bit数据采集到Linux的用户空间而不是16bit,这32bit数据的高16bit就Padding成0;如果是bit-width,我没有找到对应的时序图,我想是一个时钟周期的FrameSync表示了一帧的开始,然后McASP就一直采集数据直到下一个FrameSync来到,但是McASP会采集多少bit数据?是按照SLOT-Size采吗?

    2. FrameSync是外部产生还是内部产生,FSRM位,这个就没太明白时序是怎么产生的,如果选则内部产生FrameSync,那是根据什么参数产生的?


    如果1的答案是我猜想的这样,我这个时序就可以设置为:bit-width,slot=16,internal-sync,那么McASP只要拿到一个上升沿/下降沿就在内部产生一个16bit的FrameSynce,把数据采集进来,抓到Linux内核空间也是16bit。

  • Jason,

    现在McAsp接收clock和frame sync是外部auido codec给的么?这个音频时序可以修改么?

    如果是内部产生framesync,就是根据FRWID的配置来产生的。

  • Hi Chris

    1. 外部Codec时序是不能修改的;

    2. “内部产生的FrameSync是根据FRWID的配置来产生的” 这句话不能理解,

    如果FRWID配置成bit-width或者word-width,按照我这个时序,McASP将在内部产生多大的FrameSync?我理解应该是按照外部输入帧同步的上升沿/下降沿作为触发,FrameSync宽度是按照SLOT寄存器长度内部产生的。

    这个理解对不对?

  • Jason,

    FS可以是DM芯片内部产生,或者是外部输入,如果是内部产生,是根据FRWID的配置来产生的。

    如果采集的时钟和帧同步是外部输入给McASP的,能否尝试:XFMT的SLOT为32,WORD为16,RROT为0,MASK为FFFF0000,两个slot?

  • Hi Chris

    这个设置就是我之前说的,一个Frame有2个SLOT,1个SLOT=32个时钟周期,RROT和PADDING之后,变成了每个声道采样数据长度是32bit,但是高2字节是Padding的Zero-bit 。 

  • Jason,

    不一样啊。

    我建议的配置,16-bit采集
    XFMT的SLOT为32,WORD为16,RROT为0,MASK为FFFF0000,两个slot

    你之前的配置:
    XFMT的SLOT为32,WORD为16,RROT为4,MASK为0000FFFF

  • Hi Chris

    膜拜 。。。。 

    这样理论上是可行的