PCA9555
Dependents: Telliskivi2_2014 PowerManagementBoard_Rev_A_2017
Diff: PCA9555.cpp
- Revision:
- 8:8f59b7233e6c
- Parent:
- 7:3b54389686ca
--- a/PCA9555.cpp Thu Sep 19 07:06:54 2013 +0000 +++ b/PCA9555.cpp Sun Nov 03 11:43:05 2013 +0000 @@ -1,11 +1,13 @@ #include "PCA9555.h" PCA9555::PCA9555(PinName sda, PinName scl, PinName interrupPin, int address) - : _irqpin(interrupPin), _i2c(sda, scl) { + : _irqpin(interrupPin), _i2c(sda, scl), led3(LED3) { _address = address; _irqpin.rise(this, &PCA9555::callChange); _irqpin.fall(this, &PCA9555::callChange); _i2c.frequency(400000); + retryCount = 3; + currentRetryCount = retryCount; } void PCA9555::setDirection(int data) { @@ -19,13 +21,31 @@ } int PCA9555::read() { + bool isCorrect = false; char rx_array[2] = {0x00, 0x00}; char tx_array[1] = {0x00}; - _i2c.write(_address, tx_array, 1); - - _i2c.read(_address, rx_array, 2); - lastReadState = (rx_array[1] << 8) | rx_array[0]; + while (--currentRetryCount) { + tx_array[0] = 0x00; + _i2c.write(_address, tx_array, 1); + int success = _i2c.read(_address, rx_array, 2); + //_i2c.stop(); + if (success != 0) { + led3 = 1; + } else { + led3 = 0; + currentRetryCount = retryCount; + isCorrect = true; + break; + } + } + if (isCorrect) { + lastReadState = (rx_array[1] << 8) | rx_array[0]; + } + return lastReadState; +} + +int PCA9555::getLastRead() { return lastReadState; }