inline int i2c_start(i2c_t *obj) { int status = 0; int isInterrupted = I2C_CONSET(obj) & (1 << 3); // 8.1 Before master mode can be entered, I2CON must be initialised to: // - I2EN STA STO SI AA - - // - 1 0 0 x x - - // if AA = 0, it can't enter slave mode i2c_conclr(obj, 1, 1, 0, 1); // The master mode may now be entered by setting the STA bit // this will generate a start condition when the bus becomes free i2c_conset(obj, 1, 0, 0, 1); // Clearing SI bit when it wasn't set on entry can jump past state // 0x10 or 0x08 and erroneously send uninitialized slave address. if (isInterrupted) i2c_clear_SI(obj); i2c_wait_SI(obj); status = i2c_status(obj); // Clear start bit now that it's transmitted i2c_conclr(obj, 1, 0, 0, 0); return status; }
void i2c_slave_mode(i2c_t *obj, int enable_slave) { if (enable_slave != 0) { i2c_conclr(obj, 1, 1, 1, 0); i2c_conset(obj, 0, 0, 0, 1); } else { i2c_conclr(obj, 1, 1, 1, 1); } }
void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // determine the SPI to use I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); obj->i2c = (LPC_I2C_TypeDef *)pinmap_merge(i2c_sda, i2c_scl); MBED_ASSERT((int)obj->i2c != NC); // enable power i2c_power_enable(obj); // set default frequency at 100k i2c_frequency(obj, 100000); i2c_conclr(obj, 1, 1, 1, 1); i2c_interface_enable(obj); pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); // OpenDrain must explicitly be enabled for p0.0 and p0.1 if (sda == P0_0) { pin_mode(sda, OpenDrain); } if (scl == P0_1) { pin_mode(scl, OpenDrain); } }
inline int i2c_start(i2c_t *obj) { int status = 0; // 8.1 Before master mode can be entered, I2CON must be initialised to: // - I2EN STA STO SI AA - - // - 1 0 0 0 x - - // if AA = 0, it can't enter slave mode i2c_conclr(obj, 1, 1, 1, 1); // The master mode may now be entered by setting the STA bit // this will generate a start condition when the bus becomes free i2c_conset(obj, 1, 0, 0, 1); i2c_wait_SI(obj); status = i2c_status(obj); // Clear start bit now transmitted, and interrupt bit i2c_conclr(obj, 1, 0, 0, 0); return status; }
static inline int i2c_do_read(i2c_t *obj, int last) { // we are in state 0x40 (SLA+R tx'd) or 0x50 (data rx'd and ack) if(last) { i2c_conclr(obj, 0, 0, 0, 1); // send a NOT ACK } else { i2c_conset(obj, 0, 0, 0, 1); // send a ACK } // accept byte i2c_clear_SI(obj); // wait for it to arrive i2c_wait_SI(obj); // return the data return (I2C_DAT(obj) & 0xFF); }
void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // determine the SPI to use I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); obj->i2c = (LPC_I2C_TypeDef *)pinmap_merge(i2c_sda, i2c_scl); MBED_ASSERT((int)obj->i2c != NC); // enable power i2c_power_enable(obj); // set default frequency at 100k i2c_frequency(obj, 100000); i2c_conclr(obj, 1, 1, 1, 1); i2c_interface_enable(obj); pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); }
void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // determine the SPI to use I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); obj->i2c = (LPC_I2C_T *)pinmap_merge(i2c_sda, i2c_scl); if ((int)obj->i2c == NC) { error("I2C pin mapping failed"); } // set default frequency at 100k i2c_frequency(obj, 100000); i2c_conclr(obj, 1, 1, 1, 1); i2c_interface_enable(obj); // If pins are not dedicated, set SCU functions if (sda != P_DED) { pinmap_pinout(sda, PinMap_I2C_SDA); } if (scl != P_DED) { pinmap_pinout(scl, PinMap_I2C_SCL); } }
void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // determine the SPI to use I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); obj->i2c = (LPC_I2C_T *)pinmap_merge(i2c_sda, i2c_scl); if ((int)obj->i2c == NC) { error("I2C pin mapping failed"); } // set default frequency at 100k i2c_frequency(obj, 100000); i2c_conclr(obj, 1, 1, 1, 1); i2c_interface_enable(obj); // Set SCU functions if (scl == P_DED) { // Enable dedicated I2C0 SDA and SCL pins (open drain) LPC_SCU->SFSI2C0 = (1 << 11) | (1 << 3); } else { pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); } }
void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // determine the SPI to use I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) obj->i2c = (LPC_I2C_TypeDef *)pinmap_merge(i2c_sda, i2c_scl); #elif defined(TARGET_LPC11U24) obj->i2c = (LPC_I2C_Type *)pinmap_merge(i2c_sda, i2c_scl); #endif if ((int)obj->i2c == NC) { error("I2C pin mapping failed"); } // enable power i2c_power_enable(obj); // set default frequency at 100k i2c_frequency(obj, 100000); i2c_conclr(obj, 1, 1, 1, 1); i2c_interface_enable(obj); pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); }
// Clear the Serial Interrupt (SI) static inline void i2c_clear_SI(i2c_t *obj) { i2c_conclr(obj, 0, 0, 1, 0); }