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.

[参考译文] PCM1863:PCM1863 上的辅助 ADC 控制检测在睡眠模式下无法正常工作。

Guru**** 2858300 points

Other Parts Discussed in Thread: PCM1863

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1637389/pcm1863-secondary-adc-control-sense-on-pcm1863-not-working-in-sleep-mode

器件型号: PCM1863

我将为音频应用使用 PCM1863 ADC。 这些连接按照所附的图像完成。 (注意:ADC_MCLK 未连接)我使用的是 NXP imx8 平台、且此器件使用内核驱动程序进行处理。

我尝试使该 ADC 在具有控制检测功能的睡眠模式(8 位数据)下工作、以检测一些直流电平(例如 NTC 温度传感器的输出)、并使用芯片上的辅助 ADC 监测电源电压。

  在睡眠模式下使用控制检测的原因是、当模拟音频输入 (VinL2 和 VinR2) 暂停/停止时、常规 16 位辅助 ADC 数据似乎不起作用、因为我认为音频时钟被切断且 ADC 停止工作。  

到目前为止已测试:
1.工作模式:
16 位辅助 ADC、模拟音频输入打开-->工作
16 位辅助 ADC、模拟音频输入关闭 -->停止(可能是因为时钟停止?)

2.睡眠模式:
8 位控制感应直流电平检测 、模拟音频输入打开-->工作  
8 位控制感应直流电平检测、 模拟音频输入关闭--> 数据寄存器 0x4E 始终读取 0x00、即使已启用它、我也从未获得用于直流电平变化的 INT_STAT 中断。

我已根据数据表完成了配置。 由于时钟随着音频输入停止、因此我打算在睡眠模式下使用片上内部振荡器作为时钟。 目标是确保 ADC 始终运行、以便持续监控温度和电源、而无论音频输入是否激活。

我的寄存器配置与该主题中的建议相同  
https://e2e.ti.com/support/audio-group/audio/f/audio-forum/926083/pcm1863-pcm1863-secondary-adc-operation-and-adc-value-conversion

我还启用 INT_STAT 中断以改变直流电平、并按照数据表部分中的步骤读取 8 位 ADC 值 9.5.3.6.1 更新系统设置  

