From 7bde0b89d12c9be1aedfd647273a197ade5385a5 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:50:29 +0200 Subject: [PATCH] Fix QMP6988 --- tasmota/tasmota_support/support_a_i2c.ino | 42 ++++++++++++------- .../tasmota_xsns_sensor/xsns_28_qmp6988.ino | 19 ++++++--- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/tasmota/tasmota_support/support_a_i2c.ino b/tasmota/tasmota_support/support_a_i2c.ino index 5912bbfc9..364cd1fe5 100644 --- a/tasmota/tasmota_support/support_a_i2c.ino +++ b/tasmota/tasmota_support/support_a_i2c.ino @@ -58,6 +58,10 @@ TwoWire& I2cGetWire(uint8_t bus = 0) { } } +/*-------------------------------------------------------------------------------------------*\ + * Return code: 0 = Error, 1 = OK +\*-------------------------------------------------------------------------------------------*/ + bool I2cValidRead(uint8_t addr, uint8_t reg, uint8_t size, uint8_t bus = 0) { i2c_buffer = 0; @@ -75,51 +79,51 @@ bool I2cValidRead(uint8_t addr, uint8_t reg, uint8_t size, uint8_t bus = 0) { for (uint32_t i = 0; i < size; i++) { i2c_buffer = i2c_buffer << 8 | myWire.read(); // receive DATA } - status = true; + status = true; // 1 = OK } } retry--; } if (!retry) myWire.endTransmission(); - return status; + return status; // 0 = Error, 1 = OK } bool I2cValidRead8(uint8_t *data, uint8_t addr, uint8_t reg, uint8_t bus = 0) { bool status = I2cValidRead(addr, reg, 1, bus); *data = (uint8_t)i2c_buffer; - return status; + return status; // 0 = Error, 1 = OK } bool I2cValidRead16(uint16_t *data, uint8_t addr, uint8_t reg, uint8_t bus = 0) { bool status = I2cValidRead(addr, reg, 2, bus); *data = (uint16_t)i2c_buffer; - return status; + return status; // 0 = Error, 1 = OK } bool I2cValidReadS16(int16_t *data, uint8_t addr, uint8_t reg, uint8_t bus = 0) { bool status = I2cValidRead(addr, reg, 2, bus); *data = (int16_t)i2c_buffer; - return status; + return status; // 0 = Error, 1 = OK } bool I2cValidRead16LE(uint16_t *data, uint8_t addr, uint8_t reg, uint8_t bus = 0) { uint16_t ldata; bool status = I2cValidRead16(&ldata, addr, reg, bus); *data = (ldata >> 8) | (ldata << 8); - return status; + return status; // 0 = Error, 1 = OK } bool I2cValidReadS16_LE(int16_t *data, uint8_t addr, uint8_t reg, uint8_t bus = 0) { uint16_t ldata; bool status = I2cValidRead16LE(&ldata, addr, reg, bus); *data = (int16_t)ldata; - return status; + return status; // 0 = Error, 1 = OK } bool I2cValidRead24(int32_t *data, uint8_t addr, uint8_t reg, uint8_t bus = 0) { bool status = I2cValidRead(addr, reg, 3, bus); *data = i2c_buffer; - return status; + return status; // 0 = Error, 1 = OK } uint8_t I2cRead8(uint8_t addr, uint8_t reg, uint8_t bus = 0) { @@ -166,37 +170,41 @@ bool I2cWrite(uint8_t addr, uint8_t reg, uint32_t val, uint8_t size, uint8_t bus } x--; } while (myWire.endTransmission(true) != 0 && x != 0); // end transmission - return (x); + return (x); // 0 = Error, 1 = OK } bool I2cWrite8(uint8_t addr, uint8_t reg, uint32_t val, uint8_t bus = 0) { - return I2cWrite(addr, reg, val, 1, bus); + return I2cWrite(addr, reg, val, 1, bus); // 0 = Error, 1 = OK } bool I2cWrite16(uint8_t addr, uint8_t reg, uint32_t val, uint8_t bus = 0) { - return I2cWrite(addr, reg, val, 2, bus); + return I2cWrite(addr, reg, val, 2, bus); // 0 = Error, 1 = OK } +/*-------------------------------------------------------------------------------------------*\ + * Return code: 0 = OK, 1 = Error +\*-------------------------------------------------------------------------------------------*/ + bool I2cReadBuffer(uint8_t addr, uint8_t reg, uint8_t *reg_data, uint16_t len, uint8_t bus = 0) { TwoWire& myWire = I2cGetWire(bus); - if (&myWire == nullptr) { return true; } // No valid I2c bus + if (&myWire == nullptr) { return true; } // No valid I2c bus myWire.beginTransmission((uint8_t)addr); myWire.write((uint8_t)reg); myWire.endTransmission(); if (len != myWire.requestFrom((uint8_t)addr, (uint8_t)len)) { - return true; // Error + return true; // 1 = Error } while (len--) { *reg_data = (uint8_t)myWire.read(); reg_data++; } - return false; // OK + return false; // 0 = OK } int8_t I2cWriteBuffer(uint8_t addr, uint8_t reg, uint8_t *reg_data, uint16_t len, uint8_t bus = 0) { TwoWire& myWire = I2cGetWire(bus); - if (&myWire == nullptr) { return 1; } // No valid I2c bus + if (&myWire == nullptr) { return 1; } // 1 = Error, No valid I2c bus myWire.beginTransmission((uint8_t)addr); myWire.write((uint8_t)reg); @@ -205,9 +213,11 @@ int8_t I2cWriteBuffer(uint8_t addr, uint8_t reg, uint8_t *reg_data, uint16_t len reg_data++; } myWire.endTransmission(); - return 0; // OK + return 0; // 0 = OK } +/*-------------------------------------------------------------------------------------------*/ + void I2cScan(uint8_t bus = 0) { // Return error codes defined in twi.h and core_esp8266_si2c.c // I2C_OK 0 diff --git a/tasmota/tasmota_xsns_sensor/xsns_28_qmp6988.ino b/tasmota/tasmota_xsns_sensor/xsns_28_qmp6988.ino index ff39f5964..c4e0fdddc 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_28_qmp6988.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_28_qmp6988.ino @@ -125,11 +125,18 @@ qmp6988_data_t *Qmp6988 = nullptr; /*********************************************************************************************/ bool QMP6988I2cReadBuffer(uint8_t reg, uint8_t *reg_data, uint16_t len) { - return I2cReadBuffer(Qmp6988->address, reg, reg_data, len, Qmp6988->bus); + bool ret = !I2cReadBuffer(Qmp6988->address, reg, reg_data, len, Qmp6988->bus); + +// AddLog(LOG_LEVEL_DEBUG, PSTR("QMP: Rd %02X '%*_H', Rslt %d"), reg, len, reg_data, ret); + + return ret; } -uint8_t QMP6988I2cWrite(uint8_t reg, uint32_t val) { - uint8_t ret = I2cWrite8(Qmp6988->address, reg, val, Qmp6988->bus); +bool QMP6988I2cWrite(uint8_t reg, uint32_t val) { + bool ret = I2cWrite8(Qmp6988->address, reg, val, Qmp6988->bus); + +// AddLog(LOG_LEVEL_DEBUG, PSTR("QMP: Wr %02X '%02X', Rslt %d"), reg, val, ret); + delay(20); return ret; } @@ -272,7 +279,7 @@ int QMP6988GetPressure02e(qmp6988_ik_data_t* ik, int dp, int16_t tx) { void QMP6988Reset(void) { uint8_t ret = QMP6988I2cWrite(QMP6988_RESET_REG, 0xe6); if (0 == ret) { - AddLog(LOG_LEVEL_DEBUG, PSTR("QMP: Reset fail")); + QMP6988_LOG("reset fail!!! \r\n"); } QMP6988I2cWrite(QMP6988_RESET_REG, 0x00); } @@ -322,7 +329,7 @@ bool QMP6988ValidChip(void) { uint8_t data; QMP6988I2cReadBuffer(QMP6988_CHIP_ID_REG, &data, 1); - AddLog(LOG_LEVEL_DEBUG, PSTR("QMP: Chip Id 0x%02X"), data); + QMP6988_LOG("chip id=0x%x \r\n", data); return (QMP6988_CHIP_ID == data); } @@ -345,7 +352,7 @@ void QMP6988CalcPressureAndTemperature(void) { int P_int = QMP6988GetPressure02e(&(Qmp6988->ik), P_raw, T_int); Qmp6988->temperature = (float)T_int / 256.0f; - Qmp6988->pressure = (float)P_int / 16.0f; + Qmp6988->pressure = (float)P_int / 1600.0f; } void Qmp6988Detect(void) {