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.

[参考译文] TLV320AIC3254:AIC3254 PurePath miniDSP 直通静音、而非 miniDSP 工作

Guru**** 2812305 points

Other Parts Discussed in Thread: TLV320AIC3254

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1624642/tlv320aic3254-aic3254-purepath-minidsp-pass-through-silent-while-non-minidsp-works

部件号: TLV320AIC3254

您好、

我正在调试具有 FSC-BT1058 BT 模块作为 I2S 主器件的 AIC3254。
这是我自己的定制电路板上、我无法访问任何开发套件。

我的目标是本地侧音路径:

  • IN1_L -> ADC -> miniDSP_A -> miniDSP_D -> DAC -> LOL/LOR

当前设置:

  • BT1058 I2S:主器件、48kHz、24 位
  • BT1058 提供 MCLK、BCLK、WCLK
  • 编解码器当前使用 BCLK = 2.304MHz 作为 PLL 基准
  • IN1_L 上仅连接了一个麦克风

工作原理:

  • 非 miniDSP 版本可在同一硬件上工作
  • A2DP 播放和 HFP 下行链路在 miniDSP 模式下工作
  • 当我不加载 miniDSP 图像时、ADC→DAC 数字环回工作正常

失败的原因:

  • 加载/选择自定义 PurePath miniDSP 图像时、LOL/LOR 上没有麦克风音频
  • 我把图形缩小到最小的直通,但它仍然是无声的

我已检查的内容:

  • MICBIAS 和模拟输入布线与工作的非 miniDSP 版本匹配
  • LOL/LOR 进行布线、通电并取消静音
  • 选择自定义 miniDSP 块
  • miniDSP 图像显示为正确加载。 我通过回读验证了几个高位值
  • 我手写的 init 现在与导出的 SystemSettingsCode 匹配

我目前的结论:

  • 基本硬件和编解码器路径似乎可以
  • 此问题与自定义 miniDSP 图像和/或 miniDSP_A -> miniDSP_D 切换相关

问题:

  • 最小 IN1_L -> miniDSP_A -> miniDSP_D -> DAC -> LOL/LOR 路径是否有任何必需的 AIC3254 配置?
  • I²S 外部 BCLK/WCLK/MCLK 的 Δ I 从模式下、miniDSP_A -> miniDSP_D 直通是否有任何已知要求或限制?
  • 是否有已知良好的最小 AIC3254App8x4x 示例适用于 IN1_L 到 LOL/LOR 的单麦克风?
  • 还有其他问题吗?

随附:

我也尝试上传 pfw 和 cfg 文件、但遇到了错误。

 

sidetone.PNG

