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.

[参考译文] TLV320DAC3100:配置后 I2C 通信故障

Guru**** 2513185 points
Other Parts Discussed in Thread: TLV320DAC3100

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1049831/tlv320dac3100-i2c-communication-failure-after-configuring

器件型号:TLV320DAC3100

您好!

在定制电路板上配置 DAC3100后、我遇到了 I2C 通信问题、它定期读取和写入 NAK、从不恢复。 我直接从以前的定制板硬件版本移植了我的驱动程序、该版本已经使用多年。 我很难理解为什么驱动程序在新硬件上显示 I2C 通信错误。

旧硬件详细信息(工作):
DAC: DAC3100 TI 9AI AKH2 G4  *
AVDD:2.8V
SPKVDD:2.8V   *
IOVDD:2.8V
DVDD:1.8V
I2C 上拉电阻:1.5K Ω  *
新硬件详细信息(I2C 错误- NAK):
DAC: DAC3100 TI 131 C265 G4  *
AVDD:2.8V
SPKVDD:VBAT (4.0 - 4.2V) *
IOVDD:2.8V
DVDD:1.8V
I2C 上拉电阻:2.2K 欧姆  *
注意:硬件差异用星号*表示
寄存器配置(在旧硬件和新硬件上相同):
/* an array of address/value pairs */
static const uint8_t aInitRegs[] = {
  0x00, 0x00,   // select page 0
  0x01, 0x01,   // software reset
  0xFE, 1,      // delay 1 ms (Parser implements via vTaskDelay())

  0x00, 3,      // page 3
  0x10, 0x01,   // use internal osc for delay timers
                 
  0x00, 0x00,   // select page 0
  0x04, 0x03,   // PLL_CLKIN=MCLK, CODEC_CLKIN=PLL_CLK
  0x05, 0x11,
  0x06, 40,     // set PLL for DAC_FS=8KHz: J=40, R=1, D=0, P=1
  0x05, 0x91,
  0xFE, 10,     // delay 10 ms (Parser implements via vTaskDelay())

  0x0B, 0x81,   // NDAC=1
  0x0C, 0x90,   // MDAC=16
  0x0D, 0x02,   // DOSR=640
  0x0E, 0x80,
  
  0x1B, 0x00,   // mode I2S, wordlength 16, slave mode
  
  0x3C, 4,      // processing block 4

  0x00, 0x08,   // select page register 8
  0x01, 0x04,   // turn on adaptive filtering
  
  0x00, 0x01,   // analog blocks, select page register 1
  0x23, 0x40,   // LDAC routed to mixer/amp, RDAC not routed anywhere
  0x2A, 0x04,   // unmute class-D, 6 dB gain
  
  0x20, 0x86,   // power-up class-D
  0x26, 0x8C,   // left analog volume routed to class-D, vol = -6 dB
  
  0x00, 0x00,   // page 0
  0x3F, 0xB0,   // LDAC on, RDAC off, LDAC=(L+R)/2
  0x41, 0x30,   // LDAC gain 24 dB
  0x42, 0x81,   // RDAC gain -63 dB
  
  0x40, 0x00,   // unmute L,R channels
};
此时、如果我尝试读回新硬件上的寄存器、则会由于 NAK 而开始出现驱动程序错误。
i2c=1,2,30,00,00
Test I2C write
I2C write - Slave Addr: 0x30, Register: 0x00, Payload: 0x00
> i2c=0,2,30,04,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x04, Number of bytes: 1
Received: 0x03
> i2c=0,2,30,05,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x05, Number of bytes: 1
Received: 0x91
> i2c=0,2,30,06,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x06, Number of bytes: 1
Received: 0x28
>
> i2c=0,2,30,FE,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0xFE, Number of bytes: 1
I2C read failed
> i2c=0,2,30,0B,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x0B, Number of bytes: 1
I2C write failed
I2C read failed
奇怪的是、如果我从不配置 DAC3100寄存器并尝试读回所有寄存器、我没有 I2C 通信问题:
>
>
> i2c=1,2,30,00,00
Test I2C write
I2C write - Slave Addr: 0x30, Register: 0x00, Payload: 0x00
>
>
> i2c=0,2,30,04,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x04, Number of bytes: 1
Received: 0x00

