mbed w/ spi bug fig

Dependents:   display-puck

Fork of mbed-src by mbed official

Files at this revision

API Documentation at this revision

Comitter:
mbed_official
Date:
Tue Jul 01 15:00:09 2014 +0100
Parent:
246:c22b0f22a58f
Child:
248:0df67d8046d9
Commit message:
Synchronized with git revision 4f86d397190b9d18f22b4a189573d65b970f3662

Full URL: https://github.com/mbedmicro/mbed/commit/4f86d397190b9d18f22b4a189573d65b970f3662/

[NUCLEOs] enhance I2C API to make it work with EEPROM

Changed in this revision

targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F072RB/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F302R8/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F334R8/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/i2c_api.c	Tue Jul 01 06:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F030R8/i2c_api.c	Tue Jul 01 15:00:09 2014 +0100
@@ -178,8 +178,6 @@
     int timeout;
     int value;
 
-    if (length == 0) return 0;
-
     // Configure slave address, nbytes, reload, end mode and start or stop generation
     I2C_TransferHandling(i2c, address, length, I2C_SoftEnd_Mode, I2C_Generate_Start_Read);
 
@@ -192,7 +190,7 @@
     timeout = FLAG_TIMEOUT;
     while (!I2C_GetFlagStatus(i2c, I2C_FLAG_TC)) {
         timeout--;
-        if (timeout == 0) return 0;
+        if (timeout == 0) return -1;
     }
 
     if (stop) i2c_stop(obj);
@@ -205,8 +203,6 @@
     int timeout;
     int count;
 
-    if (length == 0) return 0;
-
     // Configure slave address, nbytes, reload, end mode and start generation
     I2C_TransferHandling(i2c, address, length, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
 
@@ -218,7 +214,7 @@
     timeout = FLAG_TIMEOUT;
     while (!I2C_GetFlagStatus(i2c, I2C_FLAG_TC)) {
         timeout--;
-        if (timeout == 0) return 0;
+        if (timeout == 0) return -1;
     }
 
     if (stop) i2c_stop(obj);
@@ -236,7 +232,7 @@
     while (I2C_GetFlagStatus(i2c, I2C_ISR_RXNE) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F072RB/i2c_api.c	Tue Jul 01 06:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F072RB/i2c_api.c	Tue Jul 01 15:00:09 2014 +0100
@@ -159,8 +159,6 @@
     int count;
     int value;
 
-    if (length == 0) return 0;
-
     /* update CR2 register */
     i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
                | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_READ);
@@ -176,7 +174,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TC) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
     __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_TC);
@@ -189,7 +187,7 @@
         while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
             timeout--;
             if (timeout == 0) {
-                return 0;
+                return -1;
             }
         }
         /* Clear STOP Flag */
@@ -205,8 +203,6 @@
     int timeout;
     int count;
 
-    if (length == 0) return 0;
-
     /* update CR2 register */
     i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
                | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_WRITE);
@@ -222,7 +218,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TC) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
     __HAL_I2C_CLEAR_FLAG(&I2cHandle, I2C_FLAG_TC);
@@ -235,7 +231,7 @@
         while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
             timeout--;
             if (timeout == 0) {
-                return 0;
+                return -1;
             }
         }
         /* Clear STOP Flag */
