From 31e2ea85414717c6e637530f9ba706033646ec82 Mon Sep 17 00:00:00 2001 From: Monideep Bora Date: Tue, 8 Aug 2023 15:55:51 +0200 Subject: [PATCH 1/3] added wait for ACK after a I2C transaction --- libraries/Wire/src/Wire.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index 94baa2a3..d519f97a 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -245,6 +245,8 @@ uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddres XMC_I2C_CH_MasterStart(XMC_I2C_config->channel, (txAddress << 1), XMC_I2C_CH_CMD_READ); } + while((XMC_I2C_CH_GetStatusFlag(XMC_I2C_config->channel) & XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED) == 0U); + for (uint8_t count = 0; count < (quantity - 1); count ++) { XMC_I2C_CH_MasterReceiveAck(XMC_I2C_config->channel); From 6eb1a03b1457eb2217b8c9ce30864373fc26b843 Mon Sep 17 00:00:00 2001 From: Monideep Bora Date: Fri, 18 Aug 2023 10:43:05 +0200 Subject: [PATCH 2/3] added timeout to make loop unblocking in Wire fix --- libraries/Wire/src/Wire.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index d519f97a..fe35f516 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -245,7 +245,12 @@ uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddres XMC_I2C_CH_MasterStart(XMC_I2C_config->channel, (txAddress << 1), XMC_I2C_CH_CMD_READ); } - while((XMC_I2C_CH_GetStatusFlag(XMC_I2C_config->channel) & XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED) == 0U); + timeout = WIRE_COMMUNICATION_TIMEOUT; + + while(((XMC_I2C_CH_GetStatusFlag(XMC_I2C_config->channel) & XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED) == 0U) || timeout == 0) + { + timeout--; + } for (uint8_t count = 0; count < (quantity - 1); count ++) { From 95b1f0e7e91baa6c26e0927d42e6edcf99bb8dc1 Mon Sep 17 00:00:00 2001 From: Monideep Bora Date: Wed, 30 Aug 2023 06:00:58 +0200 Subject: [PATCH 3/3] added delay to timeout logic to make execution fair to XMC devices with different frequencies --- libraries/Wire/src/Wire.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index fe35f516..9a5af1b0 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -246,10 +246,11 @@ uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddres } timeout = WIRE_COMMUNICATION_TIMEOUT; - + // wait for ACK or timeout incase no ACK is received, a time-based wait-state is added since XMC devices run at variable frequencies while(((XMC_I2C_CH_GetStatusFlag(XMC_I2C_config->channel) & XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED) == 0U) || timeout == 0) { - timeout--; + delay(1); + timeout--; } for (uint8_t count = 0; count < (quantity - 1); count ++)