diff --git a/libraries/mbed/common/I2C.cpp b/libraries/mbed/common/I2C.cpp index bf2c3c3c81..8d4e48f0ac 100644 --- a/libraries/mbed/common/I2C.cpp +++ b/libraries/mbed/common/I2C.cpp @@ -52,9 +52,9 @@ int I2C::write(int address, const char* data, int length, bool repeated) { aquire(); int stop = (repeated) ? 0 : 1; - int retval = i2c_write(&_i2c, address, data, length, stop); + int written = i2c_write(&_i2c, address, data, length, stop); - return retval; + return length != written; } int I2C::write(int data) { @@ -66,9 +66,9 @@ int I2C::read(int address, char* data, int length, bool repeated) { aquire(); int stop = (repeated) ? 0 : 1; - int retval = i2c_read(&_i2c, address, data, length, stop); + int read = i2c_read(&_i2c, address, data, length, stop); - return retval; + return length != read; } int I2C::read(int ack) { diff --git a/libraries/mbed/common/I2CSlave.cpp b/libraries/mbed/common/I2CSlave.cpp index 43ee3f1fa2..3db7f52589 100644 --- a/libraries/mbed/common/I2CSlave.cpp +++ b/libraries/mbed/common/I2CSlave.cpp @@ -39,7 +39,7 @@ int I2CSlave::receive(void) { } int I2CSlave::read(char *data, int length) { - return i2c_slave_read(&_i2c, data, length); + return i2c_slave_read(&_i2c, data, length) != length; } int I2CSlave::read(void) { @@ -47,7 +47,7 @@ int I2CSlave::read(void) { } int I2CSlave::write(const char *data, int length) { - return i2c_slave_write(&_i2c, data, length); + return i2c_slave_write(&_i2c, data, length) != length; } int I2CSlave::write(int data) { diff --git a/libraries/mbed/hal/i2c_api.h b/libraries/mbed/hal/i2c_api.h index f0bbaaef43..5682e29425 100644 --- a/libraries/mbed/hal/i2c_api.h +++ b/libraries/mbed/hal/i2c_api.h @@ -26,6 +26,11 @@ extern "C" { typedef struct i2c_s i2c_t; +enum { + I2C_ERROR_NO_SLAVE = -1, + I2C_ERROR_BUS_BUSY = -2 +}; + void i2c_init (i2c_t *obj, PinName sda, PinName scl); void i2c_frequency (i2c_t *obj, int hz); int i2c_start (i2c_t *obj); diff --git a/libraries/mbed/targets/hal/Freescale/TARGET_KL25Z/i2c_api.c b/libraries/mbed/targets/hal/Freescale/TARGET_KL25Z/i2c_api.c index c7feee8bc8..3dc24dd3c6 100644 --- a/libraries/mbed/targets/hal/Freescale/TARGET_KL25Z/i2c_api.c +++ b/libraries/mbed/targets/hal/Freescale/TARGET_KL25Z/i2c_api.c @@ -221,12 +221,12 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { if (i2c_start(obj)) { i2c_stop(obj); - return 1; + return I2C_ERROR_BUS_BUSY; } if (i2c_do_write(obj, (address | 0x01))) { i2c_stop(obj); - return 1; + return I2C_ERROR_NO_SLAVE; } // set rx mode @@ -238,7 +238,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { uint8_t stop_ = (count == (length - 1)) ? 1 : 0; if (i2c_do_read(obj, ptr, stop_)) { i2c_stop(obj); - return 1; + return count; } } @@ -250,25 +250,25 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { // last read data[count-1] = obj->i2c->D; - return 0; + return length; } int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i; if (i2c_start(obj)) { i2c_stop(obj); - return 1; + return I2C_ERROR_BUS_BUSY; } if (i2c_do_write(obj, (address & 0xFE))) { i2c_stop(obj); - return 1; + return I2C_ERROR_NO_SLAVE; } for (i = 0; i < length; i++) { if(i2c_do_write(obj, data[i])) { i2c_stop(obj); - return 1; + return i; } } @@ -276,7 +276,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { i2c_stop(obj); } - return 0; + return length; } void i2c_reset(i2c_t *obj) { @@ -363,7 +363,7 @@ int i2c_slave_read(i2c_t *obj, char *data, int length) { for (count = 0; count < (length - 1); count++) { data[count] = obj->i2c->D; if(i2c_wait_end_rx_transfer(obj)) { - return 0; + return count; } } @@ -382,7 +382,7 @@ int i2c_slave_write(i2c_t *obj, const char *data, int length) { for (i = 0; i < length; i++) { if(i2c_do_write(obj, data[count++]) == 2) { - return 0; + return i; } } @@ -393,7 +393,7 @@ int i2c_slave_write(i2c_t *obj, const char *data, int length) { // otherwise the master cannot generate a stop bit obj->i2c->D; if(i2c_wait_end_rx_transfer(obj) == 2) { - return 0; + return count; } return count; diff --git a/libraries/mbed/targets/hal/NXP/TARGET_LPC11UXX/i2c_api.c b/libraries/mbed/targets/hal/NXP/TARGET_LPC11UXX/i2c_api.c index 5f6a759212..aeca856e65 100644 --- a/libraries/mbed/targets/hal/NXP/TARGET_LPC11UXX/i2c_api.c +++ b/libraries/mbed/targets/hal/NXP/TARGET_LPC11UXX/i2c_api.c @@ -196,13 +196,13 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { if ((status != 0x10) && (status != 0x08)) { i2c_stop(obj); - return status; + return I2C_ERROR_BUS_BUSY; } status = i2c_do_write(obj, (address | 0x01), 1); if (status != 0x40) { i2c_stop(obj); - return status; + return I2C_ERROR_NO_SLAVE; } // Read in all except last byte @@ -211,7 +211,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { status = i2c_status(obj); if (status != 0x50) { i2c_stop(obj); - return status; + return count; } data[count] = (char) value; } @@ -221,7 +221,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { status = i2c_status(obj); if (status != 0x58) { i2c_stop(obj); - return status; + return length - 1; } data[count] = (char) value; @@ -231,7 +231,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { i2c_stop(obj); } - return 0; + return length; } int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { @@ -241,20 +241,20 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { if ((status != 0x10) && (status != 0x08)) { i2c_stop(obj); - return status; + return I2C_ERROR_BUS_BUSY; } status = i2c_do_write(obj, (address & 0xFE), 1); if (status != 0x18) { i2c_stop(obj); - return status; + return I2C_ERROR_NO_SLAVE; } for (i=0; i