PCA9555

Dependents:   Telliskivi2_2014 PowerManagementBoard_Rev_A_2017

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;
 }