@@ -253,7 +249,7 @@
     timeout = FLAG_TIMEOUT;
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_RXNE) == RESET) {
         if ((timeout--) == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -355,8 +351,6 @@
 int i2c_slave_read(i2c_t *obj, char *data, int length) {
     char size = 0;
 
-    if (length == 0) return 0;
-
     while (size < length) data[size++] = (char)i2c_byte_read(obj, 0);
 
     return size;
@@ -366,8 +360,6 @@
     char size = 0;
     I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
 
-    if (length == 0) return 0;
-
     do {
         i2c_byte_write(obj, data[size]);
         size++;
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c	Tue Jul 01 06:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F103RB/i2c_api.c	Tue Jul 01 15:00:09 2014 +0100
@@ -139,8 +139,6 @@
     int count;
     int value;
 
-    if (length == 0) return 0;
-
     i2c_start(obj);
 
     // Send slave address for read
@@ -151,7 +149,7 @@
     while (I2C_CheckEvent(i2c, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) == ERROR) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -189,7 +187,7 @@
     while (I2C_CheckEvent(i2c, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) == ERROR) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -226,7 +224,7 @@
     while (I2C_GetFlagStatus(i2c, I2C_FLAG_RXNE) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F302R8/i2c_api.c	Tue Jul 01 06:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F302R8/i2c_api.c	Tue Jul 01 15:00:09 2014 +0100
@@ -219,8 +219,6 @@
     int timeout;
     int value;
 
-    if (length == 0) return 0;
-
     // Configure slave address, nbytes, reload, end mode and start or stop generation
     I2C_TransferHandling(i2c, address, length, I2C_SoftEnd_Mode, I2C_Generate_Start_Read);
 
@@ -233,7 +231,7 @@
     timeout = FLAG_TIMEOUT;
     while (!I2C_GetFlagStatus(i2c, I2C_FLAG_TC)) {
         timeout--;
-        if (timeout == 0) return 0;
+        if (timeout == 0) return -1;
     }
 
     if (stop) i2c_stop(obj);
@@ -247,8 +245,6 @@
     int timeout;
     int count;
 
-    if (length == 0) return 0;
-
     // Configure slave address, nbytes, reload, end mode and start generation
     I2C_TransferHandling(i2c, address, length, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
 
@@ -260,7 +256,7 @@
     timeout = FLAG_TIMEOUT;
     while (!I2C_GetFlagStatus(i2c, I2C_FLAG_TC)) {
         timeout--;
-        if (timeout == 0) return 0;
+        if (timeout == 0) return -1;
     }
 
     if (stop) i2c_stop(obj);
@@ -278,7 +274,7 @@
     while (I2C_GetFlagStatus(i2c, I2C_ISR_RXNE) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F334R8/i2c_api.c	Tue Jul 01 06:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F334R8/i2c_api.c	Tue Jul 01 15:00:09 2014 +0100
@@ -199,8 +199,6 @@
     int count;
     int value;
 
-    if (length == 0) return 0;
-
     /* update CR2 register */
     i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
                | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_READ);
@@ -216,7 +214,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TC) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -230,7 +228,7 @@
         while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
             timeout--;
             if (timeout == 0) {
-                return 0;
+                return -1;
             }
         }
         /* Clear STOP Flag */
@@ -247,8 +245,6 @@
     int timeout;
     int count;
 
-    if (length == 0) return 0;
-
     /* update CR2 register */
     i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
                | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_WRITE);
@@ -262,7 +258,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TC) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -276,7 +272,7 @@
         while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
             timeout--;
             if (timeout == 0) {
-                return 0;
+                return -1;
             }
         }
         /* Clear STOP Flag */
@@ -295,7 +291,7 @@
     timeout = FLAG_TIMEOUT;
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_RXNE) == RESET) {
         if ((timeout--) == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -396,8 +392,6 @@
 {
     char size = 0;
 
-    if (length == 0) return 0;
-
     while (size < length) data[size++] = (char)i2c_byte_read(obj, 0);
 
     return size;
@@ -408,8 +402,6 @@
     char size = 0;
     I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
 
-    if (length == 0) return 0;
-
     do {
         i2c_byte_write(obj, data[size]);
         size++;
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/i2c_api.c	Tue Jul 01 06:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F401RE/i2c_api.c	Tue Jul 01 15:00:09 2014 +0100
@@ -155,8 +155,6 @@
     int count;
     int value;
 
-    if (length == 0) return 0;
-
     i2c_start(obj);
 
     // Wait until SB flag is set
@@ -164,7 +162,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_SB) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -176,7 +174,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_ADDR) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
     __HAL_I2C_CLEAR_ADDRFLAG(&I2cHandle);
@@ -206,7 +204,6 @@
     int timeout;
     int count;
 
-    if (length == 0) return 0;
     i2c_start(obj);
 
     // Wait until SB flag is set
@@ -214,7 +211,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_SB) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -226,7 +223,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_ADDR) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
     __HAL_I2C_CLEAR_ADDRFLAG(&I2cHandle);
@@ -234,7 +231,7 @@
     for (count = 0; count < length; count++) {
         if (i2c_byte_write(obj, data[count]) != 1) {
             i2c_stop(obj);
-            return 0;
+            return -1;
         }
     }
 
@@ -262,7 +259,7 @@
     timeout = FLAG_TIMEOUT;
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_RXNE) == RESET) {
         if ((timeout--) == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -353,7 +350,6 @@
 int i2c_slave_read(i2c_t *obj, char *data, int length) {
     uint32_t Timeout;
     int size = 0;
-    if (length == 0) return 0;
 
     I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
 
@@ -364,7 +360,7 @@
         while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_RXNE) == RESET) {
             Timeout--;
             if (Timeout == 0) {
-                return 0;
+                return -1;
             }
         }
 
@@ -386,7 +382,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
         Timeout--;
         if (Timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -398,7 +394,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY) == SET) {
         Timeout--;
         if (Timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -408,7 +404,6 @@
 int i2c_slave_write(i2c_t *obj, const char *data, int length) {
     uint32_t Timeout;
     int size = 0;
-    if (length == 0) return 0;
 
     I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
 
@@ -418,7 +413,7 @@
         while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TXE) == RESET) {
             Timeout--;
             if (Timeout == 0) {
-                return 0;
+                return -1;
             }
         }
 
@@ -441,7 +436,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_AF) == RESET) {
         Timeout--;
         if (Timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -455,7 +450,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY) == SET) {
         Timeout--;
         if (Timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/i2c_api.c	Tue Jul 01 06:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_F411RE/i2c_api.c	Tue Jul 01 15:00:09 2014 +0100
@@ -162,8 +162,6 @@
     int count;
     int value;
 
-    if (length == 0) return 0;
-
     i2c_start(obj);
 
     // Wait until SB flag is set
@@ -171,7 +169,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_SB) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -183,7 +181,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_ADDR) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
     __HAL_I2C_CLEAR_ADDRFLAG(&I2cHandle);
