ESPHome 2026.6.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
11static const char *const 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(); \
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
27 ESP_LOGCONFIG(TAG, "ES7243E audio ADC:");
28
29 if (this->is_failed()) {
30 ESP_LOGE(TAG, " Failed to initialize");
31 return;
32 }
33}
34
36 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x3A));
37 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x80));
38 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_TEST_MODE_REGF9, 0x00));
39 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x02));
40 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x01));
41 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_TEST_MODE_REGF9, 0x01));
42 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x1E));
43 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x00));
44
45 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG02, 0x00));
46 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG03, 0x20));
47 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x01));
48 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG0D, 0x00));
49 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG05, 0x00));
50 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG06, 0x03)); // SCLK=MCLK/4
51 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG07, 0x00)); // LRCK=MCLK/256
52 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG08, 0xFF)); // LRCK=MCLK/256
53
54 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG09, 0xCA));
55 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_SDP_REG0A, 0x85));
56 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_SDP_REG0B, 0x00));
57 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG0E, 0xBF));
58 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG0F, 0x80));
59 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG14, 0x0C));
60 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG15, 0x0C));
61 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG17, 0x02));
62 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG18, 0x26));
63 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG19, 0x77));
64 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1A, 0xF4));
65 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1B, 0x66));
66 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1C, 0x44));
67 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1E, 0x00));
68 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1F, 0x0C));
69 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG20, 0x1A)); // PGA gain +30dB
70 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG21, 0x1A));
71
72 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x80));
73 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x3A));
74 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x3F));
75 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x00));
76
77 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_TEST_MODE_REGF9, 0x00));
78 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x01));
79 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG17, 0x01));
80 ES7243E_ERROR_FAILED(this->configure_mic_gain_());
81 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x80));
82 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x3A));
83 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x3F));
84 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x00));
85
86 this->setup_complete_ = true;
87}
88
89bool ES7243E::set_mic_gain(float mic_gain) {
90 this->mic_gain_ = clamp<float>(mic_gain, 0, 37.5);
91 if (this->setup_complete_) {
92 return this->configure_mic_gain_();
93 }
94 return true;
95}
96
98 auto regv = this->es7243e_gain_reg_value_(this->mic_gain_);
99
100 ES7243E_ERROR_CHECK(this->write_byte(ES7243E_ANALOG_REG20, 0x10 | regv));
101 ES7243E_ERROR_CHECK(this->write_byte(ES7243E_ANALOG_REG21, 0x10 | regv));
102
103 return true;
104}
105
106uint8_t ES7243E::es7243e_gain_reg_value_(float mic_gain) {
107 // reg: 12 - 34.5dB, 13 - 36dB, 14 - 37.5dB
108 mic_gain += 0.5;
109 if (mic_gain <= 33.0) {
110 return (uint8_t) mic_gain / 3;
111 }
112 if (mic_gain < 36.0) {
113 return 12;
114 }
115 if (mic_gain < 37.0) {
116 return 13;
117 }
118 return 14;
119}
120
121} // namespace esphome::es7243e
bool is_failed() const
Definition component.h:272
void dump_config() override
Definition es7243e.cpp:26
bool set_mic_gain(float mic_gain) override
Definition es7243e.cpp:89
uint8_t es7243e_gain_reg_value_(float mic_gain)
Convert floating point mic gain value to register value.
Definition es7243e.cpp:106
float mic_gain() override
Definition es7243e.h:20
void setup() override
Definition es7243e.cpp:35
bool write_byte(uint8_t a_register, uint8_t data) const
Definition i2c.h:265