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.

[参考译文] TLV320DAC3101:使用 ESP32和 TLV320DAC3101连接、初始化和播放 I2S

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1336665/tlv320dac3101-connecting-initializing-and-playing-i2s-with-esp32-and-tlv320dac3101

器件型号:TLV320DAC3101

您好

我想通过 I2C 和 I2S 连接 ESP32-WROVER-IE 芯片和 TLV320DAC3101、以通过 SPL 播放 WAV 声音文件。

[I2S 启动]

void TLV320DAC3101::initI2S() {
   static const i2s_config_t i2s_config = {
      .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
      .sample_rate = 44100,
      .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, 
      .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
      .communication_format = I2S_COMM_FORMAT_I2S,
      .intr_alloc_flags = 0,
      .dma_buf_count = 8,
      .dma_buf_len = 64,
      .use_apll = false,
      .tx_desc_auto_clear = true
   };
   static const i2s_pin_config_t pin_config = {
      .bck_io_num = PIN_DAC_BCLK,
      .ws_io_num = PIN_DAC_WCLK,
      .data_out_num = PIN_DAC_DIN,
      .data_in_num = I2S_PIN_NO_CHANGE
   };
   i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL);
   i2s_set_pin(I2S_NUM, &pin_config);
}

[tlv320dac3101启动]
int TLV320DAC3101::begin()
{
   initI2S();

   setRegister(0, 1, 1); // Soft reset
   vTaskDelay(pdMS_TO_TICKS(20));

   setRegister(0, 0x04, 0x07); // MCLK->BCLK, CODEC_CLKIN: PLL_CLK
   
   //	{ 1411200,  44100,	2, 32,   0,	128,   8,  2,	128,   8,  2},
   setRegister(0, 0x05, 0x92); // PLL P and R Values : P=1, R=2 *
   vTaskDelay(pdMS_TO_TICKS(10)); // PLL Power up time
   setRegister(0, 0x06, 0x20); // PLL J-Value : 32 *
   setRegister(0, 0x07, 0x00); // PLL D-HIGH-Value : 0 *
   setRegister(0, 0x08, 0x00); // PLL D-LOW-Value : 0 *
   setRegister(0, 0x0b, 0x88); // DAC NDAC_VAL : divide by 8
   setRegister(0, 0x0c, 0x82); // DAC MDAC_VAL : divide by 2
   setRegister(0, 0x0d, 0x00); // DAC DOSR_VAL MSB : 0 *
   setRegister(0, 0x0e, 0x80); // DAC DOSR_VAL LSB : 128 *
   setRegister(0, 0x1b, 0x00); // Codec Interface Control 1 : I2S, 16bits, BCLK/WCLK Input

   setRegister(0, 0x36, 0x02); // DIN (IN Pin) Control : enabled

   setRegister(0, 0x3c, 0x0b); // Processing Block : 25 

   setRegister(8, 0x01, 0x04); // DAC Coefficient RAM Control (continued) : 4 
   setRegister(1, 0x21, 0x00); // HP Output Drivers POP Removal Settings

   setRegister(0, 0x74, 0x00);

   setRegister(1, 0x23, 0x44); 

   setRegister(1, 0x20, 0xC6); 
   setRegister(1, 0x2A, 0x1C);
   setRegister(1, 0x2B, 0x1C);

   setRegister(1, 0x26, 0x80); 
   setRegister(1, 0x27, 0x80); 
   
   setRegister(0, 0x3F, 0xFD); 
   setRegister(0, 0x41, 0x00);
   setRegister(0, 0x42, 0x00);
   setRegister(0, 0x40, 0x00);

   vTaskDelay(pdMS_TO_TICKS(1000));

   return 1;
}
完成上述设置后、我确认 TLV320DAC3101的寄存器值发生了正确变化。
我通过将引脚连接到示波器来不断检查信号、
和信号在 DIN、BCLK 和 WCLK 上通过精确的时钟测量检测到。
但是、在 SOUND 引脚上未检测到任何信号。 设置或电路是否存在问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Soonho:

    • 请确认您的 WCLK 和 BCLK 频率、是44.1kHz 和1.4112MHz 吗?
    • 在通过 I2C 初始化 DAC 之前、请确认 WCLK 和 BCLK 是否已启动且正在运行。
    • 您的原理图仅显示已连接 SPLP。 这至少对斯普拉斯人运/苏人解来说是不正确的。 D 类是差分输出、因此负载必须连接在 SPLP 和苏人解之间。 如果您使用连接到 SPLP 的示波器、您是看到开关 PWM 还是根本没有信号?
    • 同时启用左右 D 类输出、但似乎只使用其中的一个?
    • 为了确保不是问题、您还应该像提供 SPLVDD 一样提供 SPRVDD。

    此致、
    -Ivan Salazar
    应用工程师

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

    [请确认您的 WCLK 和 BCLK 频率、是44.1kHz 和1.4112MHz 吗]

    =>(use_apll:false->true)、BCLK:1,408,451、WCLK:43,860




    [在通过 I2C 初始化 DAC 之前、请确认 WCLK 和 BCLK 已启动且正在运行。]

    =>处理:esp32 I2S -> esp32 I2C -> DAC begin ()->播放声音




    [您的原理图仅显示已连接 SPLP。 这至少对斯普拉斯人运/苏人解来说是不正确的。 D 类是差分输出、因此负载必须连接在 SPLP 和苏人解之间。 如果您使用连接到 SPLP 的示波器、您是看到开关 PWM 还是根本没有信号?]

    =>完全没有信号。 然后我将更改电路。



    通过 I2S 发送音频文件并使用示波器观察 DAC_DIN 引脚之后、我 可以看到正在传输数据。

    然而、当 扬声器的正极线连接 到这里、而扬声器的负极线连接到 GND 时、

    有严重的噪音,但正在播放声音文件。 就好像它像 PWM 一样运行。

    当以与上述代码相同的方式读取 WAV 文件并通过 I2S 传输它时、

    这是否可以作为 PWM 传输?

    是否 DAC 无法解码、因为它是 PWM 形式的?




    [您也在启用左右 D 类输出、但似乎只使用其中的一个? 为了确保不是问题、您还应该像提供 SPLVDD 一样提供 SPRVDD。]

    =>是的、我用一个说话者、所以只需要一个说话者。 但为了检查该问题、 我将更改电路。






    此致、

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

    尊敬的 Soonho:

    D 类的输出是 PWM 信号、下面我们尝试连接硬件、以便扬声器通过  SPLP 和人运正确连接。 然后、我们可以检查器件生成的音频是否实际正常。

    此致、
    -Ivan Salazar
    应用工程师