David Möschwitzer / AT24C64D
Revision:
2:7efbd43bfe7c
Parent:
1:3ccf1b297b4f
Child:
3:8a0bfc787463
--- a/AT24C64D.cpp	Wed Feb 20 10:09:39 2019 +0000
+++ b/AT24C64D.cpp	Fri Feb 22 10:05:29 2019 +0000
@@ -13,14 +13,14 @@
         
         printf("Contructor of EEPROM AT24C64D...");
         bAck = NACK;
-        timer = new Timeout;
+        timer = new Timer;
+        startTimer();
+        
         i2c = _i2c;
         
         for(int a; a <= SIZE_PAGE; a++)
             cBuffer[a] = 0x00;
         
-        //bReady = false; 
-        //timer->attach_us(callback(this, &AT24C64D::setReady), READY_TIME_US);
         printf("end\n");
 }
 
@@ -112,7 +112,7 @@
     i2c->write(0x00);
     i2c->start();
     i2c->stop();
-    //i2c->abort_transfer();
+    
     return;
 }
 
@@ -146,27 +146,20 @@
         if(uiTimeOut == 0) return NACK;
     }
     
-   //i2c->abort_transfer();
+   
     
     uiAddrWrite = uiAddr & ADDR_MASK;            
     cBuffer[0]  = (uiAddrWrite >> 8) & 0xFF;
     cBuffer[1]  = uiAddrWrite & 0xFF;
     cBuffer[2]  = (*cData);      
     
-    printf("Write on EEPROM address 0x%02x %02x the Byte 0x%02x\n", cBuffer[0], cBuffer[1], cBuffer[2]);
-    
+    //printf("Write on EEPROM address 0x%02x %02x the Byte 0x%02x\n", cBuffer[0], cBuffer[1], cBuffer[2]);
+
+    while(not isReady());
     bAck &= i2c->write(AT24C64D_W, cBuffer, 3);
-    //i2c->abort_transferv
-   
-    /*i2c->start();
-    i2c->write(AT24C64D_W);
-    i2c->write(cBuffer[0]);
-    i2c->write(cBuffer[1]);
-    i2c->write(cBuffer[2]);
-    //i2c->abort_transfer();
-    i2c->stop();
-    */
-
+    //wait(0.004);
+    startTimer();
+    
     if(bAck) incAddrWrite();
     
     return bAck;
@@ -196,60 +189,45 @@
 //******************************************************************************//
 //
 //******************************************************************************//
-void AT24C64D::readByte(char *cData){ 
-    int i = 0;
-    bAck = NACK;
-    while(bAck != ACK){
-        i2c->start();
-        bAck = i2c->write(AT24C64D_R);                                          // return 0 -> NACK | 1 -> ACK | 2 -> TimeOut
-        i2c->stop();
-        i++;
-    }
+bool AT24C64D::readByte(char *cData){ 
+
+    bAck = ACKpolling(AT24C64D_R);                                              // polling for ACK
     
-    //i2c->abort_transfer();
-    
-    
-    i2c->start();
-    i2c->write(AT24C64D_R);
-    *cData = i2c->read(false);
-    i2c->stop();
-    
-    return;
+    if(bAck == ACK){        
+        i2c->start();                                                           // send a start condition
+        i2c->write(AT24C64D_R);
+        *cData = i2c->read(false);
+        i2c->stop();
+    }
+    return bAck;
 }
 
 
 //******************************************************************************//
 //
 //******************************************************************************//
-void AT24C64D::readByte(uint16_t uiAddr, char *cData){ 
-    int i = 0;
-    bAck = NACK;
-    while(bAck != ACK){
+bool AT24C64D::readByte(uint16_t uiAddr, char *cData){ 
+    
+    bAck = ACKpolling(AT24C64D_R);                                              // polling for ACK
+    
+    if(bAck == ACK){
+
+        uiAddrRead = uiAddr & ADDR_MASK;    
+                
+        cBuffer[0] = (uiAddrRead >> 8) & 0xFF;
+        cBuffer[1] = uiAddrRead & 0xFF;
+        printf("0x%02x 0x%02x\n", cBuffer[0], cBuffer[1]);
         i2c->start();
-        bAck = i2c->write(AT24C64D_R);                                          // return 0 -> NACK | 1 -> ACK | 2 -> TimeOut
+        i2c->write(AT24C64D_W);
+        i2c->write(cBuffer[0]);
+        i2c->write(cBuffer[1]);
+        i2c->start();
+        i2c->write(AT24C64D_R);
+        *cData = i2c->read(false);
         i2c->stop();
-        i++;
     }
     
-    //i2c->abort_transfer();
-    
-    
-    
-    uiAddrRead = uiAddr & ADDR_MASK;    
-            
-    cBuffer[0] = (uiAddrRead >> 8) & 0xFF;
-    cBuffer[1] = uiAddrRead & 0xFF;
- 
-    i2c->start();
-    i2c->write(AT24C64D_W);
-    i2c->write(cBuffer[0]);
-    i2c->write(cBuffer[1]);
-    i2c->start();
-    i2c->write(AT24C64D_R);
-    *cData = i2c->read(false);
-    i2c->stop();
-    
-    return;
+    return bAck;
 }
 
 
@@ -259,22 +237,12 @@
 //******************************************************************************//
 bool AT24C64D::read(uint16_t uiAddr, char *cData, uint16_t uiLength){ 
     
-    if(uiLength == 0) return NACK;
-    
-    bAck        = NACK;
-    uiTimeOut   = TIMEOUT_VAL;
-    
-    while(bAck != ACK){
-        i2c->start();
-        bAck = i2c->write(AT24C64D_R);                                          // return 0 -> NACK | 1 -> ACK | 2 -> TimeOut
-        i2c->stop();
-        
-        uiTimeOut--;
-        if(uiTimeOut == 0) break;
-        
+    if(uiLength == 0){
+        printf("Read from EPPROM with a size of 0\n");
+        return NACK;
     }
     
-    //i2c->abort_transfer();
+    ACKpolling(AT24C64D_R);
     
     
     
@@ -303,11 +271,32 @@
 
 
 /******************************************************************************/
-//  not used
+//
 /******************************************************************************/
-void AT24C64D::setReady(){
-    bReady = true;
-    timer->detach();
+bool AT24C64D::isReady(){
+    if(bReady or timer->read_ms() >= READY_TIME_MS){
+        bReady = true;
+
+        if(bTimerRun){
+            timer->stop();
+            bTimerRun = false;
+        }
+    }
+
+    return bReady;
+}
+
+
+/******************************************************************************/
+//
+/******************************************************************************/
+void AT24C64D::startTimer(){
+    
+    timer->start();
+    timer->reset();
+
+    bReady      = false;    
+    bTimerRun   = true;
 }
 
 
@@ -315,8 +304,22 @@
 /******************************************************************************/
 //
 /******************************************************************************/
-bool AT24C64D::isReady(){
-    return bReady;
-}
-
-
+bool AT24C64D::ACKpolling(uint8_t uiAdr){
+    
+    bAck        = NACK;
+    uiTimeOut   = TIMEOUT_VAL;
+    
+    while(bAck != ACK){
+        i2c->start();
+        bAck = (bool) i2c->write(uiAdr);                                        // return 0 -> NACK | 1 -> ACK | 2 -> TimeOut
+        i2c->stop();
+        
+        uiTimeOut--;
+        if(uiTimeOut == 0){
+            printf("Read from EPPROM: timeout\n");
+            return NACK;
+        }       
+    }
+    
+    return bAck;
+}
\ No newline at end of file