LPC_I2C->MSTDAT = (0x23 << 1) | 0; // address and 1 for RWn bit in // order to read data LPC_I2C->MSTDAT = (0x23 << 1) | 0; // address and 0 for RWn bit in order to write // subaddress  | 
 LPC_I2C->MSTDAT = (0x23 << 1) & ~(1<<0);  | 
 LPC_I2C->MSTDAT = (0x23 << 1) | (1<<0);  | 
 
void I2c_IRQHandler() {
uint32_t intstat = LPC_I2C->INTSTAT;
uint32_t stat = LPC_I2C->STAT;
    if(intstat & I2C_STAT_MSTPENDING) {
        uint32_t mst_state = stat & I2C_STAT_MSTSTATE;
        if(mst_state == I2C_STAT_MSTST_IDLE) {
            LPC_I2C->MSTDAT = (0x23 << 1) | 1; // address and 1 for RWn bit in order to read data
            LPC_I2C->MSTCTL = I2C_MSTCTL_MSTSTART; // send start
        }
        if(mst_state == I2C_STAT_MSTST_RX) {
            uint8_t data;
            data = LPC_I2C->MSTDAT; // receive data
            if(data != 0xdd) abort();
            LPC_I2C->MSTDAT = (0x23 << 1) | 0; // address and 1 for RWn bit in order to read data
            LPC_I2C->MSTCTL = I2C_MSTCTL_MSTSTART; // repeated start (nack implied)
        }
        if(mst_state == I2C_STAT_MSTSTX) {
            LPC_I2C->MSTCTL = I2C_MSTCTL_MSTSTOP; // stop transaction
            LPC_I2C->INTENCLR = I2C_STAT_MSTPENDING;
        }
    }
}  |