diff --git a/arch/xtensa/src/esp32/esp32_i2c.c b/arch/xtensa/src/esp32/esp32_i2c.c index 889bf9ec38..0a8313f9d1 100644 --- a/arch/xtensa/src/esp32/esp32_i2c.c +++ b/arch/xtensa/src/esp32/esp32_i2c.c @@ -895,16 +895,39 @@ static int esp32_i2c_transfer(struct i2c_master_s *dev, esp32_i2c_init_clock(priv, msgs[i].frequency); - /* Reset I2C trace logic */ + if ((msgs[i].flags & I2C_M_NOSTART) != 0) + { + esp32_i2c_traceevent(priv, I2CEVENT_SENDBYTE, priv->bytes, + esp32_i2c_get_reg(priv, I2C_SR_OFFSET)); + esp32_i2c_senddata(priv); - esp32_i2c_tracereset(priv); + if (priv->bytes == msgs[i].length) + { + if ((msgs[i].flags & I2C_M_NOSTOP) == 0) + { + priv->i2cstate = I2CSTATE_STOP; + } +#ifndef CONFIG_I2C_POLLED + else + { + priv->i2cstate = I2CSTATE_FINISH; + } +#endif + } + } + else + { + /* Reset I2C trace logic */ - esp32_i2c_traceevent(priv, I2CEVENT_SENDADDR, msgs[i].addr, - esp32_i2c_get_reg(priv, I2C_SR_OFFSET)); + esp32_i2c_tracereset(priv); - /* Send the start cmd */ + esp32_i2c_traceevent(priv, I2CEVENT_SENDADDR, msgs[i].addr, + esp32_i2c_get_reg(priv, I2C_SR_OFFSET)); - esp32_i2c_sendstart(priv); + /* Send the start cmd */ + + esp32_i2c_sendstart(priv); + } #ifndef CONFIG_I2C_POLLED if (esp32_i2c_sem_waitdone(priv) < 0) @@ -1391,7 +1414,16 @@ static inline void esp32_i2c_process(struct esp32_i2c_priv_s *priv, if (priv->bytes == msg->length) { - priv->i2cstate = I2CSTATE_STOP; + if ((msg->flags & I2C_M_NOSTOP) == 0) + { + priv->i2cstate = I2CSTATE_STOP; + } +#ifndef CONFIG_I2C_POLLED + else + { + priv->i2cstate = I2CSTATE_FINISH; + } +#endif } } }