请建议在我的情况下、为什么数据输出寄存器 0x4E 在没有音频输入时总是读 0x00、以及如何解决该问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您对 ADC 未处于活动状态时关闭的时钟的描述可能是有意无意的、但这是由驱动器和您的 MCU 而不是 ADC 引起问题。 当您运行 ALSA 命令时、驱动程序会将 I2C 写入 ADC、因此您的配置可能会在写入 I2C 和录制音频之间发生变化。 我想、IN3L 电平的变化仍需要存在时钟才能按预期工作。  

    您指的是通过音频输入运行录制吗? 之类的设置。 您是否可以共享正在运行的完整脚本? 当您使用 alsa 命令按顺序运行它时、会发生什么?

    此致、
    Mir

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

    您好、

    此外、为了避免器件在 ADC 停止时断电、您可以编辑 pcm186x.c 驱动程序文件、方法是在 SET_BIAS_LEVEL 中注释“pcm186x_POWER_OFF (component);“行:

    但让我们选择这作为最后的手段,因为这基本上消除了睡眠模式... 因此、在时钟始终开启的情况下、功耗始终较高。

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

    尊敬的 Mir:

    感谢您的答复。

    实际上我正在为此 ADC 使用自定义驱动器、而不是 TI 的驱动器。
    DAI 操作是这样的


    然后在启动和关断功能中、  
    我设置电源和振荡器电源。

    可能性
    /*开机*/
    regmap_write (priv->regmapPCM1863_power、0x70);
    regmap_write (priv->regmapPCM1863_OSC_POWER0x40);
    PRIV->sleep = false;


    关断

    /*启用静音以帮助防止在重新打开电源和 Vref 不稳定时出现可能的砰砰声*/

    regMAP_UPDATE_BITS
    (priv->regmapPCM1863_DSP_CTRL0x0F、0x0F);

    //将设备置于睡眠模式

    regmap_write (priv->regmap、PCM1863_power、0x72);
    priv->sleep = true;  

    ************************************************************************************************************************************


    然后我有一个 kthread 任务、用于监控直流电平:

    任务
    if
    (priv->sleep_mode){
            regmap_write (priv->regmapPCM1863_SIGDET_CH_MODE0x10);//设置控制检测输入// L3
            regmap_write (priv->regmapPCM1863_SIGDET_DC_REF_CH3_L0x00);  //将初始引用设置为 0
            regmap_write (priv->regmapPCM1863_AUXADC_SEL0x05);//将 L3 选择为 i/p

            regmap_update_bits (priv->regmapPCM1863_AUXADC_DATA_CTRL0x84、0x84);//读取直流值时无锁存
            regmap_update_bits (priv->regmapPCM1863_AUXADC_INT_EN0x04、0x04);//为控制检测启用 int
            regmap_read (priv->regmapPCM1863_AUXADC_INT_STAT&int_val);//检查控制检测 int

    此时我无法获得任何用于控制感应的中断。  INT_STAT  始终读取 0x00  

    和数据寄存器  0x4E  也是 0x00。
             if (int_val & bit (2)){  //输入中断
                 regmap_update_bits (priv->regmapPCM1863_AUXADC_INT_EN0x040x00);//暂时禁用控制检测中断
                 regmap_read (priv->regmapPCM1863_SIGDET_STAT&status);

              if (status &(bit (4))){  //检查哪个 i/p 导致了 int
                regmap_read (priv->regmapPCM1863_SIGDET_DC_LEVEL_CH3_L&LOW_BYTE);
                regmap_write (priv->regmapPCM1863_SIGDET_DC_REF_CH3_Llow_byte);   //设置对新直流值的引用
                regmap_write (priv->regmapPCM1863_SIGDET_STAT0xFF);
                regmap_write (priv->regmapPCM1863_SIGDET_STAT0x00);//清除 Sigdet_stat
              }

              regmap_update_bits (priv->regmapPCM1863_AUXADC_INT_EN0x04、0x04);// Re enable control sense int
            }
    }



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

    辅助 ADC 在 SLEEP 模式下是否应该能够使用内部振荡器时钟并仍输出直流电平数据? 但在这里、直到时钟在音频输入激活的情况下恢复。

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

    您好、

    我在浏览数据表时引用了 controlsense 功能、我发现可以在两个地方读取 controlsense - INT_STAT (0x61)、您正在执行的操作是 SIGDET_STAT (0x32)。 INT_STAT 是一个粘滞寄存器、不仅仅需要读取它才能复位、而 SIGDET_STAT 是检测到信号时的实时信息。 您还可以读取 AUXADC_DATA_CTRL (0x58) 以获得 16 位数据级别、或读取 SIGDET_DC_LEVEL_CH3_L (0x4e) 以获得 8 位数据级别。 但是、如果您要读取 INT_STAT 值、要复位、您需要禁用中断、将该通道的基准电平更改为当前电平、然后重新启用中断。

    您是否看到 SIGDET_STAT 寄存器或数据级别寄存器中的值发生变化? 如果是、那么您的步骤出现了问题。 我想我看不到您禁用 INT_EN 寄存器的位置、您是否可以在进入睡眠模式时尝试禁用 INT_EN、然后重新启用它?  

    另一个注意事项 — 如果您仍然没有收到中断,我想知道是否没有发生从外部 MCLK 切换到内部振荡器的情况、因为在启用睡眠模式时仍然有一个时钟打开。 您能否确保在更新 POWER 寄存器以将其置于睡眠模式之前禁用时钟?  

    此致、
    Mir

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

    您好、

    我能够让中断开始。 结果表明、需要在中设置相应的差值水平 SIGDET_DC_DIFF_CH3_L  寄存器。

    显然、仅当信号从设置为差值的基准变化时、才会触发中断。

    另外、关于您的最后一个注释、我仍然有一个问题。 我注意到、仅当音频时钟仍在运行时、器件才会进入睡眠模式。 如果音频时钟在器件可能进入睡眠状态之前停止、则数据寄存器  SIGDET_DC_LEVEL_CH3_L (0x4e) 始终返回 0x00。 这是预期的器件行为吗?

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

    您好、

    很高兴听到您的中断问题。 我只是放弃一些想法尝试时钟关闭... 但奇怪的是、它未按预期进入信号检测模式。  

    根据数据表中的该表、时钟关闭时、应该进入睡眠模式。 如果不是所有时钟都完全关闭或顺序不正确、也许它正在进入待机状态? 如果处于待机状态、则类似于表中所示的“时钟等待状态“。

    此致、
    Mir