ESPHome  2025.2.0
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 
9 namespace esphome {
10 namespace es7243e {
11 
12 static 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 
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 
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 set_mic_gain(float mic_gain) override
Definition: es7243e.cpp:92
void setup() override
Definition: es7243e.cpp:36
bool is_failed() const
Definition: component.cpp:143
float mic_gain() override
Definition: es7243e.h:22
void dump_config() override
Definition: es7243e.cpp:27
uint8_t es7243e_gain_reg_value_(float mic_gain)
Convert floating point mic gain value to register value.
Definition: es7243e.cpp:109
bool write_byte(uint8_t a_register, uint8_t data, bool stop=true)
Definition: i2c.h:262
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7