/arch/arm/src/imxrt/imxrt_lpi2c.c: Fixes 2 bugs in the for IMXRT1050: (1) I2C time out and did not send STOP condition when sending single byte, (2) I2C could not receive bytes after repeated start.
This commit is contained in:
parent
2deaab261f
commit
42f1f8898b
@ -623,10 +623,14 @@
|
||||
#define GPIO_LPI2C2_SDA_2 (GPIO_PERIPH | GPIO_ALT3 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_SD_B1_10_INDEX))
|
||||
|
||||
#define GPIO_LPI2C3_SCL_1 (GPIO_PERIPH | GPIO_ALT1 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_AD_B1_07_INDEX))
|
||||
#define GPIO_LPI2C3_SCL_2 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_EMC_22_INDEX))
|
||||
#define GPIO_LPI2C3_SCL_2 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_EMC_22_INDEX) | \
|
||||
GPIO_SION_ENABLE | IOMUX_OPENDRAIN | \
|
||||
IOMUX_SPEED_MEDIUM | IOMUX_DRIVE_33OHM)
|
||||
#define GPIO_LPI2C3_SCL_3 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_SD_B0_00_INDEX))
|
||||
#define GPIO_LPI2C3_SDA_1 (GPIO_PERIPH | GPIO_ALT1 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_AD_B1_06_INDEX))
|
||||
#define GPIO_LPI2C3_SDA_2 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_EMC_21_INDEX))
|
||||
#define GPIO_LPI2C3_SDA_2 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_EMC_21_INDEX) | \
|
||||
GPIO_SION_ENABLE | IOMUX_OPENDRAIN | \
|
||||
IOMUX_SPEED_MEDIUM | IOMUX_DRIVE_33OHM)
|
||||
#define GPIO_LPI2C3_SDA_3 (GPIO_PERIPH | GPIO_ALT2 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_SD_B0_01_INDEX))
|
||||
|
||||
#define GPIO_LPI2C4_SCL_1 (GPIO_PERIPH | GPIO_ALT0 | GPIO_PADMUX(IMXRT_PADMUX_GPIO_AD_B0_12_INDEX))
|
||||
|
@ -1285,16 +1285,18 @@ static int imxrt_lpi2c_isr_process(struct imxrt_lpi2c_priv_s *priv)
|
||||
imxrt_lpi2c_traceevent(priv, I2CEVENT_NOSTART, priv->msgc);
|
||||
}
|
||||
|
||||
priv->msgv++;
|
||||
priv->msgc--;
|
||||
|
||||
if ((priv->flags & I2C_M_READ) != 0)
|
||||
{
|
||||
#ifndef CONFIG_I2C_POLLED
|
||||
/* Stop TX interrupt */
|
||||
|
||||
imxrt_lpi2c_modifyreg(priv, IMXRT_LPI2C_MIER_OFFSET,
|
||||
LPI2C_MIER_TDIE, 0);
|
||||
LPI2C_MIER_TDIE, LPI2C_MIER_RDIE);
|
||||
#endif
|
||||
/* Set LPI2C in read mode */
|
||||
|
||||
imxrt_lpi2c_putreg(priv, IMXRT_LPI2C_MTDR_OFFSET, LPI2C_MTDR_CMD_RXD | LPI2C_MTDR_DATA((priv->dcnt - 1)));
|
||||
}
|
||||
else
|
||||
@ -1305,10 +1307,13 @@ static int imxrt_lpi2c_isr_process(struct imxrt_lpi2c_priv_s *priv)
|
||||
imxrt_lpi2c_putreg(priv, IMXRT_LPI2C_MTDR_OFFSET,
|
||||
LPI2C_MTDR_CMD_TXD | LPI2C_MTDR_DATA(*priv->ptr++));
|
||||
priv->dcnt--;
|
||||
if ((priv->msgc <= 0) && (priv->dcnt == 0))
|
||||
{
|
||||
imxrt_lpi2c_sendstop(priv);
|
||||
}
|
||||
}
|
||||
|
||||
priv->msgv++;
|
||||
priv->msgc--;
|
||||
|
||||
}
|
||||
else if (priv->msgv && ((status & LPI2C_MSR_SDF) != 0))
|
||||
{
|
||||
|
@ -162,6 +162,9 @@
|
||||
#define GPIO_LPI2C1_SDA GPIO_LPI2C1_SDA_2 /* GPIO_AD_B1_01 */
|
||||
#define GPIO_LPI2C1_SCL GPIO_LPI2C1_SCL_2 /* GPIO_AD_B1_00 */
|
||||
|
||||
#define GPIO_LPI2C3_SDA GPIO_LPI2C3_SDA_2 /* GPIO_AD_B1_01 */
|
||||
#define GPIO_LPI2C3_SCL GPIO_LPI2C3_SCL_2 /* GPIO_AD_B1_00 */
|
||||
|
||||
/************************************************************************************
|
||||
* Public Types
|
||||
************************************************************************************/
|
||||
|
@ -57,7 +57,7 @@
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C1)
|
||||
#if defined(CONFIG_I2C_DRIVER)
|
||||
static void imxrt_i2c_register(int bus)
|
||||
{
|
||||
FAR struct i2c_master_s *i2c;
|
||||
@ -114,6 +114,16 @@ int imxrt_bringup(void)
|
||||
#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C1)
|
||||
imxrt_i2c_register(1);
|
||||
#endif
|
||||
#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C2)
|
||||
imxrt_i2c_register(2);
|
||||
#endif
|
||||
#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C3)
|
||||
imxrt_i2c_register(3);
|
||||
#endif
|
||||
#if defined(CONFIG_I2C_DRIVER) && defined(CONFIG_IMXRT_LPI2C4)
|
||||
imxrt_i2c_register(4);
|
||||
#endif
|
||||
|
||||
|
||||
UNUSED(ret);
|
||||
return OK;
|
||||
|
Loading…
x
Reference in New Issue
Block a user