Browse Source

Add a bus reset on I2C error. Also add a mechanism for automated retries of operations.

sbg
px4dev 13 years ago
parent
commit
a0b9c056d7
  1. 12
      apps/drivers/device/i2c.cpp
  2. 6
      apps/drivers/device/i2c.h

12
apps/drivers/device/i2c.cpp

@ -53,6 +53,7 @@ I2C::I2C(const char *name, @@ -53,6 +53,7 @@ I2C::I2C(const char *name,
CDev(name, devname, irq),
// public
// protected
_retries(0),
// private
_bus(bus),
_address(address),
@ -117,7 +118,9 @@ I2C::transfer(uint8_t *send, unsigned send_len, uint8_t *recv, unsigned recv_len @@ -117,7 +118,9 @@ I2C::transfer(uint8_t *send, unsigned send_len, uint8_t *recv, unsigned recv_len
struct i2c_msg_s msgv[2];
unsigned msgs;
int ret;
unsigned tries;
do {
// debug("transfer out %p/%u in %p/%u", send, send_len, recv, recv_len);
msgs = 0;
@ -143,7 +146,16 @@ I2C::transfer(uint8_t *send, unsigned send_len, uint8_t *recv, unsigned recv_len @@ -143,7 +146,16 @@ I2C::transfer(uint8_t *send, unsigned send_len, uint8_t *recv, unsigned recv_len
ret = I2C_TRANSFER(_dev, &msgv[0], msgs);
if (ret == OK)
break;
// reset the I2C bus to unwedge on error
up_i2creset(_dev);
} while (tries++ < _retries);
return ret;
}
} // namespace device

6
apps/drivers/device/i2c.h

@ -52,6 +52,12 @@ class __EXPORT I2C : public CDev @@ -52,6 +52,12 @@ class __EXPORT I2C : public CDev
{
protected:
/**
* The number of times a read or write operation will be retried on
* error.
*/
unsigned _retries;
/**
* @ Constructor
*

Loading…
Cancel
Save