I2C API refactoring

Now the I2C send/receive functions in the mbed HAL return the number of
bytes actually transferred or an error code (a negative value). The
public API remains unchanged.
pull/9/head
Bogdan Marinescu 2013-07-01 16:28:32 +01:00
parent b464564dc1
commit bfeb47f523
10 changed files with 71 additions and 66 deletions

View File

@ -52,9 +52,9 @@ int I2C::write(int address, const char* data, int length, bool repeated) {
aquire(); aquire();
int stop = (repeated) ? 0 : 1; 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) { int I2C::write(int data) {
@ -66,9 +66,9 @@ int I2C::read(int address, char* data, int length, bool repeated) {
aquire(); aquire();
int stop = (repeated) ? 0 : 1; 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) { int I2C::read(int ack) {

View File

@ -39,7 +39,7 @@ int I2CSlave::receive(void) {
} }
int I2CSlave::read(char *data, int length) { 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) { int I2CSlave::read(void) {
@ -47,7 +47,7 @@ int I2CSlave::read(void) {
} }
int I2CSlave::write(const char *data, int length) { 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) { int I2CSlave::write(int data) {

View File

@ -26,6 +26,11 @@ extern "C" {
typedef struct i2c_s i2c_t; 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_init (i2c_t *obj, PinName sda, PinName scl);
void i2c_frequency (i2c_t *obj, int hz); void i2c_frequency (i2c_t *obj, int hz);
int i2c_start (i2c_t *obj); int i2c_start (i2c_t *obj);

View File

@ -221,12 +221,12 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
if (i2c_start(obj)) { if (i2c_start(obj)) {
i2c_stop(obj); i2c_stop(obj);
return 1; return I2C_ERROR_BUS_BUSY;
} }
if (i2c_do_write(obj, (address | 0x01))) { if (i2c_do_write(obj, (address | 0x01))) {
i2c_stop(obj); i2c_stop(obj);
return 1; return I2C_ERROR_NO_SLAVE;
} }
// set rx mode // 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; uint8_t stop_ = (count == (length - 1)) ? 1 : 0;
if (i2c_do_read(obj, ptr, stop_)) { if (i2c_do_read(obj, ptr, stop_)) {
i2c_stop(obj); 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 // last read
data[count-1] = obj->i2c->D; 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 i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
int i; int i;
if (i2c_start(obj)) { if (i2c_start(obj)) {
i2c_stop(obj); i2c_stop(obj);
return 1; return I2C_ERROR_BUS_BUSY;
} }
if (i2c_do_write(obj, (address & 0xFE))) { if (i2c_do_write(obj, (address & 0xFE))) {
i2c_stop(obj); i2c_stop(obj);
return 1; return I2C_ERROR_NO_SLAVE;
} }
for (i = 0; i < length; i++) { for (i = 0; i < length; i++) {
if(i2c_do_write(obj, data[i])) { if(i2c_do_write(obj, data[i])) {
i2c_stop(obj); 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); i2c_stop(obj);
} }
return 0; return length;
} }
void i2c_reset(i2c_t *obj) { 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++) { for (count = 0; count < (length - 1); count++) {
data[count] = obj->i2c->D; data[count] = obj->i2c->D;
if(i2c_wait_end_rx_transfer(obj)) { 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++) { for (i = 0; i < length; i++) {
if(i2c_do_write(obj, data[count++]) == 2) { 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 // otherwise the master cannot generate a stop bit
obj->i2c->D; obj->i2c->D;
if(i2c_wait_end_rx_transfer(obj) == 2) { if(i2c_wait_end_rx_transfer(obj) == 2) {
return 0; return count;
} }
return count; return count;

View File

@ -196,13 +196,13 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
if ((status != 0x10) && (status != 0x08)) { if ((status != 0x10) && (status != 0x08)) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_BUS_BUSY;
} }
status = i2c_do_write(obj, (address | 0x01), 1); status = i2c_do_write(obj, (address | 0x01), 1);
if (status != 0x40) { if (status != 0x40) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_NO_SLAVE;
} }
// Read in all except last byte // 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); status = i2c_status(obj);
if (status != 0x50) { if (status != 0x50) {
i2c_stop(obj); i2c_stop(obj);
return status; return count;
} }
data[count] = (char) value; 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); status = i2c_status(obj);
if (status != 0x58) { if (status != 0x58) {
i2c_stop(obj); i2c_stop(obj);
return status; return length - 1;
} }
data[count] = (char) value; 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); i2c_stop(obj);
} }
return 0; return length;
} }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { 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)) { if ((status != 0x10) && (status != 0x08)) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_BUS_BUSY;
} }
status = i2c_do_write(obj, (address & 0xFE), 1); status = i2c_do_write(obj, (address & 0xFE), 1);
if (status != 0x18) { if (status != 0x18) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_NO_SLAVE;
} }
for (i=0; i<length; i++) { for (i=0; i<length; i++) {
status = i2c_do_write(obj, data[i], 0); status = i2c_do_write(obj, data[i], 0);
if(status != 0x28) { if(status != 0x28) {
i2c_stop(obj); i2c_stop(obj);
return status; return i;
} }
} }
@ -265,7 +265,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
i2c_stop(obj); i2c_stop(obj);
} }
return 0; return length;
} }
void i2c_reset(i2c_t *obj) { void i2c_reset(i2c_t *obj) {
@ -343,7 +343,7 @@ int i2c_slave_read(i2c_t *obj, char *data, int length) {
i2c_clear_SI(obj); i2c_clear_SI(obj);
return (count - 1); return count;
} }
int i2c_slave_write(i2c_t *obj, const char *data, int length) { int i2c_slave_write(i2c_t *obj, const char *data, int length) {

View File

@ -204,13 +204,13 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
if ((status != 0x10) && (status != 0x08)) { if ((status != 0x10) && (status != 0x08)) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_BUS_BUSY;
} }
status = i2c_do_write(obj, (address | 0x01), 1); status = i2c_do_write(obj, (address | 0x01), 1);
if (status != 0x40) { if (status != 0x40) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_NO_SLAVE;
} }
// Read in all except last byte // Read in all except last byte
@ -219,7 +219,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
status = i2c_status(obj); status = i2c_status(obj);
if (status != 0x50) { if (status != 0x50) {
i2c_stop(obj); i2c_stop(obj);
return status; return count;
} }
data[count] = (char) value; data[count] = (char) value;
} }
@ -229,7 +229,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
status = i2c_status(obj); status = i2c_status(obj);
if (status != 0x58) { if (status != 0x58) {
i2c_stop(obj); i2c_stop(obj);
return status; return length - 1;
} }
data[count] = (char) value; data[count] = (char) value;
@ -239,7 +239,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
i2c_stop(obj); i2c_stop(obj);
} }
return 0; return length;
} }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
@ -249,20 +249,20 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
if ((status != 0x10) && (status != 0x08)) { if ((status != 0x10) && (status != 0x08)) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_BUS_BUSY;
} }
status = i2c_do_write(obj, (address & 0xFE), 1); status = i2c_do_write(obj, (address & 0xFE), 1);
if (status != 0x18) { if (status != 0x18) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_NO_SLAVE;
} }
for (i=0; i<length; i++) { for (i=0; i<length; i++) {
status = i2c_do_write(obj, data[i], 0); status = i2c_do_write(obj, data[i], 0);
if(status != 0x28) { if(status != 0x28) {
i2c_stop(obj); i2c_stop(obj);
return status; return i;
} }
} }
@ -273,7 +273,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
i2c_stop(obj); i2c_stop(obj);
} }
return 0; return length;
} }
void i2c_reset(i2c_t *obj) { void i2c_reset(i2c_t *obj) {
@ -351,7 +351,7 @@ int i2c_slave_read(i2c_t *obj, char *data, int length) {
i2c_clear_SI(obj); i2c_clear_SI(obj);
return (count - 1); return count;
} }
int i2c_slave_write(i2c_t *obj, const char *data, int length) { int i2c_slave_write(i2c_t *obj, const char *data, int length) {

View File

@ -203,13 +203,13 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
if ((status != 0x10) && (status != 0x08)) { if ((status != 0x10) && (status != 0x08)) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_BUS_BUSY;
} }
status = i2c_do_write(obj, (address | 0x01), 1); status = i2c_do_write(obj, (address | 0x01), 1);
if (status != 0x40) { if (status != 0x40) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_NO_SLAVE;
} }
// Read in all except last byte // Read in all except last byte
@ -218,7 +218,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
status = i2c_status(obj); status = i2c_status(obj);
if (status != 0x50) { if (status != 0x50) {
i2c_stop(obj); i2c_stop(obj);
return status; return count;
} }
data[count] = (char) value; data[count] = (char) value;
} }
@ -228,7 +228,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
status = i2c_status(obj); status = i2c_status(obj);
if (status != 0x58) { if (status != 0x58) {
i2c_stop(obj); i2c_stop(obj);
return status; return length - 1;
} }
data[count] = (char) value; data[count] = (char) value;
@ -238,7 +238,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
i2c_stop(obj); i2c_stop(obj);
} }
return 0; return length;
} }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
@ -248,20 +248,20 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
if ((status != 0x10) && (status != 0x08)) { if ((status != 0x10) && (status != 0x08)) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_BUS_BUSY;
} }
status = i2c_do_write(obj, (address & 0xFE), 1); status = i2c_do_write(obj, (address & 0xFE), 1);
if (status != 0x18) { if (status != 0x18) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_NO_SLAVE;
} }
for (i=0; i<length; i++) { for (i=0; i<length; i++) {
status = i2c_do_write(obj, data[i], 0); status = i2c_do_write(obj, data[i], 0);
if (status != 0x28) { if (status != 0x28) {
i2c_stop(obj); i2c_stop(obj);
return status; return i;
} }
} }
@ -272,7 +272,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
i2c_stop(obj); i2c_stop(obj);
} }
return 0; return length;
} }
void i2c_reset(i2c_t *obj) { void i2c_reset(i2c_t *obj) {
@ -353,7 +353,7 @@ int i2c_slave_read(i2c_t *obj, char *data, int length) {
i2c_clear_SI(obj); i2c_clear_SI(obj);
return (count - 1); return count;
} }
int i2c_slave_write(i2c_t *obj, const char *data, int length) { int i2c_slave_write(i2c_t *obj, const char *data, int length) {

View File

@ -213,13 +213,13 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
if ((status != 0x10) && (status != 0x08)) { if ((status != 0x10) && (status != 0x08)) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_BUS_BUSY;
} }
status = i2c_do_write(obj, (address | 0x01), 1); status = i2c_do_write(obj, (address | 0x01), 1);
if (status != 0x40) { if (status != 0x40) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_NO_SLAVE;
} }
// Read in all except last byte // Read in all except last byte
@ -228,7 +228,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
status = i2c_status(obj); status = i2c_status(obj);
if (status != 0x50) { if (status != 0x50) {
i2c_stop(obj); i2c_stop(obj);
return status; return count;
} }
data[count] = (char) value; data[count] = (char) value;
} }
@ -238,7 +238,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
status = i2c_status(obj); status = i2c_status(obj);
if (status != 0x58) { if (status != 0x58) {
i2c_stop(obj); i2c_stop(obj);
return status; return length - 1;
} }
data[count] = (char) value; data[count] = (char) value;
@ -248,7 +248,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
i2c_stop(obj); i2c_stop(obj);
} }
return 0; return length;
} }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
@ -258,20 +258,20 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
if ((status != 0x10) && (status != 0x08)) { if ((status != 0x10) && (status != 0x08)) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_BUS_BUSY;
} }
status = i2c_do_write(obj, (address & 0xFE), 1); status = i2c_do_write(obj, (address & 0xFE), 1);
if (status != 0x18) { if (status != 0x18) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_NO_SLAVE;
} }
for (i=0; i<length; i++) { for (i=0; i<length; i++) {
status = i2c_do_write(obj, data[i], 0); status = i2c_do_write(obj, data[i], 0);
if (status != 0x28) { if (status != 0x28) {
i2c_stop(obj); i2c_stop(obj);
return status; return i;
} }
} }
@ -282,7 +282,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
i2c_stop(obj); i2c_stop(obj);
} }
return 0; return length;
} }
void i2c_reset(i2c_t *obj) { void i2c_reset(i2c_t *obj) {
@ -363,7 +363,7 @@ int i2c_slave_read(i2c_t *obj, char *data, int length) {
i2c_clear_SI(obj); i2c_clear_SI(obj);
return (count - 1); return count;
} }
int i2c_slave_write(i2c_t *obj, const char *data, int length) { int i2c_slave_write(i2c_t *obj, const char *data, int length) {

View File

@ -147,7 +147,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
status = i2c_do_write(obj, (address | 0x01), 1); status = i2c_do_write(obj, (address | 0x01), 1);
if (status != 0x01) { if (status != 0x01) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_NO_SLAVE;
} }
// Read in all except last byte // Read in all except last byte
@ -156,7 +156,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
status = i2c_status(obj); status = i2c_status(obj);
if (status != 0x00) { if (status != 0x00) {
i2c_stop(obj); i2c_stop(obj);
return status; return count;
} }
data[count] = (char) value; data[count] = (char) value;
} }
@ -166,7 +166,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
status = i2c_status(obj); status = i2c_status(obj);
if (status != 0x01) { if (status != 0x01) {
i2c_stop(obj); i2c_stop(obj);
return status; return length - 1;
} }
data[count] = (char) value; data[count] = (char) value;
@ -178,7 +178,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
repeated_start = 1; repeated_start = 1;
} }
return 0; return length;
} }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
@ -189,14 +189,14 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
status = i2c_do_write(obj, (address & 0xFE), 1); status = i2c_do_write(obj, (address & 0xFE), 1);
if (status != 0x02) { if (status != 0x02) {
i2c_stop(obj); i2c_stop(obj);
return status; return I2C_ERROR_NO_SLAVE;
} }
for (i=0; i<length; i++) { for (i=0; i<length; i++) {
status = i2c_do_write(obj, data[i], 0); status = i2c_do_write(obj, data[i], 0);
if (status != 0x02) { if (status != 0x02) {
i2c_stop(obj); i2c_stop(obj);
return status; return i;
} }
} }
@ -207,7 +207,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
repeated_start = 1; repeated_start = 1;
} }
return 0; return length;
} }
void i2c_reset(i2c_t *obj) { void i2c_reset(i2c_t *obj) {

View File

@ -251,7 +251,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
i2c_stop(obj); i2c_stop(obj);
} }
return 0; return length;
} }
int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
@ -273,7 +273,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
i2c_stop(obj); i2c_stop(obj);
} }
return 0; return length;
} }
void i2c_reset(i2c_t *obj) { void i2c_reset(i2c_t *obj) {