> i2c=0,2,30,05,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x05, Number of bytes: 1
Received: 0x11
>
> i2c=0,2,30,06,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x06, Number of bytes: 1
Received: 0x04
>
> i2c=0,2,30,FE,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0xFE, Number of bytes: 1
Received: 0x00
>
> i2c=0,2,30,0B,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x0B, Number of bytes: 1
Received: 0x01
>
> i2c=0,2,30,0C,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x0C, Number of bytes: 1
Received: 0x01
>
> i2c=0,2,30,0D,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x0D, Number of bytes: 1
Received: 0x00
>
> i2c=0,2,30,0E,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x0E, Number of bytes: 1
Received: 0x80
>
> i2c=0,2,30,1B,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x1B, Number of bytes: 1
Received: 0x00
>
> i2c=0,2,30,3C,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x3C, Number of bytes: 1
Received: 0x01
>
> i2c=1,2,30,00,08
Test I2C write
I2C write - Slave Addr: 0x30, Register: 0x00, Payload: 0x08
>
> i2c=0,2,30,01,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x01, Number of bytes: 1
Received: 0x00
>
> i2c=1,2,30,00,01
Test I2C write
I2C write - Slave Addr: 0x30, Register: 0x00, Payload: 0x01
>
> i2c=0,2,30,23,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x23, Number of bytes: 1
Received: 0x00
>
> i2c=0,2,30,2A,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x2A, Number of bytes: 1
Received: 0x00
>
> i2c=0,2,30,20,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x20, Number of bytes: 1
Received: 0x06
>
> i2c=0,2,30,26,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x26, Number of bytes: 1
Received: 0x7F
>
> i2c=1,2,30,00,00
Test I2C write
I2C write - Slave Addr: 0x30, Register: 0x00, Payload: 0x00
>
> i2c=0,2,30,3F,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x3F, Number of bytes: 1
Received: 0x14
>
> i2c=0,2,30,41,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x41, Number of bytes: 1
Received: 0x00
>
> i2c=0,2,30,42,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x42, Number of bytes: 1
Received: 0x00
>
> i2c=0,2,30,40,1
Test I2C read
I2C read - Slave Addr: 0x30, Register: 0x40, Number of bytes: 1
Received: 0x0C
>
问题:
1.是否需要在寄存器设置中考虑 SPKVDD 的变化?
2.有什么想法在配置后会导致 DAC3100与 NAK I2C 通信?
谢谢、
Derek
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Derek:

    首先、我会尝试隔离 SPKVDD 更改、您可以尝试初始化器件、但不为 D 类器件加电、即从代码中注释此行:

     0x20、0x86、  //加电 D 类

    如果您能够通过 I2C 进行通信、我们可以将其与扬声器驱动程序相关联。

    此外、您可以在初始化前后读回标志寄存器(第0页的寄存器44至46)。 有助于检查器件是否自行检测到任何问题。

    此致、
    -Ivan Salazar
    应用工程师

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

    嗨、Ivan、

    感谢您的回复。 我在找到了我认为是问题的地方后阅读了这篇文章。 我注意到我的 I2C SCL 和 SDA 信号上的"四舍五入"边沿、并将 I2C 时钟从400KHz 降低到100kHz、这缓解了我的 I2C 问题。 我不再接收来自 DAC3100的 NAK、并且可以在配置后读取所有寄存器、包括启用 D 类放大器。 这让我相信需要更强的上拉电阻、或者需要调整 I2C 外设时序(DAC3100与 STM32L4 MCU 连接)。 奇怪的是、这只会在 DAC3100配置后成为一个问题。

    我现在有一个新问题。 扬声器音频输出基本上会发出一些吱吱声、并且无法识别。 即噪声。 我比较了旧硬件和新硬件之间的时钟、比较了 I2S 数据、它们是相同的。

    旧硬件(工作) 新硬件(不工作)
    WCLK 42.5 KHz 42.62 KHz
    BCLK 1.36MHz 1.36 MHz
    MCLK 10.93 MHz 10.87 MHz
    DIN 不适用 不适用

    时钟频率的微小差异可能由晶体容差造成。

    以下是我的 I2S 数据的屏幕截图供参考:

    它具有以下配置:

    帧长度:32位(每通道16位)

    音频文件(.wav):44.1KHz、立体声、每通道16位

    我还从器件中读取了错误位、两个寄存器都是0x00。

    > i2c=1,2,30,00,00
    Test I2C write
    I2C write - Slave Addr: 0x30, Register: 0x00, Payload: 0x00
    >
    > i2c=0,2,30,2C,1
    Test I2C read
    I2C read - Slave Addr: 0x30, Register: 0x2C, Number of bytes: 1
    Received: 0x00
    >
    > i2c=0,2,30,2E,1
    Test I2C read
    I2C read - Slave Addr: 0x30, Register: 0x2E, Number of bytes: 1
    Received: 0x00
    

    编辑:我找到了另一个状态寄存器(第0页、0x27 -溢出标志)

    值:0xA0 ->位7 (左通道溢出)和位5 (桶形移位器输出溢出)

    问题:

    1.我是否需要更改任何 DAC3100寄存器值以考虑 SPKVDD 电压变化?

    2.上述 I2S 频率的细微差异是否会导致 无法识别的音频或潜在溢出?

    谢谢、

    Derek

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

    尊敬的 Derek:

    感谢您对 I2C 问题的反馈。

    关于您的问题、让我补充一些意见:

    • 不同的 SPKVDD 电平不需要更改寄存器。
    • 它可能会影响播放。 实际上、我担心您描述的时钟。 数据应以44.1kHz 的频率进行采样、但实际时钟低于~42.5kHz 的某个裕度。
      • 是否有任何方法使时钟更接近其预期值? IE 44.1kHz、1.4112MHz 和11.2896MHz?
      • 您是如何计算 PLL 值的? 它提到 DAC_FS = 8kHz。  尽管即使通过使用这些值计算 DAC_FS、DAC_FS 也是~113kHz、而不是44.1kHz
      • 您可以尝试使用以下时钟设置:
        • PLL_P = 1
        • PLL_R = 2
        • PLL_J = 40
        • PLL_D = 0
        • NDAC = 4
        • MDAC = 4
        • DOSR = 128

    此致、
    -Ivan Salazar
    应用工程师

            比率     比率   比率    
      MCLK 10870000 10930000 11289600  
      BCLK 1360000 255.04458 1360000 257.176471 256 1411200  
      WCLK 42620. 31.9099015 42500 32 32 44100  
       
    j 40  
    R 1  
    D 0  
    P 1 434800000 PLL_CLK 437200000 PLL_CLK 451584000 PLL_CLK
    N 1  
    m 6.  
    OSR 640)   113229.1667 DAC_FS   113854.167 DAC_FS     117600 DAC_FS
            比率     比率   比率    
      MCLK 10870000 10930000 11289600  
      BCLK 1360000 255.04458 1360000 257.176471 256 1411200  
      WCLK 42620. 31.9099015 42500 32 32 44100  
       
    j 40  
    R 2.  
    D 0  
    P 1 869600000 PLL_CLK 874400000 PLL_CLK 903168000 PLL_CLK
    N 4.  
    m 4.  
    OSR 128   424609.375 DAC_FS   426953.125 DAC_FS     441000 DAC_FS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Ivan、

    实际上、我继承了此代码并 按原样使用、因为它在以前的硬件上工作。 初 始配置之后、PLL 常量似乎会根据播放的音频文件频率进行修改。 对于44.1KHz、更新的 PLL 设置如下:

    44100, 
    { 
        0x00, 0x00,   // page 0
        0x05, 0x11,   // set PLL for DAC_FS=44.1KHz: J=8, R=1, D=0, P=1
        0x06, 840,     
        0x05, 0x92,   // power on PLL
        0xFE, 10,     // delay 10 ms
        0x0B, 0x84,   // NDAC=1
        0x0C, 0x94,   // MDAC=16
        0x0D, 0x00,   // DOSR=128
        0x0E, 0x80,
        0xFF
    }
    
    // "D" was previosuly configured as 0 (Zero)

    我尝试了您的设置、结果与扬声器发出的声音相同。 读取寄存器0x27仍返回 0xA0 ->位7 (左通道溢出)和位5 (桶形移位器输出溢出)的值。  我创建了一个用于配置 PLL 的 Excel 工作表。 插入建议值后、DAC_FS 结果为441 KHz、而不是44.1 KHz。 这可以在上表中看到。

    要计算 PLL_CLK、我使用 DAC3100数据表第54页上的等式6:

    其中:

    在 新硬件上 PLL_CLKIN = MCLK = 10870000

    R = 1、J = 8、D = 0、P = 1

    将所有这些插入可得出以下结果:

    PLL_CLK = 10870000 * 8/1 = 86960000或86.96MHz

    要计算 DAC_FS、我将使用 DAC3100数据表第52页上的公式5:

    其中:

    NDAC = 1、MDAC = 16、DOSR = 128

    CODE_CLKIN = PLL_CLK = 86960000或86.96MHz

    将所有这些插入可得出以下结果:

    DAC_FS = 86960000 /(1 * 16 * 128)= 42460.9或42.4609 KHz、非常接近42.62 KHz 的 WCLK。

    关于使时钟更接近44.1kHz 、1.4112MHz 和11.2896MHz 的预期值、我将对此进行研究。 我将 STM32L4与具有灵活 PLL 的16MHz 晶体搭配使用、因此这是可能的。 否则、我将不得不相应地使用 DAC PLL。 我已附上用于计算 PLL 值的 Excel 文件。

    问题

    1. 441 KHz 值是 您的表中的错误还是缺少什么?

    DAC_FS 需要与 WCLK 的接近程度如何? 这是否准确?

    3、WCLK 需要44.1 KHz 还是42.62 KHz、只要 DAC3100 DAC_FS 也~42.62 KHz?

    4. TI 是否有官方计算器用于根据给定的 MCLK 和采样 频率确定 PLL 分频器/乘法器值? 这 将是一个有用的工具。

    谢谢、

    Derek

    e2e.ti.com/.../7411.DAC_5F00_PLL_5F00_Calculator.xlsx

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

    尊敬的 Derek:

    1. 我的 PLL 计算器中输入的内容一定有问题、下面是更新后的表格。 由于 MCLK/BCLK/WCLK 具有特定比率、将不需要 PLL。
    2. 实际上、我更担心比率方面的时钟设置不正确、而不是实际产生的频率。 但是、没有说明 DAC_FS 应该与实际 WCLK 的接近程度。 只要我们的时钟与每个位的比率相匹配、就应该是可以的
    3. 如上文第2点所述、更重要的是 MCLK 与 BCLK 和 WCLK 的比率正确、以便正确地对每个位和字进行采样。
    4. 有 https://www.ti.com/lit/zip/slar163 计算器、您可以对 TLV320DAC3100使用 TLV320AIC31xx、其时钟结构类似

    我首先尝试在没有 PLL 的情况下使用时钟设置、如果比率正确、那么在不使用 PLL 的情况下采样应该是好的。

    但是、如果时钟不正确匹配、PLL 可能会提供帮助、也可能是使用它的原因。 然后、您可以尝试一些配置来使用 PLL 进行校正。 这种情况下的主要问题是使 PLL_CLKIN*PLL_R*PLL_J.D/PLL_P > 80MHz、PLL_J > 4

    此致、
    -Ivan Salazar
    应用工程师

            比率     比率   比率    
      MCLK 10870000 10930000 11289600  
      BCLK 1360000 255.0446 1360000 257.1765 256 1411200  
      WCLK 42620. 31.9099 42500 32 32 44100  
       
    j 40  
    R 1  
    D 0  
    P 1 434800000 PLL_CLK 4.37E+08 PLL_CLK 4.52E+08 PLL_CLK
    N 1  
    m 6.  
    OSR 640)   113229.17. DAC_FS   113854.2 DAC_FS     117600 DAC_FS
            比率     比率   比率    
      MCLK 10870000 10930000 11289600  
      BCLK 1360000 255.0446 1360000 257.1765 256 1411200  
      WCLK 42620. 31.9099 42500 32 32 44100  
       
    j 1  
    R 1  
    D 0  
    P 1 10870000 PLL_CLK 10930000 PLL_CLK 11289600 PLL_CLK
    N 1  
    m 2.  
    OSR 128   42460.938 DAC_FS   42695.31. DAC_FS     44100 DAC_FS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    旧硬件 新硬件
    WCLK 42.5 KHz 42.62 KHz
    BCLK 1.36MHz 1.36 MHz
    MCLK 10.93 MHz 10.87 MHz
    DIN 不适用 不适用

    嗨、Ivan、

    感谢您提供信息和 PLL 工具。 为了澄清这一点、表中的"旧硬件"和"新硬件"时钟是使用 Agilent 示波器测量的、因此考虑到测量设备/环境中的容差、比率可能会稍微降低。 要细分 "新硬件"上计算和配置的(未测量)时钟比率、我具有以下内容:

    I2S 基本时钟:120MHz

    FRL (帧长度->位):32

    MCKDIV:11 (这必须是整数、并且是 STM32L4 MCU 内的寄存器)

    MCLK = 120MHz/MCKDIV

    MCLK = 120MHz/11= 10.9091MHz

    WCLK = MCLK /256 = 42.613 KHz

    BCLK = WCLK * (每通道位数)*(#个通道)

    BCLK = 42.613KHz * 16 * 2 = 1.367MHz

    计算值与上表中的测量值非常匹配。 STM32L4 MCU 在给定基准时钟(120MHz)和 MCKDIV 的情况下派生 I2S 时钟。 如果产生的频率比时钟比率更小、我认为根据上述值、比率是可以的、因为这是由 STM32 I2S 驱动器控制的。 我可能可以将 MCLK 更改为12MHz 以获得更好的舍入数、但这会将 MCLK 设置为12MHz、将 WCLK 设置为46.875Hz、并将 BCLK 设置为1.5MHz。 但不确定这是必要的或有益的。

    我发现了一个不相关的问题、但这实际上可能 是我的问题的根源。 STM32L4 MCU I2S (也称为 SAI)外设在传输所有数据后不会停止 I2S 时钟、除非明确指示停止。 直到今天、我才意识到这一点、并查看了其他逻辑分析仪捕获数据。  这会导致 I2S 数据线路上的垃圾输出、从而可能解释扬声器噪声。 我已经在 STM 开发人员论坛上创建了一个帖子、以进一步调试此问题、并将在我有更多信息时更新此 TI 帖子。 您或任何人如有兴趣、可在此处查看此内容: https://community.st.com/s/question/0D53W00001Azy06SAB/halsaitransmit-does-not-stop-the-i2s-clocks-when-complete  

    感谢你的所有帮助。 我想我终于接近使这项工作,至少要更好地了解它应该如何工作。

    Derek

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

    尊敬的 Derek:

    感谢您让我们了解这一点。
    如果您需要任何进一步的帮助、请告知我们。

    此致、
    -Ivan Salazar
    应用工程师