From e37cdfbfca4f58ef2f3b43dc9996c67698b32edc Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Wed, 30 Mar 2022 10:48:03 -0600 Subject: [PATCH] Add I2C retries in INA226 to prevent publishing 0's on a single read failure --- src/drivers/power_monitor/ina226/ina226.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/drivers/power_monitor/ina226/ina226.cpp b/src/drivers/power_monitor/ina226/ina226.cpp index 3a69c8fda212..2c117caf1dce 100644 --- a/src/drivers/power_monitor/ina226/ina226.cpp +++ b/src/drivers/power_monitor/ina226/ina226.cpp @@ -102,14 +102,19 @@ int INA226::read(uint8_t address, int16_t &data) { // read desired little-endian value via I2C uint16_t received_bytes; - const int ret = transfer(&address, 1, (uint8_t *)&received_bytes, sizeof(received_bytes)); + int ret = PX4_ERROR; - if (ret == PX4_OK) { - data = swap16(received_bytes); + for (size_t i = 0; i < 3; i++) { + ret = transfer(&address, 1, (uint8_t *)&received_bytes, sizeof(received_bytes)); - } else { - perf_count(_comms_errors); - PX4_DEBUG("i2c::transfer returned %d", ret); + if (ret == PX4_OK) { + data = swap16(received_bytes); + break; + + } else { + perf_count(_comms_errors); + PX4_DEBUG("i2c::transfer returned %d", ret); + } } return ret;