Thank you for your answer.
if (I2C_IS_BUSY(base))
{
/*Bus already busy => cancel previous operation*/
/* send start signal */
I2C_C1_REG(base) &= ~I2C_C1_IICEN_MASK;
I2C_C1_REG(base) |= I2C_C1_TX_MASK; /* Set transmit (TX) mode */
I2C_C1_REG(base) |= I2C_C1_MST_MASK; /* START signal generated */
I2C_C1_REG(base) |= I2C_C1_IICEN_MASK;
/* send write command to release SDA line*/
I2C_C1_REG(base) |= I2C_C1_MST_MASK; /* set MASTER mode */
I2C_C1_REG(base) |= I2C_C1_TX_MASK; /* Set transmit (TX) mode */
I2C_D_REG(base) = 0xFF;
while ((I2C_S_REG(base) & I2C_S_IICIF_MASK) == 0U) {} /* wait interrupt */
I2C_S_REG(base) |= I2C_S_IICIF_MASK; /* clear interrupt bit */
/* Clear arbitration error flag*/
I2C_S_REG(base) |= I2C_S_ARBL_MASK;
/* Send start */
I2C_C1_REG(base) &= ~I2C_C1_IICEN_MASK;
I2C_C1_REG(base) |= I2C_C1_TX_MASK; /* Set transmit (TX) mode */
I2C_C1_REG(base) |= I2C_C1_MST_MASK; /* START signal generated */
I2C_C1_REG(base) |= I2C_C1_IICEN_MASK;
/*Wait until start is send*/
Pause();
/* Send stop */
I2C_C1_REG(base) &= ~I2C_C1_IICEN_MASK;
I2C_C1_REG(base) |= I2C_C1_MST_MASK;
I2C_C1_REG(base) &= ~I2C_C1_MST_MASK; /* set SLAVE mode */
I2C_C1_REG(base) &= ~I2C_C1_TX_MASK; /* Set Rx */
I2C_C1_REG(base) |= I2C_C1_IICEN_MASK;
while (I2C_IS_BUSY(base))
{
/* wait */
}
/* Clear arbitration error & interrupt flag*/
I2C_S_REG(base) |= I2C_S_IICIF_MASK;
I2C_S_REG(base) |= I2C_S_ARBL_MASK;
}
It is roughly the same thing as my solution, but driving the signals SCL/SDA in GPIO mode.