TI论坛
直播中

刘丽菲

8年用户 986经验值
私信 关注
[问答]

aic3106test例程McASP和芯片都设置成I2S方式,采样放出的帧信号不就应该是左右两个slot了吗?为什么要写两次呢?


  • 最近在做音频的项目,参考evmc6747中aic3106test例程,有个问题没弄明白,例程中这里
    for ( sec = 0 ; sec < 5 ; sec++ )
    {
    for ( msec = 0 ; msec < 1000 ; msec++ )
    {
    for ( sample = 0 ; sample < 48 ; sample++ )
    {
    /* Send a sample to the left channel */
    while ( ! ( MCASP1_SRCTL5 & 0x10 ) );
    MCASP1_XBUF5_32BIT = (sinetable[sample] << 15) | 0x00000000;
    /* Send a sample to the right channel */
    while ( ! ( MCASP1_SRCTL5 & 0x10 ) );
    MCASP1_XBUF5_32BIT = (sinetable[sample] << 15) | 0x00000000;
    }
    }
    }

    因为McASP和芯片都设置成I2S方式,那么每采样放出的帧信号不就应该是左右两个slot了吗?这里为什么要写两次呢?
    还有就是我觉得例程中给的正弦波数组应该是Q15格式的吧?这里的<<15|0x00000000是干嘛用的呢?结果是Q31数据?请大家多指教!谢谢!

回帖(2)

肖青

2024-10-29 09:39:10
      写两次的原因是为了写双声道吧。那个注释上这么解释的。
举报

爱与友人

2024-10-29 10:49:57
在I2S模式下,数据确实是通过左右两个slot传输的。在您提供的代码片段中,每次循环都会发送一个样本到左通道,然后再发送一个样本到右通道。这样做的原因是,I2S协议要求每个样本都要分成两个部分:左通道和右通道。因此,每次循环都需要发送两个样本,一个左通道样本和一个右通道样本。

以下是代码的解释:

1. 外层循环(sec):控制发送样本的持续时间,这里设置为5秒。
2. 中层循环(msec):控制每个样本之间的时间间隔,这里设置为1毫秒。
3. 内层循环(sample):控制每个通道发送的样本数量,这里设置为48个样本。

在内层循环中,有两个while循环:

- 第一个while循环:等待左通道的传输缓冲区为空,然后发送左通道样本。
- 第二个while循环:等待右通道的传输缓冲区为空,然后发送右通道样本。

每次发送样本时,都会将样本值左移15位,然后与0x00000000进行或运算,以确保数据格式正确。这样,每次循环都会发送一个左通道样本和一个右通道样本,直到完成所有样本的发送。

希望这个解释能帮助您理解代码的工作原理。如果您还有其他问题,请随时提问。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分