mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Revision:
305:1f0269907d8b
Parent:
247:135e3186a638
diff -r 89b9c3a9a045 -r 1f0269907d8b targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c	Fri Aug 29 17:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c	Fri Aug 29 20:45:07 2014 +0100
@@ -55,7 +55,13 @@
     {NC,    NC,    0}
 };
 
+int i2c1_inited = 0;
+int i2c2_inited = 0;
+
 void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
+    int timeout;
+    I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
+	
     // 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);
@@ -63,19 +69,25 @@
     obj->i2c = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
     MBED_ASSERT(obj->i2c != (I2CName)NC);
 
-    // Enable I2C clock
-    if (obj->i2c == I2C_1) {
+    // Enable I2C clock and configure I2C pins if not done before
+    if ((obj->i2c == I2C_1)&& !i2c1_inited) {
+        i2c1_inited = 1;
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
+        // Configure I2C pins
+        pinmap_pinout(scl, PinMap_I2C_SCL);
+        pin_mode(scl, OpenDrain);
+        pinmap_pinout(sda, PinMap_I2C_SDA);
+        pin_mode(sda, OpenDrain);
     }
-    if (obj->i2c == I2C_2) {
+    if ((obj->i2c == I2C_2)&& !i2c2_inited) {
+        i2c2_inited = 1;
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
-    }
-
     // Configure I2C pins
     pinmap_pinout(scl, PinMap_I2C_SCL);
     pin_mode(scl, OpenDrain);
     pinmap_pinout(sda, PinMap_I2C_SDA);
     pin_mode(sda, OpenDrain);
+		}
 
     // Reset to clear pending flags if any
     i2c_reset(obj);
@@ -85,10 +97,17 @@
 }
 
 void i2c_frequency(i2c_t *obj, int hz) {
+	  int timeout;
+	
     I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
     I2C_InitTypeDef I2C_InitStructure;
 
     if ((hz != 0) && (hz <= 400000)) {
+			
+        // wait before init
+        timeout = LONG_TIMEOUT;
+        while((I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY)) && (timeout-- != 0));
+			
         I2C_DeInit(i2c);
 
         // I2C configuration
@@ -253,6 +272,13 @@
 }
 
 void i2c_reset(i2c_t *obj) {
+    I2C_TypeDef *i2c = (I2C_TypeDef *)(obj->i2c);
+    int timeout;
+	
+    // wait before reset
+    timeout = LONG_TIMEOUT;
+    while((I2C_GetFlagStatus(i2c, I2C_FLAG_BUSY)) && (timeout-- != 0));
+	
     if (obj->i2c == I2C_1) {
         RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
         RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);