EEPROM with 64kByte Memory

Files at this revision

API Documentation at this revision

Comitter:
x1dmoesc
Date:
Fri Mar 01 11:26:26 2019 +0000
Parent:
2:7efbd43bfe7c
Child:
4:660801ce718c
Commit message:
Bug-Fix of write(char * cData) & write(uint16_t uiAddr, char * cData) and the reading function

Changed in this revision

AT24C64D.cpp Show annotated file Show diff for this revision Revisions of this file
AT24C64D.h Show annotated file Show diff for this revision Revisions of this file
--- a/AT24C64D.cpp	Fri Feb 22 10:05:29 2019 +0000
+++ b/AT24C64D.cpp	Fri Mar 01 11:26:26 2019 +0000
@@ -22,12 +22,16 @@
             cBuffer[a] = 0x00;
         
         printf("end\n");
+        
+        uiAddrWrite = 0;
+        uiAddrRead  = 0;
 }
 
 
 
 //******************************************************************************//
-// uiAddr:   user address [A2...A0]
+//  Sets the address for the writing position. If the address is higher as the  //
+//  max. memory address, then the writing address will be 0x00.                 //
 //******************************************************************************//
 void AT24C64D::setAddrWrite(uint16_t Addr){    
     if(uiAddrWrite > MEM_ADDR_MAX)  uiAddrWrite = 0;
@@ -37,7 +41,8 @@
 
 
 //******************************************************************************//
-// uiAddr:   user address [A2...A0]
+// Increments the writing address. If the address is higher as the max. memory  //
+// adress, it will be roll over.                                                //
 //******************************************************************************//
 void AT24C64D::incAddrWrite(){
     if(uiAddrWrite >= MEM_ADDR_MAX) uiAddrWrite = 0;
@@ -47,7 +52,8 @@
 
 
 //******************************************************************************//
-// uiAddr:   user address [A2...A0]
+// Decrements the writing address. If the address is smaller or equals to zero, //
+// it will be roll over.                                                        //
 //******************************************************************************//
 void AT24C64D::decAddrWrite(){
     if(uiAddrWrite <= 0)            uiAddrWrite = 4095;
@@ -57,7 +63,7 @@
 
 
 //******************************************************************************//
-// uiAddr:   user address [A2...A0]
+// Returns the current writing address.                                         //
 //******************************************************************************//
 uint16_t AT24C64D::getAddrWrite(){
     return uiAddrWrite;
@@ -66,17 +72,19 @@
 
 
 //******************************************************************************//
-// uiAddr:   user address [A2...A0]
+//  Sets the address for the reading position. If the address is higher as the  //
+//  max. memory address, then the writing address will be 0x00.                 //
 //******************************************************************************//
 void AT24C64D::setAddrRead(uint16_t Addr){    
-    if(uiAddrRead > MEM_ADDR_MAX)  uiAddrRead = 0;
+    if(uiAddrRead > MEM_ADDR_MAX)   uiAddrRead = 0;
     else                            uiAddrRead = Addr;
 
 }
 
 
 //******************************************************************************//
-// uiAddr:   user address [A2...A0]
+// Increments the writing address. If the address is higher as the max. memory  //
+// adress, it will be roll over.                                                //
 //******************************************************************************//
 void AT24C64D::incAddrRead(){
     if(uiAddrRead >= MEM_ADDR_MAX) uiAddrRead = 0;
@@ -86,17 +94,18 @@
 
 
 //******************************************************************************//
-// uiAddr:   user address [A2...A0]
+// Decrements the writing address. If the address is smaller or equals to zero, //
+// it will be roll over.                                                        //
 //******************************************************************************//
 void AT24C64D::decAddrRead(){
-    if(uiAddrRead <= 0)            uiAddrRead = 4095;
+    if(uiAddrRead <= 0)             uiAddrRead = 4095;
     else                            uiAddrRead--;
 }
 
 
 
 //******************************************************************************//
-// uiAddr:   user address [A2...A0]
+//  Returns the current reading address.                                        //
 //******************************************************************************//
 uint16_t AT24C64D::getAddrRead(){
     return uiAddrRead;
@@ -104,10 +113,10 @@
 
 
 //******************************************************************************//
-// uiAddr:   user address [A2...A0]
+//  After an interruption in protocol, power loss or system reset, the 2-wire   //
+//  part can be protocol reset.                                                 //
 //******************************************************************************//
 void AT24C64D::reset(){
-
     i2c->start();
     i2c->write(0x00);
     i2c->start();
@@ -119,7 +128,7 @@
 
 
 /******************************************************************************/
-//
+// not implemented
 /******************************************************************************/
 bool  AT24C64D::erase(){
     return ACK;
@@ -128,39 +137,44 @@
 
 
 //******************************************************************************//
-//  Writes a data byte to address uiAddr. If all  transmitions are successful,  //
-//  it will be returned a ACK. Otherwise a NACK. After every successful         //
-//  transmition, the writeAddr will new set and at the end incremented.         //       
+//  Writes a data byte to the current write address (uiAddrWrite). If all       //
+//  transmitions are successful, it will be returned a ACK. Otherwise a NACK.   //
+//  The uiAddrWrite will be incremented, if the transmition was successfull.    //
 //******************************************************************************//
-bool AT24C64D::writeByte(uint16_t uiAddr, char * cData){
+bool AT24C64D::write(char * cData){
+    return write(uiAddrWrite, cData);
+}
+    
+    
+//******************************************************************************//
+//  Writes a data byte to the given address uiAddr. If all transmitions are     //
+//  successful, it will be returned a ACK. Otherwise a NACK. The uiAddrWrite    //
+//  will be set and incremented, if the transmition was successfull.            //      
+//******************************************************************************//
+bool AT24C64D::write(uint16_t uiAddr, char * cData){
     
     bAck        = NACK;
     uiTimeOut   = TIMEOUT_VAL; 
     
-    while(bAck != ACK){
-        i2c->start();
-        bAck = i2c->write(AT24C64D_W);                                          // return 0 -> NACK | 1 -> ACK | 2 -> TimeOut
-        i2c->stop();
-        uiTimeOut--;
-        
-        if(uiTimeOut == 0) return NACK;
-    }
+    
+    while(not isReady());
+    ACKpolling(AT24C64D_W);
     
-   
+//    printf("TimeOut: %d\n", uiTimeOut);
     
-    uiAddrWrite = uiAddr & ADDR_MASK;            
-    cBuffer[0]  = (uiAddrWrite >> 8) & 0xFF;
-    cBuffer[1]  = uiAddrWrite & 0xFF;
+    uiAddr      = uiAddr & ADDR_MASK;            
+    cBuffer[0]  = (uiAddr >> 8) & 0xFF;
+    cBuffer[1]  = uiAddr & 0xFF;
     cBuffer[2]  = (*cData);      
     
     //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);
-    //wait(0.004);
     startTimer();
     
-    if(bAck) incAddrWrite();
+    
+    uiAddrWrite = uiAddr;
+    incAddrWrite();
     
     return bAck;
 }
@@ -171,7 +185,56 @@
 //  it will be returned a ACK. Otherwise a NACK. After every successful         //
 //  transmition, the writeAddr will new set and at the end incremented.         //       
 //******************************************************************************//
-//bool AT24C64D::write(uint16_t uiAddr, char * cData, uint16_t uiLength){}
+bool AT24C64D::write(uint16_t uiAddr, char * cData, uint16_t uiLength){
+    return NACK;
+}
+
+
+
+
+//******************************************************************************//
+//
+//******************************************************************************//
+bool AT24C64D::read(char *cData){ 
+
+    //bAck = ACKpolling(AT24C64D_R);                                              // polling for ACK
+    
+    //if(bAck == ACK){        
+        i2c->start();                                                           // send a start condition
+        i2c->write(AT24C64D_R);
+        *cData = i2c->read(false);
+        i2c->stop();
+    //}
+    return bAck;
+}
+
+
+//******************************************************************************//
+//
+//******************************************************************************//
+bool AT24C64D::read(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;
+        
+        i2c->start();
+        i2c->write(AT24C64D_W);
+        i2c->write(cBuffer[0]);
+        i2c->write(cBuffer[1]);
+        //i2c->read(AT24C64D_R, cData, 10);
+        
+        i2c->start();
+        i2c->write(AT24C64D_R);
+        *cData = i2c->read(false);
+        i2c->stop();
+    //}
+    return bAck;
+}
 
 
 
@@ -182,59 +245,6 @@
 //  end incremented. When the memory address limit is reached, the data word    //
 //  address will “roll over” and the sequential read will continue.             //
 //******************************************************************************//
-//bool AT24C64D::read(uint16_t uiAddr, char * cData, uint16_t uiLength){}
-
-
-
-//******************************************************************************//
-//
-//******************************************************************************//
-bool AT24C64D::readByte(char *cData){ 
-
-    bAck = ACKpolling(AT24C64D_R);                                              // polling for ACK
-    
-    if(bAck == ACK){        
-        i2c->start();                                                           // send a start condition
-        i2c->write(AT24C64D_R);
-        *cData = i2c->read(false);
-        i2c->stop();
-    }
-    return bAck;
-}
-
-
-//******************************************************************************//
-//
-//******************************************************************************//
-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();
-        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 bAck;
-}
-
-
-
-//******************************************************************************//
-//
-//******************************************************************************//
 bool AT24C64D::read(uint16_t uiAddr, char *cData, uint16_t uiLength){ 
     
     if(uiLength == 0){
@@ -242,7 +252,7 @@
         return NACK;
     }
     
-    ACKpolling(AT24C64D_R);
+    //ACKpolling(AT24C64D_R);
     
     
     
@@ -274,7 +284,9 @@
 //
 /******************************************************************************/
 bool AT24C64D::isReady(){
-    if(bReady or timer->read_ms() >= READY_TIME_MS){
+    
+    if(timer->read_ms() > READY_TIME_MS){
+        //printf("Time: %d\n", timer->read_ms());
         bReady = true;
 
         if(bTimerRun){
@@ -282,7 +294,7 @@
             bTimerRun = false;
         }
     }
-
+    
     return bReady;
 }
 
@@ -319,6 +331,8 @@
             printf("Read from EPPROM: timeout\n");
             return NACK;
         }       
+    
+        wait(100e-6);
     }
     
     return bAck;
--- a/AT24C64D.h	Fri Feb 22 10:05:29 2019 +0000
+++ b/AT24C64D.h	Fri Mar 01 11:26:26 2019 +0000
@@ -12,21 +12,28 @@
         
         //variable
         bool bAck;
+        static const uint16_t READY_TIME_US = 5000;                             // Write time in us
+        static const uint16_t READY_TIME_MS = 5;
         
     
         // function
         AT24C64D(I2C *_i2c, uint8_t uiAddr);
         
-        //virtual bool write(uint16_t uiAddr, char * cData, uint16_t uiLength);
-        virtual bool writeByte(uint16_t uiAddr, char * cData);
-        bool readByte(char * cData);
-        bool readByte(uint16_t uiAddr, char * cData);
+        virtual bool write(char * cData);
+        virtual bool write(uint16_t uiAddr, char *cData);
+        virtual bool write(uint16_t uiAddr, char * cData, uint16_t uiLength);
+        
+        
+        virtual bool read(char * cData);
+        virtual bool read(uint16_t uiAddr, char *cData);
         virtual bool read(uint16_t uiAddr, char * cData, uint16_t uiLength);
         
         virtual void reset();
-        virtual bool erase();
+        virtual bool erase();        
         virtual bool isReady();
         
+        
+        
         virtual void setAddrWrite(uint16_t Addr);
         virtual uint16_t getAddrWrite();
         virtual void incAddrWrite();
@@ -49,8 +56,7 @@
         static const int USER_ADDR_MASK      = 0x07;
 
             
-        static const uint16_t READY_TIME_US = 5000;                             // Write time in us
-        static const uint16_t READY_TIME_MS = 6;
+        
         static const uint8_t SIZE_PAGE      = 32;                               // 32-Byte Page Write Mode (Partial Page Writes Allowed)
         static const uint16_t MEM_ADDR_MAX  = 8192;                             // 0...4095
         static const uint16_t TIMEOUT_VAL   = 1000;