此致、
Marten

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

    尊敬的 Marten:

    您可能不知道的是 SystemSettingsCode、因此可以使用这里的 I2C 路由和时钟命令来解释 PPS。 您可以通过单击框架 (AIC3254App8x4x_1) 找到它、它将位于右侧的属性面板中。 如果您知道您的时钟设置、可以将它们填充到那里、并确保通过 I2C 启用 IN1_L 和 LOL/LOR 路径。 这些用于信号路由的命令接近尾声、我相信默认情况下这些命令不会按您想要的方式进行设置(从存储器来看,我认为 DAC 路由到 HPL/HPR 和 ADC 来自 IN2L,但可能是错误的)。 您打算同时使用哪些时钟? 默认情况下有几个采样率选项、但它需要 12.288MHz MCLK。 如果您使用不同的时钟、我可以帮助您计算需要的分频器。

    此致、
    Mir

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

    谢谢 Mir!

    我将所有内容从 SystemSettingsCode 移到了我自己的 codec_init ()。
    唯一剩下的是:


    ------------------------------------------------------------------------------------------------
    ;加载 miniDSP 代码
    ------------------------------------------------------------------------------------------------
    program_adc;miniDSP_A 系数和指令
    program_dac;miniDSP_D 系数和指令


    我的 codec_init() 执行系统设置代码中的所有操作、包括电源、时钟路由等
    我还保留了系统设置代码中的确切顺序。

    此外、相同的代码适用于 BT 调制解调器 (I2S) 到 LOL/LOR。

    采样率为 48kHz、这与我的 BT 模块相匹配。 这是我的时钟树(与上面的原始示例略有不同):

    • 时钟源:BCLK @ 2.304MHz(不理想,但在测试时运行)
    • PLL R = 4
    • PLL J = 32
    • PLL D = 0
    • PLL P = 3
    • NDAC、NADC = 2
    • MDAC、mAdc = 8
    • DOSR、AOSR = 128
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    SystemSettingsCode 的 program_adc 和 program_dac 段用于写入 miniDSP 代码。 将 PPS 流导出为代码时、它包括 SystemSettingsCode setup pre-miniDSP、然后是 miniDSP 代码、如果后面有更多代码、则是 SystemSettingsCode 的其余部分。 我建议遵循此顺序、以便它可以设置 miniDSP 之前的时钟、然后设置 miniDSP 之后的输入/输出。 这些分禾器看起来很好!  

    此致、
    Mir

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

    谢谢 Mir!

    是的、我理解这个流程、我相信我的 codec_init 的功能与 SytemSettingsCode 完全相同。
    由于某种原因,我不能附加文件或插入代码块,所以她用纯文本格式我的 codec_init ():


    bool codec_init (const codec_io_t *io)

    printf(“\n")“);

    /*-------------------------------------------------------------------------------- */
    /*软件保护/状态初始化*/
    /*-------------------------------------------------------------------------------- */

    //首先验证所需的 I/O 回调。
    IF ((IO = NULL)||(IO->i2c_write = NULL))

    返回 false;
    }

    // Idempotable init:如果已使用相同的回调集进行初始化、则成功。
    如果 (s_codec_G.IO_valid &&
    (s_codec_G.IO.i2c_write == Io->i2c_write)&&
    (s_codec_G.IO.i2c_read == IO->i2c_read)&&
    (s_codec_g.io.delay_ms =IO->delay_ms)&&
    (s_codec_g.io.user == IO->user))

    返回 true;
    }

    //从干净状态开始、然后存储平台挂钩。
    memset (&s_codec_g、0、sizeof (s_codec_g));
    S_CODEC_G.IO =*io;
    S_CODEC_G.IO_VALID = TRUE;
    s_codec_reset_state_defaults ();

    //小型本地宏、因此每个寄存器写入都将通过您现有的辅助程序。
    //这将页面选择+ I2C 写入处理集中在一个位置。
    #define W8 (PAGE、reg、val)\
    执行{\
    if(!s_codec_write_reg8 (page)、(reg)、(val))) goto fail;\
    } while (0)


    /*-------------------------------------------------------------------------------- */
    /*重置*/
    /*-------------------------------------------------------------------------------- */

    W8 (0U、0x01u、0x01u);// P0 R0x01:软件复位
    HAL_DELAY (10);



    /*-------------------------------------------------------------------------------- */
    /*电源/LDO 配置、符合 SLAA408A(单 LDOIN 电源)x */
    /*-------------------------------------------------------------------------------- */

    W8 (1U、0x01u、0x08u);//禁用弱 AVDD-DVDD 连接、启用模拟块
    W8 (1U、0x02u、0x01u);// AVDD LDO 上电

    //全芯片 CM = 0.9V;HPL/HPR 输出 CM = 1.65V、对于更大的 HP 摆幅(由 3.3V LDOIN 供电时)。
    // HPL/HPR 由 LDOIN 供电 (LDOIN 范围 1.8–3.6V);
    // LOL/LOR 由 LDOIN 供电 (LOL/LOR CM 强制为 1.65V)。
    W8 (1U、0x0Au、0x3Bu);

    W8 (1U、0x47u、0x31u);// P1 R0x47:设置输入上电时间;主要影响 ADC、否则无害
    W8 (1U、0x7Bu、0x01u);// P1 R0x7B:将 REF 充电时间设置为 40ms

    HAL_DELAY (40);


    /*-------------------------------------------------------------------------------- */
    /* miniDSP 程序下载挂钩*/
    /*-------------------------------------------------------------------------------- */

    printf(“[编【编解码器】miniDSP 下载开始\n“);
    如果(!codec_download_pps_script()) 返回失败;
    printf(“[编【编解码器】miniDSP 下载完成\n“);

    // PPS 将写入这些值
    //选择第 0 页
    // reg[0][0x52]= 0x00 ADC 精细增益、D7:Keft 静音、D3:右静音
    // reg[0][0x53]= 0x00 D7:保留、D6-0:LADC 音量
    // reg[0][0x54]= 0x00 D7:保留、D6-0:RADC 音量

    //回读
    uint8_t rreg=0;
    s_codec_read_regs (8u、0x38u、&rreg、1U);
    s_codec_read_regs (44u、0x48u、&rreg、1U);
    s_codec_read_regs (80u、0x28u、&rreg、1U);
    s_codec_read_regs (152u、0x68u、&rreg、1U);
    s_codec_read_regs (157u、0x68u、&rreg、1U);


    /*-------------------------------------------------------------------------------- */
    /* miniDSP / DAC 路径选择*/
    /*-------------------------------------------------------------------------------- */

    // miniDSP 块选择+功率耦合
     W8 (0U、0x3Cu、0x80u);//选择 miniDSP_D;A/D 功率加在一起(如果需要Left right arrowD 传输)
    W8 (0U、0x3Du、0x00u);//选择 miniDSP_A
    //W8 (0U、0x3Cu、0x01u);// mK — 环回调试
    //W8 (0U、0x3Du、0x01u);// mK — 环回调试

    W8 (0U、0x11u、0x08u);// miniDSP_D 中断= 8
    w8 (0U、0x17u、0x04u);// miniDSP_A decim = 4

    // IDAC、IADC
    W8 (0U、0x0Fu、0x02u);// IDAC MSB:IDAC = 512
    W8 (0U、0x10u、0x00u);// IDAC LSB
    W8 (0U、0x15u、0x01u);// IADC MSB:IADC = 256
    W8 (0U、0x16u、0x00u);// IADC LSB

    //处理块
    W8 (8u、0x01u、0x00u);// miniDSP_A 自适应=关闭
    W8 (44u、0x01u、0x00u);// miniDSP_D 自适应=关闭


    /*-------------------------------------------------------------------------------- */
    /*时钟多路复用器:PLL IN = BCLK、CODEC_CLKIN = PLL */
    /*-------------------------------------------------------------------------------- */

    // PLL 分频器
    W8 (0U、0x05u、0xB4u);// P=3、R=4、 PLL 开启
    W8 (0U、0x06u、0x20u);// J=32
    W8 (0U、0x07u、0x00u);// D MSB D=0.6667
    W8 (0U、0x08u、0x00u);// D LSB


    //时钟选择
    W8 (0U、0x04u、0x07u);// PLL_CLKIN=BCLK、CODEC_CLKIN=PLL_CLK

    //允许 PLL 锁定
    HAL_DELAY (50);


    /*-------------------------------------------------------------------------------- */
    /*时钟(I²S μ s 从器件至 BT_1、启用 48kHz 路径)*/
    /*-------------------------------------------------------------------------------- */

    // fs=48kHz、2.034MHz
    W8 (0U、0x0Cu、0x88u);// MDAC = 8、通电
    W8 (0U、0x0Du、0x00u);// DOSR MSB
    W8 (0U、0x0Eu、0x80u);// DOSR LSB = 128
    W8 (0U、0x12u、0x82u);// NADC = 2、通电
    w8 (0U、0x13u、0x88u);// mAdc = 8、通电
    W8 (0U、0x14u、0x80u);// AOSR = 128
    W8 (0U、0x0Bu、0x82u);// NDAC = 2、通电

    // I2S 设置
    W8 (0U、0x1Bu、0x20u);// I2S、24 位时隙、 BCLK/WCLK 输入(编解码器从器件)
    W8 (0U、0x1Cu、0x00u);//数据偏移= 0
    W8 (0U、0x1Du、0x00u);//默认极性、无环回
    //W8 (0U、0x1Du、0x10u);// MK — 环回调试


    /*-------------------------------------------------------------------------------- */
    /*麦克风偏置
    /*-------------------------------------------------------------------------------- */

    W8 (1U、0x33u、0x68u);// MICBIAS 保持启用状态(常开)


    /*-------------------------------------------------------------------------------- */
    /*输入路由/MicPGA */
    /*-------------------------------------------------------------------------------- */

    w8 (1U、0x34u、0x40u);// LEFT_P_TERM = IN1L 至 LADC+
    W8 (1U、0x36u、0x40u);// LEFT_N_TERM = CM 至 LADC-
    W8 (1U、0x37u、0x01u);// RIGHT_P_TERM = IN2L 至 RADC+
    W8 (1U、0x39u、0x40u);// RIGHT_N_TERM = CM 至 RADC-

    W8 (1U、0x3Bu、0x0Au);// L MicPGA =+5dB // mK — 可能需要微调
    W8 (1U、0x3Cu、0x0Au);// R MicPGA =+5dB // mK — 可能需要微调


    /*-------------------------------------------------------------------------------- */
    /* ADC 通道设置/静音状态/电源时序*/
    /*-------------------------------------------------------------------------------- */

    W8 (0U、0x51u、0xC0u);// ADC 左右 ADC 已上电
    W8 (0U、0x52u、0x00u);// ADC 微调和静音 — 0dB、取消静音

    w8 (0U、0x53u、0x00u);// ADC 左音量= 0dB
    W8 (0U、0x54u、0x00u);// ADC 右音量= 0dB

    W8 (0U、0x56u、0x00u);// AGC 左通道=关闭
    W8 (0U、0x5Eu、0x00u);// AGC 右通道=关闭

    HAL_DELAY (10);


    /*-------------------------------------------------------------------------------- */
    /*输出路由、电源和增益*/
    /*-------------------------------------------------------------------------------- */

    //将 DAC 重建滤波器输出路由到引脚
    W8 (1U、0x0Cu、0x08u);//来自左 DAC 的 HPL
    W8 (1U、0x0Du、0x08u);//来自右 DAC 的 HPR
    W8 (1U、0x0Eu、0x08u);//来自左 DAC 的 LOL
    w8 (1U、0x0Fu、0x08u);//来自右 DAC 的 LOR

    // DAC 上电
    w8 (0U、0x3FU、0xD4u);// DAC 电源和软步进

    //设置输出增益和静音
    W8 (1U、0x10u、0x40u);// P1 R0x10:HPL 增益 0dB、静音
    W8 (1U、0x11u、0x40u);// P1 R0x11:HPR 增益 0dB、静音

    //W8 (1U、0x12u、0x40u);// LOL 增益 0dB、静音
    //W8 (1U、0x13u、0x40u);//左增益 0dB、静音
    W8 (1U、0x12u、0x00u);// LOL 增益 0dB、未静音
    W8 (1U、0x13u、0x00u);//左通道增益 0dB、未静音

    //输出功率
    W8 (1U、0x09u、0x0Cu);// LOL/LOR 上电、HPL/HPR 断电
    HAL_DELAY (10);


    /*-------------------------------------------------------------------------------- */
    /* DAC 通道设置/静音状态/电源时序*/
    /*-------------------------------------------------------------------------------- */

    W8 (0U、0x40u、0x00u);// P0 R0x40:DAC 通道控制
    W8 (0U、0x41u、0x00u);// P0 R0x41:DAC 左增益= 0dB // mK — 可能需要微调
    W8 (0U、0x42u、0x00u);// P0 R0x42:DAC 右增益= 0dB // mK — 可能需要微调
    W8 (0U、0x43u、0x00u);// P0 R0x43:禁用耳机检测


    //----------------------------------------------------------------------------------------------------
    //结束
    //----------------------------------------------------------------------------------------------------

    //仅在完整序列成功后才初始化标记。
    S_CODEC_G.IO_VALID = TRUE;


    printf(“\n")“);

    #UNDEF W8.
    返回 true;

    失败:
    //此处显示任何辅助器故障(页面选择/I2C 写入/PPS blob 下载)。
    S_CODEC_G.IO_VALID = FALSE;
    S_CODEC_G.PAGE_CACHE_VALID = FALSE;
    #UNDEF W8.
    返回 false;
    }

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

    您是否仍有没有声音的问题? 此处定义 miniDSP 代码的位置? 您是否尝试过将所有配置放入系统设置代码中、然后仅使用 PPS 导出?

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

    一个多星期的时间,我终于得到了这个工作今天。

    更改此值:

        // IDAC, IADC
        W8(0u, 0x0Fu, 0x02u); // IDAC MSB: IDAC = 512
        W8(0u, 0x10u, 0x00u); // IDAC LSB
        W8(0u, 0x15u, 0x01u); // IADC MSB: IADC = 256
        W8(0u, 0x16u, 0x00u); // IADC LSB

    为此:

        // IDAC, IADC
        W8(0u, 0x0Fu, 0x04u); // IDAC MSB: IDAC = 1024
        W8(0u, 0x10u, 0x00u); // IDAC LSB
        W8(0u, 0x15u, 0x04u); // IADC MSB: IADC = 1024
        W8(0u, 0x16u, 0x00u); // IADC LSB
    

    与众不同。 我现在已经理解了这一点、但它的文档记录很差。

    此致、
    Marten

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

    尊敬的 Marten:

    很高兴听到这个消息。 将来、对于任何在线搜索此问题的人、如果 miniDSP 数字直通或数字旁路没有输出、请确保检查 IDAC/IADC 周期计数并使其足够高。 通常建议将 MDAC*DOSR 作为起点、我认为它需要等于或大于处理器执行所需处理所需的周期数。  

    但是、您是如何发现这一点的? 默认情况下、我在 AIC3254 的系统设置代码中看不到 IADC_/IDAC 设置... 我只是想知道你找到的有关这方面的文档,因为我不会一目了然地抓住它! 例如、我在 AIC3268 的 SSC 中看到了这种情况。

    此致、
    Mir

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

    尊敬的 Mir:

    我在系统设置代码中看到了这一点:

    乍一看,它们什么都不做,这就是为什么我在自己的 codec_init () 中省略了它们。 但我现在可以看到、拥有这些命令会在.cfg 文件中添加正确的寄存器写入。

    在“TLV320AIC3254 应用参考指南“中、如果 IDAC/IADC 几乎没有提及、但寄存器映射具有以下内容:

    刚才说 IDAC 必须是 INTERP 的倍数、而 IADC 必须是 DECIM 的倍数。
    它没有解释它是什么或它的作用。

    我的小型测试设计实际使用的周期数比原始设置少、但直到我将寄存器设置提高到 1024 后它才会开始工作。

    总之、如果您想构建自己的 CODEC_INIT 函数、请将所有寄存器设置从 SystemSettingsCode 传输到您自己的文件、并在 SystemSettingsCode 中仅保留以下内容:


    IDAC  = %%prop(miniDSP_D_Cycles)
    IADC  = %%prop(miniDSP_A_Cycles)
    
    PROGRAM_ADC		; miniDSP_A coefficients and instructions           
    PROGRAM_DAC		; miniDSP_D coefficients and instructions


    此致、
    Marten

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

    感谢您的参考、Marten。