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.

[参考译文] TLV320AIC3100:双二阶滤波器/DAC

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/965640/tlv320aic3100-biquad-filter-dac

器件型号:TLV320AIC3100

尊敬的团队:

我们的客户在通过 tlv320aic31xx.c 设置器件 DAC 的 Biquad 滤波器时遇到了挑战

我们通过电子邮件发送了第0页和第8页的第一个数据和寄存器转储。

此 E2E 帖子是客户(Tim)<>产品线(Pedro / Aaron)之间的直接沟通、因为我将休假。

此致
Martin

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

    您好、Tim、

    似乎您正在正确地写入第8页。 我想尝试查看器件是如何配置的、但仅具有第0页和第8页的寄存器转储。 是否可以为第1页发送寄存器转储?

    我将尝试在 EVM 上复制您的配置、以查看是否可以重现此问题。 我有一个问题、就是在轮询第8页寄存器1上的位 D0时、您是否要通过器件传递数据?

    此致、

    Aaron

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

    您好、Aaron、

    感谢您的回答。 芯片"就在那里"、我在设置寄存器值时不播放音乐。

    我应该关闭其他东西吗?

    # i2cset -f -y 1 0x18 0 1
    # i2cdump -f -y 1 0x18
        0 1 2 3 4 5 6 7 8 9 A b c d e f   0123456789abcdef
    00:01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00..........    
    10:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C4    ?
    20:86 3E 00 76 80 80 7f 4F 1D 00 20 86 00 80   ?>.v???OO?。 ???
    30:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    40:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    50:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    60:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    70:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    80:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    90:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    A0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    B0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    C0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    D0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    E0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    
    F0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    

    此致、
    Tim

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

    您好、Tim、

    对我们因节假日而在这里的延误表示歉意。  

    我将确保 BCLK 和 WCLK 已连接、并且在启用自适应模式时也尝试传递一些数据。 当位 D0设置为1时、系数将在器件运行时在下一个 WCLK 帧上切换。 可以尝试一下吗?

    此致、

    Aaron

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

    您好、Aaron、

    我尝试在(旧的、模拟的)示波器上测量 BCLK 和 WCLK。 明天我将与硬件工程师讨论。
    WCLK (I2S_SCLK)=~3V、~1.6us (625.0kHz)
    BCLK (I2S_FCLK)=~3V、~50.2us (19.92kHz)

    我播放了从20Hz 到20kHz 的扫描、然后运行"setbiquad.sh"脚本。 我注意到的唯一区别是声音。 似乎正在播放一个额外的正弦。

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

    您好、Tim、

    是否可以交换上面的 WCLK 和 BCLK 频率? 600kHz 的 WCLK 过高、19kHz 的 BCLK 频率过低。 WCLK 频率应等于采样率、因此如果互换、我认为您将以20kHz 的采样率运行。 是这样吗?  

    此致、

    Aaron

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

    在我上面的评论中,我的确切换了这两个,对不起。 WCLK 连接到 I2S_FCLK、BCLK 连接到 I2S_SCLK。

    在与"my"硬件工程师的讨论中、我们发现 MCLK 不起作用(至少焊盘上没有信号)。 我觉得我能发出一个声音有点奇怪。 我正在修复此 ATM、我明天会回来。

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

    Tim、

    感谢您的澄清。 我将等待您的回复。

    此致、

    Aaron Estrada

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

    Aaron、您好!

    我启用了12.5MHz、该位似乎仍然挂起。 我应该更改 tlv320aic31xx 驱动程序中的某个内容以使 DAC 正常工作、还是应该按原样工作? 启用 DAC 的先决条件是什么?

    谢谢。

    此致、
    Tim

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

    您好、Tim、

    根据我在第0页收到的寄存器配置、看起来 DAC 已断电。 您能在第0页的寄存器0x3F 中启用 DAC 吗?

    此致、
    Aaron Estrada

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

    您好、Tim、

    我继续在 EVM 上测试了自适应模式、并看到 D0和 D1位都切换。 我发现奇怪的是、如果您上次在 P0上转储寄存器、DAC 被禁用。 我会确保当您检查要切换的位时、器件已准备好在启用 DAC 的情况下进行回放、并且编解码器正在接收 BCLK 和 WCLK。  

    此致、

    Aaron Estrada

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

    您好、Aaron、

    我让它在一个器件上工作。 在多次尝试期间、我意外移除了启用 DAC。

    谢谢。

    此致、
    Tim Gruijters

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

    您好、Tim、

    很高兴听到这个消息。 您的系统现在是否按预期运行? 如果是、我可以关闭该线程。  

    此致、

    Aaron Estrada

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

    Aaron、您好!

    遗憾的是、将其添加到默认设置中不起作用。 错误:
    [3.588296]   ASOC-simple-card sound0:tlv320aic31xx-hifi <->202c000.SSI 映射正常
    [4.620986]   tlv320aic31xx-codec 1-0018:aic31xx_wait_bits:失败! 0x25应为0x88预期0x0 (0、0x80、500000us)
    [4.632078]   tlv320aic31xx-codec 1-0018:ASOC:POST_PMD:DAC 左侧事件失败:-1

    地址0x25是 DAC 标志寄存器。 根据数据表、"单声道 D 类驱动器加电"和"左通道 DAC 加电"。 我最想的是这是正确的:-)

    静态常量结构 reg_default aic31xx_reg_defaults[]={
       {AIC31XX_RESET、0x1}、
       {AIC31XX_RESET、0x0}、
       {AIC31XX_CLKMUX、0x00}、
       {AIC31XX_PLLPR、0x11}、
       {AIC31XX_PLLJ、0x04}、
       {AIC31XX_PLLDMSB、0x00}、
       {AIC31XX_PLLDLSB、0x00}、
       {AIC31XX_NDAC、0x01}、
       {AIC31XX_MDAC、0x01}、
       {AIC31XX_DOSRMSB、0x00}、
       {AIC31XX_DOSRLSB、0x80}、
       {AIC31XX_NADC、0x01}、
       {AIC31XX_mAdc、0x01}、
       {AIC31XX_AOSR、0x80}、
       {AIC31XX_IFACE1、0x00}、
       {AIC31XX_DATA_OFFSET、0x00}、
       {AIC31XX_IFACE2、0x00}、
       {AIC31XX_BCLKN、0x01}、
       {AIC31XX_DACSETUP、 0x14}、
       {AIC31XX_DACMUTE、0x0c}、
       {AIC31XX_LDACVOL、0x00}、
       {AIC31XX_RDACVOL、0x00}、
       {AIC31XX_ADCSETUP、0x00}、
       {AIC31XX_ADCFGA、0x80}、
       {AIC31XX_ADCVOL、0x00}、
       {AIC31XX_HPDRIVER、0x04}、
       {AIC31XX_SPKAMP、0x06}、
       {AIC31XX_DACMIXERROR、0x00}、
       {AIC31XX_LANALOGUEHPL、0x7f}、
       {AIC31XX_RANALOGEHPR、0x7f}、
       {AIC31XX_LANALOGUESPL、0x7f}、
       {AIC31XX_RANALOGUESLR、0x7f}、
       {AIC31XX_HPLGAIN、0x02}、
       {AIC31XX_HPRGAIN、0x02}、
       {AIC31XX_SPLGAIN、0x00}、
       {AIC31XX_SPRGAIN、0x00}、
       {AIC31XX_MICBIAS、0x00}、
       {AIC31XX_MICPGA、0x80}、
       {AIC31XX_MICPGAPI、0x00}、
       {AIC31XX_MICPGAMI、0x00}、
           /*已添加*/
       {AIC31XX_DACSETUP、b0}、
       {AIC31XX_DACMUTE、0x00}、
       {AIC31XX_REG (8、 2)、(TLV320AIC3XXX_FILTER_N0和0xFF00)>> 8}、// N0 MSB:0x7d *
       {AIC31XX_REG (8、 3)、(TLV320AIC3XXX_FILTER_N0和0xFF)}、       /* N0 LSB:0x00 */
       {AIC31XX_REG (8、 4)、(TLV320AIC3XXX_FILTER_N1和0xFF00)>> 8}、// N1 MSB:0x82 */
       {AIC31XX_REG (8、 5)、(TLV320AIC3XXX_FILTER_N1和0xFF)}、       // N1 LSB:0xFF */
       {AIC31XX_REG (8、 6)、(TLV320AIC3XXX_FILTER_N2和0xFF00)>> 8}、/* N2 MSB:0x7d */
       {AIC31XX_REG (8、 7)、(TLV320AIC3XXX_FILTER_N2和0xFF)}、       // N2 LSB:0x00 *
       {AIC31XX_REG (8、 8)、(TLV320AIC3XXX_FILTER_D1和0xFF00)>> 8}、// D1 MSB:0x7c */
       {AIC31XX_REG (8、 9)、(TLV320AIC3XXX_FILTER_D1和0xFF)}、       // D1 LSB:0xf7 */
       {AIC31XX_REG (8、10)、(TLV320AIC3XXX_FILTER_D2 & 0xFF00)>> 8}、// D2 MSB:0x85 *
       {AIC31XX_REG (8、11)、(TLV320AIC3XXX_FILTER_D2 & 0xFF)}、       // D2 LSB:0xec */
    };

    谢谢、
    Tim

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

    将0x00更改为0x88不能解决问题:

    tlv320aic31xx-codec 1-0018:aic31xx_wait_bits:失败! 0x25应为0x88预期0x88 (0、0x80、500000us)

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

    您好、Tim、

    看起来 DAC 仍处于断电状态。 该错误看起来会被抛出、因为它正在读取寄存器0x25而看不到0x88 (当寄存器0x25读取0x88时、DAC 通电)。  

    AIC31XX_DACSETUP 是 DAC 可加电的地方。  

    此致、

    Aaron Estrada

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

    Hallo Aaron、

    我认为这不是真的、因为它是在 snd_SOC_DAPM_POST_PMD 事件下在 aic31xx_dapm_power_event 中触发的。 该值被屏蔽、且两者都必须为0、但它没有考虑到可以启用另一个 DAC)。

       案例 SND_SOC_DAPM_POST_PMD:
          返回 aic31xx_wait_bits (aic31xx、reg、mask、0、5000、 100);

    我仍然得到错误:

    [2.621239]   tlv320aic31xx-codec 1-0018:aic31xx_wait_bits:失败! 0x25应为0x88预期0x0 (0、0x80、500000us)(((位和掩码)= 0x80)
    [2.632370]   tlv320aic31xx-codec 1-0018:ASOC:POST_PMD:DAC 左侧事件失败:-1

    调试后、似乎不允许在 aic31xx_codec_probe 中启用 DAC。 我添加了以下内容:

    静态常量结构 reg_default aic31xx_biquad_a[]={
       /* DAC Biquad A */
       {0x0、0x0}、//页
       {AIC31XX_DACMUTE、0x00}、
       {AIC31XX_DACSETUP、b0}、
       {0x0、0x8}、//页
       {AIC31XX_REG (8、 2)、(TLV320AIC3XXX_FILTER_N0和0xFF00)>> 8}、// N0 MSB:0x7d *
       {AIC31XX_REG (8、 3)、(TLV320AIC3XXX_FILTER_N0和0xFF)}、       /* N0 LSB:0x00 */
       {AIC31XX_REG (8、 4)、(TLV320AIC3XXX_FILTER_N1和0xFF00)>> 8}、// N1 MSB:0x82 */
       {AIC31XX_REG (8、 5)、(TLV320AIC3XXX_FILTER_N1和0xFF)}、       // N1 LSB:0xFF */
       {AIC31XX_REG (8、 6)、(TLV320AIC3XXX_FILTER_N2和0xFF00)>> 8}、/* N2 MSB:0x7d */
       {AIC31XX_REG (8、 7)、(TLV320AIC3XXX_FILTER_N2和0xFF)}、       // N2 LSB:0x00 *
       {AIC31XX_REG (8、 8)、(TLV320AIC3XXX_FILTER_D1和0xFF00)>> 8}、// D1 MSB:0x7c */
       {AIC31XX_REG (8、 9)、(TLV320AIC3XXX_FILTER_D1和0xFF)}、       // D1 LSB:0xf7 */
       {AIC31XX_REG (8、10)、(TLV320AIC3XXX_FILTER_D2 & 0xFF00)>> 8}、// D2 MSB:0x85 *
       {AIC31XX_REG (8、11)、(TLV320AIC3XXX_FILTER_D2 & 0xFF)}、       // D2 LSB:0xec */

    };

    静态 int aic31xx_codec_probe (struct snd_soc_codec *编解码器){
       /*原始初始化代码..  *
       RET = aic31xx_add_controls (编解码器);
       如果(RET){
          printk (Kern_ERR "错误 aic31xx_add_control\n");
          回程;
       }

       RET = aic31xx_add_widget (CODEC);
       如果(RET){
          printk (Kern_ERR "错误 aic31xx_add_widget\n");
          回程;
       }
       对于(i = 0;i < array_size (aic31xx_biquad_a);i++){
          printk (Kern_ERR "迭代%d\n"、i);
          SND_SoC_WRITE (编解码器、aic31xx_biquad_a[i].reg、aic31xx_biquad_a[i].def);
       }
       回程;

    如果无法将驱动程序中的 DAC 添加到 aic31xx_reg_defaults 中、应如何在驱动程序中启用 DAC? 您是否有一个示例展示了如何在 tlv320aic31xx 驱动程序中启用 DAC?

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

    Tim、您好!

    我想您可以使用 amixer 命令来启用 DAC。 我没有启用 DAC 的具体示例、但我在 这里包含了 E2E 帖子 、其中显示了一些 Linux 命令和可用控件。 请告诉我这是否有帮助。  

    此致、

    Aaron Estrada

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

    Aaron、您好!

    我在 Android 设备上使用内核、因此我只使用了 tinymix。

    TinyMix -D 0 4 1               #启用       扬声器驱动程序播放开关
    TinyMix -D 0 5 2               #设置          扬声器驱动程序播放音量 2
    TinyMix -D 0 6 115             #设置          扬声器模拟播放音量 115
    Tinymix -D 0 7 131         131 #设置          DAC 播放音量            131 131
    TinyMix -D 0 11单声道           #设置          DAC 左输入                 单声道
    TinyMix -D 0 19 1              #启用       左侧 DAC 的输出
    TinyMix -D 0 24 1              #启用       扬声器开关

    那么、您说的是、我无法在驱动程序本身中启用 DAC?

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

    Tim、

    让我跳一下、看看我是否能提供帮助。 为了提供一些背景信息、驱动程序首先使用 aic31xx_I2C_probe 来探测 AIC31xx。  然后、在加载驱动程序时、它会执行 aic31xx_codec_probe。 但是、其他 ALSA 命令可以执行驱动程序的任何其他部分:aic31xx_set_jack、aic31xx_set_bias _level 或 common31xx_snd_controls。 编写该驱动程序的目的是使 ALSA 小工具(common31xx_dapm_widget)可以调用 aic31xx_dapm_power_event 来打开 DAC 通道。

    我们这里没有 Android 系统可以尝试、但似乎 alsamixer 控件位于微型混频器中。 启用 DAC 左侧或 DAC 右侧会调用 启用 DAC 通道的 aic31xx_dapm_power_event  

    您还可以在 aic31xx_codec_probe 的末尾进行编码、以启用 DAC 通道、类似于 aic31xx_dapm_power_event 设置 AIC31XX_DACFLAG 寄存器的方式。

    此致、
    佩德罗

x 出现错误。请重试或与管理员联系。