@@ -214,7 +212,6 @@
     int timeout;
     int count;
 
-    if (length == 0) return 0;
     i2c_start(obj);
 
     // Wait until SB flag is set
@@ -222,7 +219,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_SB) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -234,7 +231,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_ADDR) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
     __HAL_I2C_CLEAR_ADDRFLAG(&I2cHandle);
@@ -242,7 +239,7 @@
     for (count = 0; count < length; count++) {
         if (i2c_byte_write(obj, data[count]) != 1) {
             i2c_stop(obj);
-            return 0;
+            return -1;
         }
     }
 
@@ -271,7 +268,7 @@
     timeout = FLAG_TIMEOUT;
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_RXNE) == RESET) {
         if ((timeout--) == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -368,7 +365,6 @@
 {
     uint32_t Timeout;
     int size = 0;
-    if (length == 0) return 0;
 
     I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
 
@@ -379,7 +375,7 @@
         while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_RXNE) == RESET) {
             Timeout--;
             if (Timeout == 0) {
-                return 0;
+                return -1;
             }
         }
 
@@ -401,7 +397,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
         Timeout--;
         if (Timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -413,7 +409,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY) == SET) {
         Timeout--;
         if (Timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -424,7 +420,6 @@
 {
     uint32_t Timeout;
     int size = 0;
-    if (length == 0) return 0;
 
     I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
 
@@ -434,7 +429,7 @@
         while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TXE) == RESET) {
             Timeout--;
             if (Timeout == 0) {
-                return 0;
+                return -1;
             }
         }
 
@@ -457,7 +452,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_AF) == RESET) {
         Timeout--;
         if (Timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -471,7 +466,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_BUSY) == SET) {
         Timeout--;
         if (Timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/i2c_api.c	Tue Jul 01 06:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L053R8/i2c_api.c	Tue Jul 01 15:00:09 2014 +0100
@@ -159,8 +159,6 @@
     int count;
     int value;
 
-    if (length == 0) return 0;
-
     /* update CR2 register */
     i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
                | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_READ);
@@ -176,7 +174,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TC) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -190,7 +188,7 @@
         while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
             timeout--;
             if (timeout == 0) {
-                return 0;
+                return -1;
             }
         }
         /* Clear STOP Flag */
@@ -206,8 +204,6 @@
     int timeout;
     int count;
 
-    if (length == 0) return 0;
-
     /* update CR2 register */
     i2c->CR2 = (i2c->CR2 & (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP)))
                | (uint32_t)(((uint32_t)address & I2C_CR2_SADD) | (((uint32_t)length << 16) & I2C_CR2_NBYTES) | (uint32_t)I2C_SOFTEND_MODE | (uint32_t)I2C_GENERATE_START_WRITE);
@@ -221,7 +217,7 @@
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_TC) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -235,7 +231,7 @@
         while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_STOPF) == RESET) {
             timeout--;
             if (timeout == 0) {
-                return 0;
+                return -1;
             }
         }
         /* Clear STOP Flag */
@@ -253,7 +249,7 @@
     timeout = FLAG_TIMEOUT;
     while (__HAL_I2C_GET_FLAG(&I2cHandle, I2C_FLAG_RXNE) == RESET) {
         if ((timeout--) == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -354,8 +350,6 @@
 int i2c_slave_read(i2c_t *obj, char *data, int length) {
     char size = 0;
 
-    if (length == 0) return 0;
-
     while (size < length) data[size++] = (char)i2c_byte_read(obj, 0);
 
     return size;
@@ -365,8 +359,6 @@
     char size = 0;
     I2cHandle.Instance = (I2C_TypeDef *)(obj->i2c);
 
-    if (length == 0) return 0;
-
     do {
         i2c_byte_write(obj, data[size]);
         size++;
--- a/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/i2c_api.c	Tue Jul 01 06:15:07 2014 +0100
+++ b/targets/hal/TARGET_STM/TARGET_NUCLEO_L152RE/i2c_api.c	Tue Jul 01 15:00:09 2014 +0100
@@ -158,8 +158,6 @@
     int count;
     int value;
 
-    if (length == 0) return 0;
-
     i2c_start(obj);
 
     // Send slave address for read
@@ -170,7 +168,7 @@
     while (I2C_CheckEvent(i2c, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) == ERROR) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
@@ -208,14 +206,14 @@
     while (I2C_CheckEvent(i2c, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) == ERROR) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }
 
     for (count = 0; count < length; count++) {
         if (i2c_byte_write(obj, data[count]) != 1) {
             i2c_stop(obj);
-            return 0;
+            return -1;
         }
     }
 
@@ -245,7 +243,7 @@
     while (I2C_GetFlagStatus(i2c, I2C_FLAG_RXNE) == RESET) {
         timeout--;
         if (timeout == 0) {
-            return 0;
+            return -1;
         }
     }