diff --git a/arch/arm/src/stm32h7/stm32_i2c.c b/arch/arm/src/stm32h7/stm32_i2c.c index ff05d56431f..0808f45e19f 100644 --- a/arch/arm/src/stm32h7/stm32_i2c.c +++ b/arch/arm/src/stm32h7/stm32_i2c.c @@ -1710,7 +1710,7 @@ static int stm32_i2c_isr_process(struct stm32_i2c_priv_s *priv) * can't write NBYTES to clear TCR so it will fire forever. */ - if ((priv->msgc - 1) == 0) + if (priv->msgc == 1) { stm32_i2c_disable_reload(priv); } @@ -1861,11 +1861,18 @@ static int stm32_i2c_isr_process(struct stm32_i2c_priv_s *priv) i2cinfo("TC: ENTER dcnt = %i msgc = %i status 0x%08x\n", priv->dcnt, priv->msgc, status); - /* Prior message has been sent successfully */ + /* Prior message has been sent successfully. Or there could have + * been an error that set msgc to 0; So test for that case as + * we do not want to decrement msgc less then zero nor move msgv + * past the last message. + */ - priv->msgc--; + if (priv->msgc > 0) + { + priv->msgc--; + } - /* if additional messages remain to be transmitted / received */ + /* Are there additional messages remain to be transmitted / received? */ if (priv->msgc > 0) { diff --git a/arch/arm/src/stm32l4/stm32l4_i2c.c b/arch/arm/src/stm32l4/stm32l4_i2c.c index b1c5a3d2cc5..06d4dcf0853 100644 --- a/arch/arm/src/stm32l4/stm32l4_i2c.c +++ b/arch/arm/src/stm32l4/stm32l4_i2c.c @@ -1880,7 +1880,7 @@ static int stm32l4_i2c_isr_process(struct stm32l4_i2c_priv_s *priv) * can't write NBYTES to clear TCR so it will fire forever. */ - if ((priv->msgc - 1) == 0) + if (priv->msgc == 1) { stm32l4_i2c_disable_reload(priv); } @@ -2031,11 +2031,18 @@ static int stm32l4_i2c_isr_process(struct stm32l4_i2c_priv_s *priv) i2cinfo("TC: ENTER dcnt = %i msgc = %i status 0x%08x\n", priv->dcnt, priv->msgc, status); - /* Prior message has been sent successfully */ + /* Prior message has been sent successfully. Or there could have + * been an error that set msgc to 0; So test for that case as + * we do not want to decrement msgc less then zero nor move msgv + * past the last message. + */ - priv->msgc--; + if (priv->msgc > 0) + { + priv->msgc--; + } - /* if additional messages remain to be transmitted / received */ + /* Are there additional messages remain to be transmitted / received? */ if (priv->msgc > 0) {