//add-on i2c handler void I2C_IRQHandler(void){ uint32_t intstat = LPC_I2C->INTSTAT; uint32_t stat = LPC_I2C->STAT; uint32_t mater_state; uint32_t slave_state; [...] if(intstat & I2C_STAT_SLVPENDING){ slave_state = stat & I2C_STAT_SLVSTATE; if(slave_state== I2C_STAT_SLVST_ADDR){ if(i2c_rx_data_available){ LPC_I2C->SLVCTL = I2C_SLVCTL_SLVNACK; // nack address: still processing data } else{ LPC_I2C->SLVCTL = I2C_SLVCTL_SLVCONTINUE; // ack address if(add_on_rx_size){ add_on_rx_size=0; } add_on_rx[add_on_rx_size]=add_on_address<<1; ++add_on_rx_size; } } else if(slave_state== I2C_STAT_SLVST_RX){ if(add_on_rx_size>=add_on_max_rx_size){ LPC_I2C->SLVCTL = I2C_SLVCTL_SLVNACK; // nack data } else{ add_on_rx[add_on_rx_size]=LPC_I2C->SLVDAT; ++add_on_rx_size; LPC_I2C->SLVCTL = I2C_SLVCTL_SLVCONTINUE; // ack data } } if(stat&I2C_STAT_SLVDESEL){ LPC_I2C->STAT=I2C_STAT_SLVDESEL;//clear flag while(1);//test to see where stop condition is detected } } } |