mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
Diff: targets/TARGET_Silicon_Labs/TARGET_EFM32/i2c_api.c
- Revision:
- 163:74e0ce7f98e8
- Parent:
- 149:156823d33999
- Child:
- 179:b0033dcd6934
--- a/targets/TARGET_Silicon_Labs/TARGET_EFM32/i2c_api.c Wed Apr 12 16:21:43 2017 +0100 +++ b/targets/TARGET_Silicon_Labs/TARGET_EFM32/i2c_api.c Fri Apr 28 14:04:18 2017 +0100 @@ -121,11 +121,13 @@ int loc = pinmap_merge(loc_sda, loc_scl); MBED_ASSERT(loc != NC); /* Set location */ + obj->i2c.location = I2C_ROUTE_SDAPEN | I2C_ROUTE_SCLPEN | (loc << _I2C_ROUTE_LOCATION_SHIFT); obj->i2c.i2c->ROUTE = I2C_ROUTE_SDAPEN | I2C_ROUTE_SCLPEN | (loc << _I2C_ROUTE_LOCATION_SHIFT); #else obj->i2c.i2c->ROUTEPEN = I2C_ROUTEPEN_SDAPEN | I2C_ROUTEPEN_SCLPEN; - obj->i2c.i2c->ROUTELOC0 = (pin_location(sda, PinMap_I2C_SDA) << _I2C_ROUTELOC0_SDALOC_SHIFT) | - (pin_location(scl, PinMap_I2C_SCL) << _I2C_ROUTELOC0_SCLLOC_SHIFT); + obj->i2c.location = (pin_location(sda, PinMap_I2C_SDA) << _I2C_ROUTELOC0_SDALOC_SHIFT) | + (pin_location(scl, PinMap_I2C_SCL) << _I2C_ROUTELOC0_SCLLOC_SHIFT); + obj->i2c.i2c->ROUTELOC0 = obj->i2c.location; #endif /* Set up the pins for I2C use */ @@ -215,6 +217,13 @@ { I2C_TypeDef *i2c = obj->i2c.i2c; + /* Restore pin configuration in case we changed I2C object */ +#ifdef I2C_ROUTE_SDAPEN + obj->i2c.i2c->ROUTE = obj->i2c.location; +#else + obj->i2c.i2c->ROUTELOC0 = obj->i2c.location; +#endif + /* Ensure buffers are empty */ i2c->CMD = I2C_CMD_CLEARPC | I2C_CMD_CLEARTX; if (i2c->IF & I2C_IF_RXDATAV) { @@ -410,7 +419,6 @@ data[count] = i2c_byte_read(obj, 0); } - return count; } @@ -459,6 +467,12 @@ if((tx_length == 0) && (rx_length == 0)) return; // For now, we are assuming a solely interrupt-driven implementation. +#ifdef I2C_ROUTE_SDAPEN + obj->i2c.i2c->ROUTE = obj->i2c.location; +#else + obj->i2c.i2c->ROUTELOC0 = obj->i2c.location; +#endif + // Store transfer config obj->i2c.xfer.addr = address;