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