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.

[参考译文] CCS/TLV320AIC3254:5535 I2S DMA 编解码器示例代码未按预期工作

Guru**** 2454880 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/733179/ccs-tlv320aic3254-5535-i2s-dma-codec-example-code-not-working-as-intended

器件型号:TLV320AIC3254

工具/软件:Code Composer Studio

你(们)好

我正在尝试制作一个使用 DMA 通过 I2S 总线从 AIC3204编解码器读取/写入 DSP 的应用。

我计划使用   CCS_v6.x_examples 中 的 CSL_I2S_AudioCodec_DMA 示例作为起点。

设置:

eZdsp 5535评估板。

Code Composer v8.1.0

我将 PC 连接到板上的插孔(麦克风)、并将一对耳机连接到插孔。

我已按照编辑 csl_general.h 头文件的说明进行操作、因此 删除了#define CHIP_C5517、而是 使用#define CHIP_C5535。

此外、如以下 所述、要启用麦克风偏置:http://processors.wiki.ti.com/index.php/Porting_C5000_Teaching_ROM_to_C5535_eZdsp#Configuring_a_Microphone_as_Input_to_the_C5535_eZdsp 

我已添加到 CODE_AIC3254.c:

/* ADC 路由和上电*/

AIC3254_Write (0、0x01、hi2c);   //选择第1页

AIC3254_Write (51、0x48、hi2c);   //使用 LDO-IN 为麦克风偏置加电

AIC3254_Write (0x34、 0x10、hi2c);   //使用 LDO-IN 为麦克风偏置加电

我现在有直通音频、但质量是不可接受的。 音频噪声受频带限制且具有明显的伪影。

作为完整性检查、我已经尝试过 ezdsp5535_BSL_RevC 文件夹中的引导后应用程序、它具有音频回送例程、这里的音频非常完美。 但是、此示例不使用 DMA。

我怀疑 AIC3204编解码器设置不正确、但可能是错误的?

但是、如果我查看 Idleloop.h 文件、我会发现以下定义:

#define NUM_SAMP_PER_MS (16)//每毫秒样本数
#define NUM_MS_PER_FRAME (20)//每帧秒

这表明采样率旨在为16kHz、但主函数包含以下内容:

/*初始化 AIC3204编解码器*/
状态= AIC3254_INIT (48000、48000、PLL_MHz);

这表示编解码器应以48kHz 的频率运行。 但是 、AIC3254_INIT 函数实际上不使用前两个参数(48、48000、48000)、这对我来说更令人困惑。

