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.

[参考译文] TLV320AIC3206:右耳机驱动器(HPR)电源状态标志在关断后不会清除

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1454501/tlv320aic3206-right-headphone-driver-hpr-power-status-flag-doesn-t-clear-after-shutting-down

器件型号:TLV320AIC3206

工具与软件:

我不使用音频芯片、DSP 工程师在度假、但我被分配了一个关键错误。 我已将该错误定位到以下代码片段中:

                    codecSpiWrite(1, 12, 0x00, cs);  // Nothing -> HPL
                    codecSpiWrite(1, 13, 0x00, cs);  // Nothing -> HPR
                    codecSpiWrite(1, 14, 0x00, cs);  // Nothing -> LOL
                    codecSpiWrite(1, 15, 0x00, cs);  // Nothing -> LOR
                    timeOut = 10000;
                    while (((codecSpiRead(0, 37, cs) & 0x66) != 0) && (timeOut-- != 0));

"页0/寄存器37:DAC 标志寄存器1"的位1永远不会变为零、因此 while 循环需要很长时间(>200ms)并最终超时。 这意味着 HPR 在预期断电时似乎已上电。  有人能指出解决这个问题的正确方向吗?

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

    尊敬的 Bengt:

    你可以确认该标志确实是永久卡住,它不清楚后一个数量超过200毫秒? 它就是 HPR 被卡住了、不是 HPL、也不是 LOL 或 LOR 中的任何一个?

    您的代码中的断电步骤在哪里? (第1页寄存器9)。

    此致、
    Jeff McPherson

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

    尊敬的 Jeff:

    如果我取消对超时变量的检查、那么它确实会 一直停留在循环中。 不过、当我今天运行测试时、 它不再是位1不会变为低电平、而是位5 ("左侧耳机驱动器(HPL)电源状态标志")。

    整个流程 是这样的(我删除了 cs、芯片选择、参数、因为它不会添加任何有用的信息)。

     muteDAC (left_and_right):

      CodecSpiWrite (0、64、0x0C)

    powerDAC (无):

       CodecSpiWrite (0、63、0x14);
      超时= 10000;
      while (((codecSpiRead (0、37)& 0x88)!= 0)&&(超时--!= 0));
      codecSpiWrite (0、60、0x10);

    interfaceOut (interface_output_none、interface_output_none):

      CodecSpiWrite (1、12、0x00);//没有任何变化-> HPL
      CodecSpiWrite (1、13、0x00);//没有任何变化-> HPR
      CodecSpiWrite (1、14、0x00);//没有任何变化-> LOL
      CodecSpiWrite (1、15、0x00);//没有任何变化-> LOR
      超时= 10000;
      while (((codecSpiRead (0、37)& 0x66)!= 0)&&(TIMEOUT--!= 0);  //超时!!!

    似乎没有对页1寄存器9进行写入。

    此致、

    Bengt

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

    尊敬的 Bengt:

    第1页寄存器9可以启动 HPL 和 HPR 驱动器。  

    如果未设置此寄存器(我认为 powerDAC (none)暗示了这一点)、则我会在代码中使用暂停/断点来尝试查看何时设置故障标志。 奇怪的是、它现在已翻转了通道。 理想情况下、该值应保持为0、因为 DAC 从未上电、但在它变为高电平时向下跟踪可能会有所帮助。

    此致、
    Jeff McPherson

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

    尊敬的 Bengt:

    感谢您发送编修。

    我还注意到 DAC_POWER (NONE)函数中有类似的循环。 我假设该环路正在正确清除?

    定序是否也有任何影响? 比如、如果将页1/寄存器9写入移到关断序列的最开始位置、它是否仍然会卡住?

    谢谢!
    Jeff McPherson

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

    尊敬的 Jeff:
    如果我在关断序列期间在 SPI 总线驱动器中记录流量、会 得到以下结果:

    4.用户事件关闭

    0 64 12. DAC 通道设置寄存器2   
    0 63. 20. DAC 通道设置寄存器1   
    0 37. Polling DAC 标志寄存器1 轮询成功
    0 60. 16. DAC 信号处理块控制寄存器   
    1. 12. 0 HPL 布线选择寄存器   
    1. 13. 0 HPR 路由选择寄存器   
    1. 14. 0 LOL 路由选择寄存器   
    1. 15. 0 LOR 布线选择寄存器   
    0 37. Polling DAC 标志寄存器1 投票超时!!!

    第一个轮询( DAC_POWER (NONE)内的轮询)成功。 很遗憾、我无法移动 页1/寄存器9写入、因为不存在这样的写入!

    现在、我刚刚写入的值只是一半的 true、如果我检查源代码、确实有一个写入 页1/寄存器9的值、但它在 if 语句内计算为 false:

     muteDAC (left_and_right):

      CodecSpiWrite (0、64、0x0C)

    powerDAC (无):

       CodecSpiWrite (0、63、0x14);
      超时= 10000;
      while (((codecSpiRead (0、37)& 0x88)!= 0)&&(超时--!= 0));
      codecSpiWrite (0、60、0x10);

    interfaceOut (interface_output_none、interface_output_none):

      CodecSpiWrite (1、12、0x00);//没有任何变化-> HPL
      CodecSpiWrite (1、13、0x00);//没有任何变化-> HPR
      CodecSpiWrite (1、14、0x00);//没有任何变化-> LOL
      CodecSpiWrite (1、15、0x00);//没有任何变化-> LOR

      if (!((codecInChargePumpMode &(1 << cs))!= 0)){  //求值为 false
        CodecSpiWrite (1、9、0x00);// Power Nothing
      }
      超时= 10000;
      while (((codecSpiRead (0、37)& 0x66)!= 0)&&(TIMEOUT--!= 0);  //超时!!!

    CodecInChargePumpMode 是一个 uint16_t 位掩码、用于跟踪不同编解码器的电荷泵已禁用/启用(我们的 PCB 上有多个编解码器)。 在发生故障的情况下、codecInChargePumpMode 为0x0004、Cs 为2、因此 if 语句的计算结果为 false。 我阅读 if 语句、如"如果电荷泵在特定的编解码器上被禁用、那么不加电"。
    此致、

    Bengt

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

    尊敬的 Bengt:

    我懂了。 我一定 误读了、因为你是对的、它不存在。 在这种情况下、驱动程序是如何关闭的、或者至少是预期驱动程序关闭的代码是如何关闭的? 第一个环路会检查 DAC 是否已断电、这可以正常工作、但第二个环路会断开输出、但随后会检查驱动器是否已断电、但如果没有页1/寄存器9、我不确定驱动器预计会如何断电。

    如果我对代码流程存在误解、请更正我。

    谢谢!
    Jeff McPherson

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

    尊敬的 Jeff:
    您似乎找到了错误。 我将通知编写此代码的 DSP 工程师。 非常感谢您的帮助!
    此致、

    Bengt