ESPHome 2025.5.0
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 {
10namespace es7243e {
11
12static const char *const TAG = "es7243e";
13
14// Mark the component as failed; use only in setup
15#define ES7243E_ERROR_FAILED(func) \
16 if (!(func)) { \
17 this->mark_failed(); \
18 return; \
19 }
20
21// Return false; use outside of setup
22#define ES7243E_ERROR_CHECK(func) \
23 if (!(func)) { \
24 return false; \
25 }
26
28 ESP_LOGCONFIG(TAG, "ES7243E audio ADC:");
29
30 if (this->is_failed()) {
31 ESP_LOGE(TAG, " Failed to initialize");
32 return;
33 }
34}
35
37 ESP_LOGCONFIG(TAG, "Setting up ES7243E...");
38
39 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x3A));
40 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x80));
41 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_TEST_MODE_REGF9, 0x00));
42 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x02));
43 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x01));
44 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_TEST_MODE_REGF9, 0x01));
45 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x1E));
46 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x00));
47
48 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG02, 0x00));
49 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG03, 0x20));
50 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x01));
51 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG0D, 0x00));
52 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG05, 0x00));
53 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG06, 0x03)); // SCLK=MCLK/4
54 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG07, 0x00)); // LRCK=MCLK/256
55 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG08, 0xFF)); // LRCK=MCLK/256
56
57 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG09, 0xCA));
58 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_SDP_REG0A, 0x85));
59 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_SDP_REG0B, 0x00));
60 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG0E, 0xBF));
61 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG0F, 0x80));
62 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG14, 0x0C));
63 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ADC_CTRL_REG15, 0x0C));
64 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG17, 0x02));
65 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG18, 0x26));
66 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG19, 0x77));
67 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1A, 0xF4));
68 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1B, 0x66));
69 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1C, 0x44));
70 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1E, 0x00));
71 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG1F, 0x0C));
72 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG20, 0x1A)); // PGA gain +30dB
73 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG21, 0x1A));
74
75 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x80));
76 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x3A));
77 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x3F));
78 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x00));
79
80 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_TEST_MODE_REGF9, 0x00));
81 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG04, 0x01));
82 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG17, 0x01));
83 ES7243E_ERROR_FAILED(this->configure_mic_gain_());
84 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_RESET_REG00, 0x80));
85 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_CLOCK_MGR_REG01, 0x3A));
86 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x3F));
87 ES7243E_ERROR_FAILED(this->write_byte(ES7243E_ANALOG_REG16, 0x00));
88
89 this->setup_complete_ = true;
90}
91
92bool ES7243E::set_mic_gain(float mic_gain) {
93 this->mic_gain_ = clamp<float>(mic_gain, 0, 37.5);
94 if (this->setup_complete_) {
95 return this->configure_mic_gain_();
96 }
97 return true;
98}
99
101 auto regv = this->es7243e_gain_reg_value_(this->mic_gain_);
102
103 ES7243E_ERROR_CHECK(this->write_byte(ES7243E_ANALOG_REG20, 0x10 | regv));
104 ES7243E_ERROR_CHECK(this->write_byte(ES7243E_ANALOG_REG21, 0x10 | regv));
105
106 return true;
107}
108
109uint8_t ES7243E::es7243e_gain_reg_value_(float mic_gain) {
110 // reg: 12 - 34.5dB, 13 - 36dB, 14 - 37.5dB
111 mic_gain += 0.5;
112 if (mic_gain <= 33.0) {
113 return (uint8_t) mic_gain / 3;
114 }
115 if (mic_gain < 36.0) {
116 return 12;
117 }
118 if (mic_gain < 37.0) {
119 return 13;
120 }
121 return 14;
122}
123
124} // namespace es7243e
125} // namespace esphome
bool is_failed() const
void dump_config() override
Definition es7243e.cpp:27
bool set_mic_gain(float mic_gain) override
Definition es7243e.cpp:92
uint8_t es7243e_gain_reg_value_(float mic_gain)
Convert floating point mic gain value to register value.
Definition es7243e.cpp:109
float mic_gain() override
Definition es7243e.h:22
void setup() override
Definition es7243e.cpp:36
bool write_byte(uint8_t a_register, uint8_t data, bool stop=true)
Definition i2c.h:266
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
constexpr const T & clamp(const T &v, const T &lo, const T &hi, Compare comp)
Definition helpers.h:101