您好
我想通过 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;
}