9static const char *
const TAG =
"bl0942";
11static const uint8_t BL0942_READ_COMMAND = 0x58;
12static const uint8_t BL0942_FULL_PACKET = 0xAA;
13static const uint8_t BL0942_PACKET_HEADER = 0x55;
15static const uint8_t BL0942_WRITE_COMMAND = 0xA8;
17static const uint8_t BL0942_REG_I_RMSOS = 0x12;
18static const uint8_t BL0942_REG_WA_CREEP = 0x14;
19static const uint8_t BL0942_REG_I_FAST_RMS_TH = 0x15;
20static const uint8_t BL0942_REG_I_FAST_RMS_CYC = 0x16;
21static const uint8_t BL0942_REG_FREQ_CYC = 0x17;
22static const uint8_t BL0942_REG_OT_FUNX = 0x18;
23static const uint8_t BL0942_REG_MODE = 0x19;
24static const uint8_t BL0942_REG_SOFT_RESET = 0x1C;
25static const uint8_t BL0942_REG_USR_WRPROT = 0x1D;
26static const uint8_t BL0942_REG_TPS_CTRL = 0x1B;
28static const uint32_t BL0942_REG_MODE_RESV = 0x03;
29static const uint32_t BL0942_REG_MODE_CF_EN = 0x04;
30static const uint32_t BL0942_REG_MODE_RMS_UPDATE_SEL = 0x08;
31static const uint32_t BL0942_REG_MODE_FAST_RMS_SEL = 0x10;
32static const uint32_t BL0942_REG_MODE_AC_FREQ_SEL = 0x20;
33static const uint32_t BL0942_REG_MODE_CF_CNT_CLR_SEL = 0x40;
34static const uint32_t BL0942_REG_MODE_CF_CNT_ADD_SEL = 0x80;
35static const uint32_t BL0942_REG_MODE_UART_RATE_19200 = 0x200;
36static const uint32_t BL0942_REG_MODE_UART_RATE_38400 = 0x300;
37static const uint32_t BL0942_REG_MODE_DEFAULT =
38 BL0942_REG_MODE_RESV | BL0942_REG_MODE_CF_EN | BL0942_REG_MODE_CF_CNT_ADD_SEL;
40static const uint32_t BL0942_REG_SOFT_RESET_MAGIC = 0x5a5a5a;
41static const uint32_t BL0942_REG_USR_WRPROT_MAGIC = 0x55;
44static const uint32_t PKT_TIMEOUT_MS = 200;
53 if (avail <
sizeof(buffer)) {
57 ESP_LOGW(TAG,
"Junk on wire. Throwing away partial message (%zu bytes)", avail);
64 if (this->
read_array((uint8_t *) &buffer,
sizeof(buffer))) {
75 uint8_t *
raw = (uint8_t *) data;
76 for (
uint32_t i = 0; i <
sizeof(*data) - 1; i++) {
81 ESP_LOGW(TAG,
"BL0942 invalid checksum! 0x%02X != 0x%02X",
checksum, data->checksum);
90 pkt[0] = BL0942_WRITE_COMMAND | this->
address_;
92 pkt[2] = (
val & 0xff);
93 pkt[3] = (
val >> 8) & 0xff;
94 pkt[4] = (
val >> 16) & 0xff;
95 pkt[5] = (pkt[0] + pkt[1] + pkt[2] + pkt[3] + pkt[4]) ^ 0xff;
111 (uint8_t) ((BL0942_READ_COMMAND + this->address_ + reg + resp.b[0] + resp.b[1] + resp.b[2]) ^ 0xff)) {
138 this->
write_reg_(BL0942_REG_USR_WRPROT, BL0942_REG_USR_WRPROT_MAGIC);
140 this->
write_reg_(BL0942_REG_SOFT_RESET, BL0942_REG_SOFT_RESET_MAGIC);
143 mode |= BL0942_REG_MODE_RMS_UPDATE_SEL;
145 mode |= BL0942_REG_MODE_AC_FREQ_SEL;
158 if (data->frame_header != BL0942_PACKET_HEADER) {
159 ESP_LOGI(TAG,
"Invalid data. Header mismatch: %d", data->frame_header);
171 float frequency = data->frequency != 0 ? 1000000.0f / data->frequency : NAN;
189 ESP_LOGV(TAG,
"BL0942: U %fV, I %fA, P %fW, Cnt %" PRId32
", ∫P %fkWh, frequency %fHz, status 0x%08X",
v_rms,
i_rms,
198 " Nominal line frequency: %d Hz\n"
199 " Current reference: %f\n"
200 " Energy reference: %f\n"
201 " Power reference: %f\n"
202 " Voltage reference: %f",