MCPcopy Create free account
hub / github.com/BruceDevices/firmware / _setup_codec_speaker

Function _setup_codec_speaker

boards/ES3C28P/interface.cpp:339–387  ·  view source on GitHub ↗

** Function: _setup_codec_speaker ** Handles audio CODEC to enable/disable speaker ** Configures ES8311 for I2S slave mode, 16-bit, with MCLK from ESP32 **********************************************************************/

Source from the content-addressed store, hash-verified

337** Configures ES8311 for I2S slave mode, 16-bit, with MCLK from ESP32
338**********************************************************************/
339void _setup_codec_speaker(bool enable) {
340 // Enable/disable amplifier (FM8002E is active LOW)
341 digitalWrite(ES3C28P_AMP_EN, enable ? LOW : HIGH);
342
343 if (enable) {
344 // Reset codec (exact sequence from LCD Wiki es8311_init)
345 es8311_write_reg(ES8311_REG00_RESET, 0x1F);
346 delay(20);
347 es8311_write_reg(ES8311_REG00_RESET, 0x00); // Clear reset
348 es8311_write_reg(ES8311_REG00_RESET, 0x80); // Power on
349
350 // Clock config: MCLK from MCLK pin, enable all clocks
351 es8311_write_reg(ES8311_REG01_CLK_MGR, 0x3F);
352
353 // Clock dividers for 44100Hz sample rate with MCLK from I2S master
354 // The ESP8266Audio library generates MCLK automatically
355 // Use coefficients matching the I2S MCLK output
356 // pre_div=1, pre_multi=0, adc_div=1, dac_div=1, fs=0, lrck=0x00FF, bclk_div=4
357 es8311_write_reg(ES8311_REG02_CLK_MGR, 0x00); // pre_div=1, pre_multi=1x
358 es8311_write_reg(ES8311_REG03_CLK_MGR, 0x10); // ADC OSR = 0x10
359 es8311_write_reg(ES8311_REG04_CLK_MGR, 0x10); // DAC OSR = 0x10
360 es8311_write_reg(ES8311_REG05_CLK_MGR, 0x00); // ADC/DAC clk div = 1
361 es8311_write_reg(ES8311_REG06_CLK_MGR, 0x03); // BCLK divider
362 es8311_write_reg(ES8311_REG07_CLK_MGR, 0x00); // LRCK divider high
363 es8311_write_reg(ES8311_REG08_CLK_MGR, 0xFF); // LRCK divider low
364
365 // SDP format: slave mode, 16-bit I2S (bits[3:2] = 11 = 16-bit)
366 es8311_write_reg(ES8311_REG09_SDPIN, 0x0C); // SDP in: 16-bit
367 es8311_write_reg(ES8311_REG0A_SDPOUT, 0x0C); // SDP out: 16-bit
368
369 // Power up analog and DAC (from LCD Wiki es8311_init)
370 es8311_write_reg(ES8311_REG0D_SYSTEM, 0x01); // Power up analog circuitry
371 es8311_write_reg(ES8311_REG0E_SYSTEM, 0x02); // Enable analog PGA, ADC modulator
372 es8311_write_reg(ES8311_REG12_SYSTEM, 0x00); // Power up DAC
373 es8311_write_reg(ES8311_REG13_SYSTEM, 0x10); // Enable output to HP drive
374 es8311_write_reg(ES8311_REG1C_ADC, 0x6A); // ADC EQ bypass, cancel DC offset
375 es8311_write_reg(ES8311_REG37_DAC, 0x08); // Bypass DAC equalizer
376
377 // Set volume (85% like LCD Wiki example)
378 es8311_write_reg(ES8311_REG32_DAC, 0xD8); // ~85% volume
379
380 Serial.println("ES8311 speaker enabled");
381 } else {
382 // Power down codec
383 es8311_write_reg(ES8311_REG0D_SYSTEM, 0xFC); // Power down analog
384 es8311_write_reg(ES8311_REG00_RESET, 0x00); // Power down
385 Serial.println("ES8311 speaker disabled");
386 }
387}
388
389/*********************************************************************
390** Function: _setup_codec_mic

Callers

nothing calls this directly

Calls 2

es8311_write_regFunction · 0.85
printlnMethod · 0.45

Tested by

no test coverage detected