mbed library sources
Fork of mbed-src by
Diff: targets/hal/TARGET_STM/TARGET_NUCLEO_F334R8/i2c_api.c
- Revision:
- 305:1f0269907d8b
- Parent:
- 272:949bd8bf133b
- Child:
- 402:09075a3b15e3
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F334R8/i2c_api.c Fri Aug 29 17:15:07 2014 +0100 +++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F334R8/i2c_api.c Fri Aug 29 20:45:07 2014 +0100 @@ -57,8 +57,9 @@ I2C_HandleTypeDef I2cHandle; -void i2c_init(i2c_t *obj, PinName sda, PinName scl) -{ +int i2c1_inited = 0; + +void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // Determine the I2C to use I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); @@ -66,17 +67,17 @@ obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl); MBED_ASSERT(obj->i2c != (I2CName)NC); - // Enable I2C clock - __I2C1_CLK_ENABLE(); - - // Configure the I2C clock source - __HAL_RCC_I2C1_CONFIG(RCC_I2C1CLKSOURCE_SYSCLK); - - // Configure I2C pins - pinmap_pinout(sda, PinMap_I2C_SDA); - pinmap_pinout(scl, PinMap_I2C_SCL); - pin_mode(sda, OpenDrain); - pin_mode(scl, OpenDrain); + // Enable I2C1 clock and pinout if not done + if ((obj->i2c == I2C_1)&& !i2c1_inited) { + i2c1_inited = 1; + __HAL_RCC_I2C1_CONFIG(RCC_I2C1CLKSOURCE_SYSCLK); + __I2C1_CLK_ENABLE(); + // Configure I2C pins + pinmap_pinout(sda, PinMap_I2C_SDA); + pinmap_pinout(scl, PinMap_I2C_SCL); + pin_mode(sda, OpenDrain); + pin_mode(scl, OpenDrain); + } // Reset to clear pending flags if any i2c_reset(obj); @@ -92,6 +93,11 @@ MBED_ASSERT((hz == 100000) || (hz == 400000) || (hz == 1000000)); I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c); + int timeout; + + // wait before init + timeout = LONG_TIMEOUT; + while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0)); // Update the SystemCoreClock variable. SystemCoreClockUpdate(); @@ -313,6 +319,12 @@ void i2c_reset(i2c_t *obj) { + int timeout; + + // wait before reset + timeout = LONG_TIMEOUT; + while((__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY)) && (timeout-- != 0)); + __I2C1_FORCE_RESET(); __I2C1_RELEASE_RESET(); }