This commit is contained in:
2026-05-18 22:59:45 +02:00
parent aed00ceda2
commit 77c9d4a4d5
10 changed files with 1185 additions and 119 deletions
+14 -114
View File
@@ -11,6 +11,8 @@
#include <math.h>
#include <stdint.h>
#define TAG "ES8311"
i2c_master_dev_handle_t es8311_i2c_dev;
int es8311_write(uint8_t reg, uint8_t val) {
@@ -100,122 +102,20 @@ void es8311_init(void) {
}
// Reset sequence
es8311_write(ES8311_RESET_REG00, 0x1F);
vTaskDelay(pdMS_TO_TICKS(20));
es8311_write(ES8311_RESET_REG00, 0x00);
es8311_write(ES8311_RESET_REG00, 0x80); // Power-on
vTaskDelay(pdMS_TO_TICKS(20));
es8311_write(ES8311_RESET_REG00, 0x1F);
vTaskDelay(pdMS_TO_TICKS(20));
es8311_write(ES8311_RESET_REG00, 0x00);
es8311_write(ES8311_RESET_REG00, 0x80); // Power-on command
// Start analog circuitry
es8311_write(ES8311_SYSTEM_REG0D, 0x01);
vTaskDelay(pdMS_TO_TICKS(20));
es8311_write(ES8311_CLK_MANAGER_REG01,
ES8311_CLK_MANAGER_REG01_MCLK_SEL_FROM_BCLK |
0x3F
);
// Configure I2S format - Slave mode
es8311_write(ES8311_RESET_REG00, 0x80); // Ensure slave mode
es8311_write(ES8311_SDPIN_REG,
ES8311_SDPIN_FORMAT_I2S | ES8311_SDPIN_WORD_16BIT |
ES8311_SDPIN_LR_NORMAL_POLARITY | ES8311_SDPIN_UNMUTE |
ES8311_SDPIN_SEL_LEFT_TO_DAC);
es8311_write(ES8311_SDPOUT_REG,
ES8311_SDPOUT_FORMAT_I2S | ES8311_SDPOUT_WORD_16BIT |
ES8311_SDPOUT_LR_NORMAL_POLARITY | ES8311_SDPOUT_UNMUTE);
/*
// Clock configuration for 48kHz from BCLK
es8311_write(ES8311_CLK_MANAGER_REG01,
ES8311_CLK_MANAGER_REG01_MCLK_INV_OFF |
ES8311_CLK_MANAGER_REG01_MCLK_ON |
ES8311_CLK_MANAGER_REG01_MCLK_SEL_FROM_BCLK |
ES8311_CLK_MANAGER_REG01_BCLK_ON);
*/
es8311_write(ES8311_CLK_MANAGER_REG01,
ES8311_CLK_MANAGER_REG01_BCLK_ON);
/*
es8311_write(ES8311_CLK_MANAGER_REG02, 0x00);
es8311_write(ES8311_CLK_MANAGER_REG03, 0x10);
es8311_write(ES8311_CLK_MANAGER_REG04, 0x10);
es8311_write(ES8311_CLK_MANAGER_REG05, 0x00);
*/
// CRITICAL: Set LRCK divider
es8311_write(ES8311_CLK_MANAGER_REG06,
ES8311_CLK_MANAGER_REG06_CONTINUAL_BCLK |
ES8311_CLK_MANAGER_REG06_NORMAL_BCLK |
ES8311_CLK_MANAGER_REG06_DIV_BCLK_4);
es8311_write(ES8311_CLK_MANAGER_REG07,
ES8311_CLK_MANAGER_REG07_ADCDAT_NORMAL_MODE |
ES8311_CLK_MANAGER_REG07_BCLK_LRCLK_NORMAL_MODE);
// MISSING REGISTER - LRCK divider low byte
es8311_write(ES8311_CLK_MANAGER_REG08, 0xFF);
vTaskDelay(pdMS_TO_TICKS(20));
// Power up and enable everything
es8311_write(ES8311_SYSTEM_REG0E, ES8311_SYSTEM_REG0E_PGA_ENABLE |
ES8311_SYSTEM_REG0E_PDN_MOD_ENABLE |
ES8311_SYSTEM_REG0E_MOD_NORMAL);
es8311_write(ES8311_SYSTEM_REG12, 0x00); // DAC on
es8311_write(ES8311_SYSTEM_REG13, 0x10); // Output enable
es8311_write(ES8311_SYSTEM_REG0F,
ES8311_SYSTEM_REG0F_DAC_NORMAL_MODE |
ES8311_SYSTEM_REG0F_PGA_NORMAL_MODE |
ES8311_SYSTEM_REG0F_PGA_OUTPUT_NORMAL_MODE |
ES8311_SYSTEM_REG0F_VCMMOD_NORMAL_MODE |
ES8311_SYSTEM_REG0F_ADC_REFERENCE_NORMAL_MODE |
ES8311_SYSTEM_REG0F_DAC_REFERENCE_NORMAL_MODE |
ES8311_SYSTEM_REG0F_FLASH_NORMAL_MODE |
ES8311_SYSTEM_REG0F_INT1_NORMAL_MODE);
// Microphone configuration
es8311_write(ES8311_SYSTEM_REG14, ES8311_SYSTEM_REG14_DMIC_OFF |
ES8311_SYSTEM_REG14_MIC1 |
ES8311_SYSTEM_REG14_GAIN_30DB);
es8311_write(ES8311_ADC_REG16, ES8311_ADC_REG16_ADC_GAIN_24DB);
es8311_write(ES8311_ADC_REG1C, ES8311_ADC_REG1C_HPF_DYNAMIC_HPF |
ES8311_ADC_REG1C_ADCEQ_BYPASS);
es8311_write(ES8311_ADC_REG18, ES8311_ADC_REG18_AUTO_LEVEL_CONTROL_ENABLE |
ES8311_ADC_REG18_AUTO_MUTE_DISABLE |
ES8311_ADC_REG18_0_25DB_PER_65536LRCK);
es8311_write(ES8311_ADC_REG19, ES8311_ADC_REG19_ALC_MIN_LEVEL_NEG_30_1DB |
ES8311_ADC_REG19_ALC_MAX_LEVEL_NEG_6_0DB);
es8311_write(ES8311_ADC_REG1A, ES8311_ADC_REG1A_AUTOMUTE_NEG_96DB |
ES8311_ADC_REG1A_AUTOMUTE_32768_SAMPLES);
es8311_write(ES8311_GPIO_REG44, ES8311_GPIO_REG44_ADCDAT_SEL_ADC_ADC |
ES8311_GPIO_REG44_ADCDAT_SEL_NO_LOOPBACK);
//ES8311_GPIO_REG44_ADCDAT_ADC_TO_DAC);
es8311_write(ES8311_ADC_REG15, ES8311_ADC_REG15_RAMPRATE_0_25_4096LRCK);
es8311_write(ES8311_DAC_REG37, ES8311_DAC_REG37_RAMPRATE_0_25_4096LRCK);
es8311_set_adc_volume(5);
es8311_set_dac_volume(5);
es8311_write(ES8311_DAC_REG31, ES8311_DAC_REG31_MUTE_TO8 |
ES8311_DAC_REG31_DSM_UNMUTE |
ES8311_DAC_REG31_DEM_UNMUTE);
es8311_write(ES8311_DAC_REG34,
ES8311_DAC_REG34_DRC_DISABLE |
ES8311_DAC_REG34_DRC_WINSIZE_0_25_65536LRCK);
es8311_write(ES8311_DAC_REG35, ES8311_DAC_REG35_DRC_MAX_LEVEL_NEG_6_0DB |
ES8311_DAC_REG35_DRC_MIN_LEVEL_NEG_30_1DB);
printf("ES8311: Initialization complete\n");
es8311_write(ES8311_CLK_MANAGER_REG06,
ES8311_CLK_MANAGER_REG06_NORMAL_BCLK |
ES8311_CLK_MANAGER_REG06_CONTINUAL_BCLK
);
}
int audio_write(const int16_t *samples, size_t count) {