|
|
|
@ -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,8 +118,10 @@ I2C::transfer(uint8_t *send, unsigned send_len, uint8_t *recv, unsigned recv_len
@@ -117,8 +118,10 @@ 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; |
|
|
|
|
|
|
|
|
|
// debug("transfer out %p/%u in %p/%u", send, send_len, recv, recv_len);
|
|
|
|
|
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
|