From 318547c605297bf07f1ea946d891ed62d2c0fac4 Mon Sep 17 00:00:00 2001 From: Hendry Kaak Date: Thu, 16 Jan 2020 17:17:31 +0100 Subject: [PATCH] [I2C] Fix error reporting on I2C timeout When this timeout is triggered, I2C_OK was returned. This happens because in the loop above, it checks for `(delta < I2C_TIMEOUT_TICK)`, so it breaks out of the loop as soon as `delta == I2C_TIMEOUT_TICK`. Then, the if below checks for `(delta > I2C_TIMEOUT_TICK)`, which is not yet false. Since the hardware reports no errors either, I2C_OK was returned. By using `>=` in the if rather than `>`, this is fixed and I2C_TIMEOUT is now returned instead. --- libraries/Wire/src/utility/twi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Wire/src/utility/twi.c b/libraries/Wire/src/utility/twi.c index 4ea85f29db..7e2420962d 100644 --- a/libraries/Wire/src/utility/twi.c +++ b/libraries/Wire/src/utility/twi.c @@ -813,7 +813,7 @@ i2c_status_e i2c_master_write(i2c_t *obj, uint8_t dev_address, } err = HAL_I2C_GetError(&(obj->handle)); - if ((delta > I2C_TIMEOUT_TICK) + if ((delta >= I2C_TIMEOUT_TICK) || ((err & HAL_I2C_ERROR_TIMEOUT) == HAL_I2C_ERROR_TIMEOUT)) { ret = I2C_TIMEOUT; } else { @@ -887,7 +887,7 @@ i2c_status_e i2c_master_read(i2c_t *obj, uint8_t dev_address, uint8_t *data, uin } err = HAL_I2C_GetError(&(obj->handle)); - if ((delta > I2C_TIMEOUT_TICK) + if ((delta >= I2C_TIMEOUT_TICK) || ((err & HAL_I2C_ERROR_TIMEOUT) == HAL_I2C_ERROR_TIMEOUT)) { ret = I2C_TIMEOUT; } else {