From 303d037a0755ac748ed414c88a9466852e39842a Mon Sep 17 00:00:00 2001 From: Crist Xu Date: Mon, 31 Aug 2020 10:20:25 +0800 Subject: [PATCH] drivers: i2c: Fix mcux driver transfer status after NACK Adds a delay after transferring zero-length messages to correctly detect a NACK. Signed-off-by: Crist Xu --- drivers/i2c/i2c_mcux_lpi2c.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/i2c_mcux_lpi2c.c b/drivers/i2c/i2c_mcux_lpi2c.c index 65226c6573243..b16afb69b948e 100644 --- a/drivers/i2c/i2c_mcux_lpi2c.c +++ b/drivers/i2c/i2c_mcux_lpi2c.c @@ -16,6 +16,10 @@ LOG_MODULE_REGISTER(mcux_lpi2c); #include "i2c-priv.h" +/* Wait for the duration of 12 bits to detect a NAK after a bus + * address scan. (10 appears sufficient, 20% safety factor.) + */ +#define SCAN_DELAY_US(baudrate) (12 * USEC_PER_SEC / baudrate) struct mcux_lpi2c_config { LPI2C_Type *base; @@ -161,7 +165,13 @@ static int mcux_lpi2c_transfer(const struct device *dev, struct i2c_msg *msgs, LPI2C_MasterTransferAbort(base, &data->handle); return -EIO; } - + if (msgs->len == 0) { + k_busy_wait(SCAN_DELAY_US(config->bitrate)); + if (0 != (base->MSR & LPI2C_MSR_NDF_MASK)) { + LPI2C_MasterTransferAbort(base, &data->handle); + return -EIO; + } + } /* Move to the next message */ msgs++; }