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.

TMS320C6748: 音频芯片是AIC3106,我想请问一下我想将MIC IN 接口的左右声道数据分别读取到进行处理再将处理后的左右声道数据通过Line out接口输出,但是我无法获取到Mic in接口的左右声道的数据应该如何获取

Part Number: TMS320C6748


void OutputSample(unsigned int outData)
{
McASPTxBufWrite(SOC_MCASP_0_CTRL_REGS, 11, outData);
}

unsigned int InputSample(void)
{
return (McASPRxBufRead(SOC_MCASP_0_CTRL_REGS, 12));

}

if(status & MCASP_TX_STAT_CURRSLOT_EVEN)
{
// 读取右通道数据
sample = InputSample(); //按照音频数据的格式从输入缓冲区读取左右声道的采样值,并将处理后的采样值输出到输出缓冲区
// 输出右声道数据
OutputSample(sample);
}
else
{
// 读取左通道数据
sample = InputSample();
// 输出左声道数据
OutputSample(sample);
}

我看到这里是直接将输入数据拷贝到输出缓冲区了,没有区分InputSample();的左右声道数据,我想获取到InputSample();的左右声道数据应该如何做?

  • TMS320C6748

    要从AIC3106音频编解码器的MIC IN接口获取左右声道数据,可以使用McASPRxBufRead()函数从McASP(Multichannel Audio Serial Port)模块中的接收音频缓冲区中读取音频样本。

    McASPRxBufRead() 函数以特定格式读取音频样本,这取决于 McASP 寄存器的设置。 默认情况下,McASP 配置为以立体声模式接收音频样本,首先是左声道样本,然后是右声道样本。 因此,要分别获取左右声道数据,可以修改InputSample()函数如下:

    unsigned int LeftInputSample(void)
    {
        return (McASPRxBufRead(SOC_MCASP_0_CTRL_REGS, 12) & 0xFFFF); // Mask upper 16 bits to obtain left channel sample
    }
    
    unsigned int RightInputSample(void)
    {
        return (McASPRxBufRead(SOC_MCASP_0_CTRL_REGS, 12) >> 16); // Shift right to obtain right channel sample
    }

    在您的代码中,您可以调用 LeftInputSample() 和 RightInputSample() 函数分别获取左右声道样本。 例如:

    if(status & MCASP_TX_STAT_CURRSLOT_EVEN)
    {
        // Read right channel data
        sample_r = RightInputSample();
        // Process right channel data here...
        
        // Output right channel data
        OutputSample(sample_r);
    }
    else
    {
        // Read left channel data
        sample_l = LeftInputSample();
        // Process left channel data here...
        
        // Output left channel data
        OutputSample(sample_l);
    }

    请注意,这假设 McASP 配置为以立体声模式接收音频样本。 如果 McASP 配置不同,您可能需要相应地修改代码。

  • 您好我想请问一下怎么配置MCASP立体声模式接收音频样本呢?TDM兼容I2S协议是立体声模式吗?

  • 您好我刚刚尝试了您的方法,我这里输出接了扬声器,左右扬声器都没有声音,请问您知道是什么原因吗?原始代码这里左右扬声器都能接收到InputSample的左右声道音频。

  • 抱歉,这部分内容我们支持有限,请贴出您使用的SDK,并再次总结一下您目前需要咨询的问题,我帮您将问题升级到英文论坛,会有产品线专家给你支持。

  • 在该代码中,line out接口的左右声道都可以接收到mic in接口的左右声道的音频,我想要获取mic in接口的左声道和右声道的数据,但是无法获取。也就是获取inputleftsample和inputrightsample 的数据进行处理。

  • 要配置MCASP接收立体声音频样本,您需要将AIC3106编解码器配置为输出I2S或DSP模式的立体声数据。接下来,在MCASP中开启I2S或DSP模式,并设置为立体声输入

  • void McASPI2SRxConfigure(unsigned char wordSize,unsigned char slotSize,
    unsigned int slotNum, unsigned char modeDMA)
    {
    // 复位
    McASPRxReset(SOC_MCASP_0_CTRL_REGS);

    switch(modeDMA)
    {
    case MCASP_MODE_DMA:
    // 使能 FIFO
    McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);

    // 设置接收 word 和 slot 的大小
    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, wordSize, slotSize,
    MCASP_RX_MODE_DMA);
    break;
    case MCASP_MODE_NON_DMA:
    // 设置接收 word 和 slot 的大小
    McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, wordSize, slotSize,
    MCASP_RX_MODE_NON_DMA);
    break;
    }

    // 初始化帧同步,TDM 格式使用 slot 个数,对齐帧同步信号的上升沿
    McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, slotNum, MCASP_RX_FS_WIDTH_WORD,
    MCASP_RX_FS_EXT_BEGIN_ON_RIS_EDGE);

    // 初始化接收时钟,使用外部时钟,时钟上升沿有效
    McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
    McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
    McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
    0x00, 0xFF);

    // 使能发送接收同步
    McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
    McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);

    // 使能 接收 slot
    McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, (1 << slotNum)-1);

    // 设置串行器,设置12通道接收
    McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);

    // 初始化 McASP 引脚,和引脚输入输出方向
    McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
    McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
    | MCASP_PIN_ACLKX
    | MCASP_PIN_AXR(MCASP_XSER_RX));
    }

    // 连接 MIC IN 连接到 ADC
    I2CRegWrite(baseAddr, AIC31_P0_REG17, 0x0F);
    I2CRegWrite(baseAddr, AIC31_P0_REG18, 0xF0);

    // MIC IN 上电
    // I2CRegWrite(baseAddr, AIC31_P0_REG25, 0x40); // 2.0V
    I2CRegWrite(baseAddr, AIC31_P0_REG25, 0x80); // 2.5V
    // I2CRegWrite(baseAddr, AIC31_P0_REG25, 0xc0); // AVDD

    您好,我这里aic3106是设置了左右声道的ADC和DAC,这里的mcasp是设置了TDM兼容I2S协议的模式,不知道是这个意思吗?

  • 你看看示例对比下,我也看得脑袋乱乱的。

    以下是一份可能用于配置MCASP立体声模式的代码示例:

    void McASPI2SRxConfigure(unsigned char wordSize,unsigned char slotSize,
    unsigned int slotNum, unsigned char modeDMA)
    {
        // 复位
        McASPRxReset(SOC_MCASP_0_CTRL_REGS);
    
        switch(modeDMA)
        {
            case MCASP_MODE_DMA:
                // 使能 FIFO
                McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
                // 设置接收 word 和 slot 的大小
                McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, wordSize, slotSize,
                                 MCASP_RX_MODE_DMA);
                break;
            case MCASP_MODE_NON_DMA:
                // 设置接收 word 和 slot 的大小
                McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, wordSize, slotSize,
                                 MCASP_RX_MODE_NON_DMA);
                break;
        }
    
        // 初始化帧同步,TDM 格式使用 slot 个数,对齐帧同步信号的上升沿
        McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, slotNum, MCASP_RX_FS_WIDTH_WORD,
                            MCASP_RX_FS_EXT_BEGIN_ON_RIS_EDGE);
    
        // 初始化接收时钟,使用外部时钟,时钟上升沿有效
        McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
        McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
        McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
                              0x00, 0xFF);
    
        // 使能发送接收同步
        McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
        McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_EXTERNAL, 0, 0);
    
        // 使能 接收 slot
        McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, (1 << slotNum)-1);
    
        // 配置立体声模式
        McASPRxSerConfigure(SOC_MCASP_0_CTRL_REGS, MCASP_RX_SER_MODE_RJUST_FST,
                            MCASP_RX_SER_ALIGN_TYPE_DATA, MCASP_RX_SER_NUM_2);
    
        // 初始化 McASP 引脚,和引脚输入输出方向
        McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
        McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
                           | MCASP_PIN_ACLKX
                           | MCASP_PIN_AXR(MCASP_XSER_RX));
    }
    

    在这段代码中,我们增加了用于配置立体声模式的函数调用McASPRxSerConfigure()。具体来说,该函数允许你设置左右声道的数据在哪些时隙上进行传输,并且还需要指定数据对齐方式。在这个例子中,我们选择使用右对齐方式,并将数据放置在第一个时隙和第二个时隙上。

    需要注意的是,在使用此代码之前,您需要确保硬件支持立体声模式,并且需要根据实际情况修改一些参数。