Sending the stop condition without waiting for transfer complete
has been found to lock the bus (BUSY) when NACKF is raised.

Tested accessing the NXP SE05X I2C device.
https://www.nxp.com/docs/en/application-note/AN12399.pdf

Signed-off-by: Jorge Ramirez-Ortiz <jo...@foundries.io>
Reviewed-by: Oleksandr Suvorov <oleksandr.suvo...@foundries.io>
---
 drivers/i2c/stm32f7_i2c.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/i2c/stm32f7_i2c.c b/drivers/i2c/stm32f7_i2c.c
index 3a727e68ac..14827e5cec 100644
--- a/drivers/i2c/stm32f7_i2c.c
+++ b/drivers/i2c/stm32f7_i2c.c
@@ -485,9 +485,11 @@ static int stm32_i2c_message_xfer(struct stm32_i2c_priv 
*i2c_priv,
                }
        }
 
-       /* End of transfer, send stop condition */
-       mask = STM32_I2C_CR2_STOP;
-       setbits_le32(&regs->cr2, mask);
+       if (!ret) {
+               /* End of transfer, send stop condition */
+               mask = STM32_I2C_CR2_STOP;
+               setbits_le32(&regs->cr2, mask);
+       }
 
        return stm32_i2c_check_end_of_message(i2c_priv);
 }
-- 
2.34.1

Reply via email to