ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
es7243e.cpp
Go to the documentation of this file.
1#include "es7243e.h"
2#include "es7243e_const.h"
3
4#include "esphome/core/hal.h"
5#include "esphome/core/log.h"
6
7#include <cinttypes>
8
9namespace esphome::es7243e {
10
11ESPHOME_LOG_TAG(TAG, "es7243e");
12
13// Mark the component as failed; use only in setup
14#define ES7243E_ERROR_FAILED(func) \
15 if (!(func)) { \
16 this->mark_failed(LOG_STR("Failed to initialize")); \
17 return; \
18 }
19
20// Return false; use outside of setup
21#define ES7243E_ERROR_CHECK(func) \
22 if (!(func)) { \
23 return false; \
24 }
25
26void ES7243E::dump_config() { ESP_LOGCONFIG(TAG, "ES7243E audio ADC:"); }
27
29 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x3A));
30 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x80));
31 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_TEST_MODE_REGF9, 0x00));
32 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x02));
33 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x01));
34 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_TEST_MODE_REGF9, 0x01));
35 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x1E));
36 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x00));
37
38 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG02, 0x00));
39 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG03, 0x20));
40 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x01));
41 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG0D, 0x00));
42 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG05, 0x00));
43 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG06, 0x03)); // SCLK=MCLK/4
44 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG07, 0x00)); // LRCK=MCLK/256
45 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG08, 0xFF)); // LRCK=MCLK/256
46
47 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG09, 0xCA));
48 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_SDP_REG0A, 0x85));
49 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_SDP_REG0B, 0x00));
50 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG0E, 0xBF));
51 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG0F, 0x80));
52 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG14, 0x0C));
53 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG15, 0x0C));
54 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG17, 0x02));
55 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG18, 0x26));
56 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG19, 0x77));
57 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1A, 0xF4));
58 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1B, 0x66));
59 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1C, 0x44));
60 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1E, 0x00));
61 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1F, 0x0C));
62 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG20, 0x1A)); // PGA gain +30dB
63 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG21, 0x1A));
64
65 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x80));
66 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x3A));
67 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x3F));
68 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x00));
69
70 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_TEST_MODE_REGF9, 0x00));
71 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x01));
72 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG17, 0x01));
73 ES7243E_ERROR_FAILED(this->configure_mic_gain_());
74 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x80));
75 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x3A));
76 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x3F));
77 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x00));
78
79 this->setup_complete_ = true;
80}
81
82bool ES7243E::set_mic_gain(float mic_gain) {
83 this->mic_gain_ = clamp<float>(mic_gain, 0, 37.5);
84 if (this->setup_complete_) {
85 return this->configure_mic_gain_();
86 }
87 return true;
88}
89
91 auto regv = this->es7243e_gain_reg_value_(this->mic_gain_);
92
93 ES7243E_ERROR_CHECK(this->write_byte(ES7243E_ANALOG_REG20, 0x10 | regv));
94 ES7243E_ERROR_CHECK(this->write_byte(ES7243E_ANALOG_REG21, 0x10 | regv));
95
96 return true;
97}
98
99uint8_t ES7243E::es7243e_gain_reg_value_(float mic_gain) {
100 // reg: 12 - 34.5dB, 13 - 36dB, 14 - 37.5dB
101 mic_gain += 0.5f;
102 if (mic_gain <= 33.0f) {
103 return (uint8_t) mic_gain / 3;
104 }
105 if (mic_gain < 36.0f) {
106 return 12;
107 }
108 if (mic_gain < 37.0f) {
109 return 13;
110 }
111 return 14;
112}
113
114} // namespace esphome::es7243e
void dump_config() override
Definition es7243e.cpp:26
bool set_mic_gain(float mic_gain) override
Definition es7243e.cpp:82
uint8_t es7243e_gain_reg_value_(float mic_gain)
Convert floating point mic gain value to register value.
Definition es7243e.cpp:99
float mic_gain() override
Definition es7243e.h:20
void setup() override
Definition es7243e.cpp:28
bool write_byte(uint8_t a_register, uint8_t data) const
Definition i2c.h:312
ESPHOME_LOG_TAG(TAG, "es7243e")