期待收到能解决我的问题的任何建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Thomas、

    欢迎使用 E2E、感谢您关注我们的产品!

    这个问题似乎与代码集成更相关;因此、我的处理器论坛同事可能可以帮助解决这个问题。 我可以帮助检查 AIC3254的特定配置以查看它是否有问题、但需要知道用于配置编解码器的所有寄存器设置和系统级信息、例如处理器提供的时钟频率和采样率。  如果原始代码设置为48kHz、并且在新配置中使用16KHz 采样率、则需要调整编解码器内的时钟系数和分频器。 根据您的描述、我认为这可能是您遇到的问题。

    此致、

     Diego Melendez López í a
      音频应用工程师

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Diego、感谢您的回答。

    我没有更改编解码器寄存器、因此它们仍然配置为默认设置、如 TI CSL_I2S_AudioCodec_DMA 示例中 CODEC _AIC3254.c 中提供的那样:

    AIC3254_Write (0、0x00、h2c); //选择 PAGE 0
    AIC3254_Write (1、0x01、h2c); //重置编解码器
    AIC3254_Write (0、0x01、h2c); //选择第1页
    AIC3254_Write (1、0x08、h2c); //从中禁用粗 AVDD 生成
    AIC3254_Write (2、0x01、h2c); //禁用模拟块
    
    // PLL 和时钟配置和上电
    AIC3254_Write (0、0x00、h2c); //选择 PAGE 0
    AIC3254_Write (27、0x00、h2c); // BCLK 和 WCLK 被设置为 I/p 至 AIC3204 (从器件)
    AIC3254_Write (4、0x07、h2c); // PLL 设置:PLLCLK <- BCLK 和 CODEC _CLKIN <-PLL CLK
    AIC3254_Write (6、0x08、h2c); // PLL 设置:J = 32
    AIC3254_Write (7、0、h2c); // PLL 设置:hi_Byte (D)
    AIC3254_Write (8、0、h2c); // PLL 设置:LO_BYTE (D)
    
    //进行48KHz 采样
    AIC3254_Write (5、0x92、h2c); // PLL 设置:为 PLL 加电、P=1和 R=2
    AIC3254_Write (13、0x00、h2c); //高字节(DOSR):DOSR = 128十进制或0x0080 DAC 过采样
    AIC3254_Write (14、0x80、h2c); // LO_Byte (DOSR)表示 DOSR = 128十进制或0x0080
    AIC3254_Write (20、0x80、h2c); // AOSR = 128十进制或0x0080、抽取滤波器为1至6
    AIC3254_Write (11、0x88、h2c); //为 NDAC 加电并将 NDAC 值设置为4
    AIC3254_Write (12、0x82、h2c); //为 MDAC 加电并将 MDAC 值设置为2
    AIC3254_Write (18、0x88、h2c); //加电 NADC 并将 NADC 值设置为4
    AIC3254_Write (19、0x82、h2c); //加电 mAdc 并将 mAdc 值设置为2
    
    // DAC 路由和上电
    AIC3254_Write (0、0x01、h2c); //选择第1页
    AIC3254_Write (12、0x08、h2c); //路由到 HPL 的 LDAC AFIR
    AIC3254_Write (13、0x08、h2c); // RDAC AFIR 路由到 HPR
    AIC3254_Write (0、0x00、h2c); //选择 PAGE 0
    AIC3254_Write (64、0x02、h2c); //左容积=右容积
    AIC3254_Write (65、0x00、h2c); //左 DAC 增益至0dB VOL;右跟踪左侧
    AIC3254_Write (66、0x00、h2c); //左 DAC 增益至0dB VOL;右跟踪左侧
    
    AIC3254_Write (63、0xd4、h2c); //向左、向右加电数据路径并设置通道
    AIC3254_Write (0、0x01、h2c); //选择第1页
    AIC3254_Write (16、0x06、h2c); //取消 HPL 静音,0dB 增益
    AIC3254_Write (17、0x06、h2c); //取消 HPR 静音,0dB 增益
    AIC3254_Write (9、0x30、h2c); //加电 HPL、HPR
    AIC3254_Write (0、0x00、h2c); //选择 PAGE 0
    
    对于(looper = 0;looper < 500;looper++)
    {
    ;//等待
    }
    
    // ADC 路由和上电
    AIC3254_Write (0、0x01、h2c); //选择第1页
    AIC3254_Write (52、0x30、h2c); //立体声1插孔
    //将 IN2_L 更改为 LADC_P、阻值为40千欧
    AIC3254_Write (55、0x30、h2c); //将 IN2_R 更改为 RADC_P、直到40kohmm
    AIC3254_Write (54、0x03、h2c); // CM_1 (共模)到 LADC_M (40千欧)
    AIC3254_Write (57、0xC0、h2c); // CM_1 (共模)到 RADC_M (40千欧)
    AIC3254_Write (59、0x0F、h2c); // MIC_PGA_L 取消静音
    AIC3254_Write (60、0x0F、h2c); // MIC_PGA_R 取消静音
    AIC3254_Write (0、0x00、h2c); //选择 PAGE 0
    AIC3254_Write (81、0xc0、h2c); //为左侧和右侧 ADC 加电
    AIC3254_Write (82、0x00、h2c); //取消左右 ADC 的静音
    AIC3254_Write (0、0x00、h2c);
    
    对于(looper = 0;looper < 200;looper++)
    {
    ;//等待
    } 

    正如我在第一篇文章中提到的、我唯一使麦克风偏置电压能够将我的 PC 用作线路输入:

    AIC3254_Write (51、0x48、h2c); //使用 LDO-IN 为麦克风偏置加电 

    PLL 设置为默认的100MHz

    对于此应用、我需要编解码器 ADC 和 DAC 以48kHz 的频率运行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我花了一些时间尝试调试这个问题、似乎我找到了一个解决方案。 我将记录解决方案、以帮助将来可能遇到同样问题的任何人。

    首先、 CSL_I2S_AudioCodec_DMA  示例不是以48kHz 的频率运行、即使注释中暗示了这一点。 我通过在系统中进行频率扫描验证了这一点、它显示了该示例以16kHz 采样率运行。

    按照这2个步骤使编解码器以48kHz 的频率运行。

    步骤1:使用    CSL_I2S_IdleLoop  示例中的配置替换 CODE_AIC3254.c 中的编解码器配置、因为我已经验证这会使编解码器以48kHz 的频率运行。

    步骤2:新编解码器配置将 BCLK 和 WCLK 配置为输出、这意味着编解码器将是主器件。 要确保 c5535设置为从器件、您需要从 codec_AIC3254.c 中删除这些行

    I2S2_SRGR = 0x0015;
    I2S2_ICMR = 0x0028;//启用中断
    I2S2_CR |= 0x0012;// 16位字、主器件、启用 I2C 

    但是、执行这些步骤后、音频质量仍然很差、但我发现这是由于在 AudioCodec_dma.c 中启动/停止 DMA 所致

    每当 dmaRxFrameCount dmaTxFrameCount 达到2时、DMA 传输就会停止(这意味着中间 DMA 缓冲 区 i2sDmaReadBufLeft    和 i2sDmaReadBufRight 已填充且需要清空)。 然后、读取缓冲区的内容被复制到 for 循环中的写入缓冲区中、DMA 被再次启动。  

    要消除启动/停止 DMA 的需要、请执行以下操作:

    第1步:更改 DMA 配置、使左右写入通道使用  i2sDmaLeftBufRight 和  i2sDmaReadBufRight 作为源地址

    步骤2:从  UserAlgorith()函数中删除 dma_stop()调用

    如果您按照这些步骤操作、结果将是通过 I2S 总线使用 DMA 传输的48kHz 音频回送。