I2C EEPROM library from 24C01 to 24C1025

Dependents:   Digitalni_Sat_MG_AN EEROM_1768 EEPROM_kamal EEPROM_MY ... more

Revision:
1:a262173cac81
Parent:
0:80245aff63ce
Child:
2:79ed7ff7c23d
--- a/eeprom.cpp	Sat Jul 14 08:20:06 2012 +0000
+++ b/eeprom.cpp	Wed Dec 11 23:13:19 2013 +0000
@@ -1,7 +1,18 @@
 /***********************************************************
 Author: Bernard Borredon
+Date: 11 december 2013
+Version: 1.1
+  - Change address parameter size form uint16_t to uint32_t (error for eeprom > 24C256).
+  - Change size parameter size from uint16_t to uint32_t (error for eeprom > 24C256).
+    - Correct a bug in function write(uint32_t address, int8_t data[], uint32_t length) :
+      last step must be done only if it remain datas to send.
+    - Add function getName.
+    - Add function clear.
+    - Initialize _name array.
+
 Date: 27 december 2011
 Version: 1.0
+
 ************************************************************/
 #include "eeprom.h"
 
@@ -9,6 +20,9 @@
 #define BIT_TEST(x,n) (x & (0x01<<n))
 #define BIT_CLEAR(x,n) (x=x & ~(0x01<<n))
 
+const char * const EEPROM::_name[] = {"24C01","24C02","24C04","24C08","24C16","24C32",
+                                        "24C64","24C128","24C256","24C512","24C1024","24C1025"};
+
 EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2c(sda, scl) 
 {
   
@@ -101,7 +115,7 @@
   _i2c.frequency(400000);
 }
 
-void EEPROM::write(uint16_t address, int8_t data)
+void EEPROM::write(uint32_t address, int8_t data)
 {
   uint8_t page;
   uint8_t addr;
@@ -148,8 +162,6 @@
     // Data
     cmd[2] = (uint8_t) data;
   }
-  
-  //printf("len %d address %02x cmd[0] %02x cmd[1] %02x cmd[2] %02x\n",len,addr,cmd[0],cmd[1],cmd[2]);
  
   ack = _i2c.write((int)addr,(char *)cmd,len);
   if(ack != 0) {
@@ -162,10 +174,10 @@
 
 }
 
-void EEPROM::write(uint16_t address, int8_t data[], uint16_t length)
+void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
 {
   uint8_t page;
-  uint8_t addr;
+  uint8_t addr = 0;
   uint8_t blocs,remain;
   uint8_t fpart,lpart;
   uint8_t i,j,ind;
@@ -307,84 +319,86 @@
      }
   }
   
-  // Compute page number
-  page = 0;
-  if(_type < T24C32)
-    page = (uint8_t) (address / 256); 
+    if(remain) {
+    // Compute page number
+    page = 0;
+    if(_type < T24C32)
+      page = (uint8_t) (address / 256); 
   
-  // Device address
-  addr = EEPROM_Address | _address | (page << 1);
-  
-  if(_type < T24C32) {
-    // Word address
-    cmd[0] = (uint8_t) (address - page * 256);
+    // Device address
+    addr = EEPROM_Address | _address | (page << 1);
   
-    if((uint8_t) ((address + remain) / 256) == page) { // Data fit in the same page
-      // Add data for the current page
-      for(j = 0;j < remain;j++)
-         cmd[j + 1] = (uint8_t) data[blocs * _page_write + j];
-    
-      // Write data for the current page
-      ack = _i2c.write((int)addr,(char *)cmd,remain + 1);
-      if(ack != 0) {
-        _errnum = EEPROM_I2cError;
-        return;
-      }
+    if(_type < T24C32) {
+      // Word address
+      cmd[0] = (uint8_t) (address - page * 256);
   
-      // Wait end of write
-      ready();
-    }
-    else { // Data on 2 pages. We must split the write
-      // Number of bytes in current page
-      fpart = (page + 1) * 256 - address;
-    
-      // Add data for current page
-      for(j = 0;j < fpart;j++)
-         cmd[j + 1] = (uint8_t) data[blocs * _page_write + j];
+      if((uint8_t) ((address + remain) / 256) == page) { // Data fit in the same page
+        // Add data for the current page
+        for(j = 0;j < remain;j++)
+           cmd[j + 1] = (uint8_t) data[blocs * _page_write + j];
     
-      // Write data for current page
-      ack = _i2c.write((int)addr,(char *)cmd,fpart + 1);
-      if(ack != 0) {
-        _errnum = EEPROM_I2cError;
-        return;
-      }
-  
-      // Wait end of write
-      ready();
-    
-      // Increment address
-      address += fpart;
-       
-      if(page < _page_number - 1) {
-        // Increment page
-        page++;
-    
-        // Device address
-        addr = EEPROM_Address | _address | (page << 1);
-    
-        // Word address
-        cmd[0] = (uint8_t) (address - page * 256);
-    
-        // Data index
-        ind = blocs * _page_write + fpart;
-    
-        // Number of bytes in next page
-        lpart = remain - fpart;
-    
-        // Add data for next page
-        for(j = 0;j < lpart;j++)
-           cmd[j + 1] = (uint8_t) data[ind + j];
-    
-        // Write data for next page
-        ack = _i2c.write((int)addr,(char *)cmd,lpart + 1);
+        // Write data for the current page
+        ack = _i2c.write((int)addr,(char *)cmd,remain + 1);
         if(ack != 0) {
           _errnum = EEPROM_I2cError;
           return;
         }
-        
+  
         // Wait end of write
         ready();
       }
+      else { // Data on 2 pages. We must split the write
+        // Number of bytes in current page
+        fpart = (page + 1) * 256 - address;
+    
+        // Add data for current page
+        for(j = 0;j < fpart;j++)
+           cmd[j + 1] = (uint8_t) data[blocs * _page_write + j];
+    
+        // Write data for current page
+        ack = _i2c.write((int)addr,(char *)cmd,fpart + 1);
+        if(ack != 0) {
+          _errnum = EEPROM_I2cError;
+          return;
+        }
+  
+        // Wait end of write
+        ready();
+    
+        // Increment address
+        address += fpart;
+       
+        if(page < _page_number - 1) {
+          // Increment page
+          page++;
+    
+          // Device address
+          addr = EEPROM_Address | _address | (page << 1);
+    
+          // Word address
+          cmd[0] = (uint8_t) (address - page * 256);
+    
+          // Data index
+          ind = blocs * _page_write + fpart;
+    
+          // Number of bytes in next page
+          lpart = remain - fpart;
+    
+          // Add data for next page
+          for(j = 0;j < lpart;j++)
+             cmd[j + 1] = (uint8_t) data[ind + j];
+    
+          // Write data for next page
+          ack = _i2c.write((int)addr,(char *)cmd,lpart + 1);
+          if(ack != 0) {
+            _errnum = EEPROM_I2cError;
+            return;
+          }
+        
+          // Wait end of write
+          ready();
+        }
+            }
     }
   }
   else {
@@ -411,7 +425,7 @@
   
 }
 
-void EEPROM::write(uint16_t address, int16_t data)
+void EEPROM::write(uint32_t address, int16_t data)
 {
   int8_t cmd[2];
   
@@ -431,7 +445,7 @@
   
 }
 
-void EEPROM::write(uint16_t address, int32_t data)
+void EEPROM::write(uint32_t address, int32_t data)
 {
   int8_t cmd[4];
   
@@ -451,7 +465,7 @@
   
 }
 
-void EEPROM::write(uint16_t address, float data)
+void EEPROM::write(uint32_t address, float data)
 {
   int8_t cmd[4];
   
@@ -471,7 +485,7 @@
   
 }
 
-void EEPROM::write(uint16_t address, void *data, uint16_t size)
+void EEPROM::write(uint32_t address, void *data, uint32_t size)
 {
   int8_t *cmd = NULL;
   
@@ -491,15 +505,15 @@
     return;
   }
     
-  memcpy(cmd,data,size);
+  memcpy(cmd,(uint8_t *)data,size);
   
   write(address,cmd,size);
-  
+    
   free(cmd);
   
 }
 
-void EEPROM::read(uint16_t address, int8_t& data)
+void EEPROM::read(uint32_t address, int8_t& data)
 {
   uint8_t page;
   uint8_t addr;
@@ -557,7 +571,7 @@
   
 }
 
-void EEPROM::read(uint16_t address, int8_t *data, uint16_t size)
+void EEPROM::read(uint32_t address, int8_t *data, uint32_t size)
 {
   uint8_t page;
   uint8_t addr;
@@ -642,7 +656,7 @@
   
 }
 
-void EEPROM::read(uint16_t address, int16_t& data)
+void EEPROM::read(uint32_t address, int16_t& data)
 {
   int8_t cmd[2];
   
@@ -662,7 +676,7 @@
   
 }
 
-void EEPROM::read(uint16_t address, int32_t& data)
+void EEPROM::read(uint32_t address, int32_t& data)
 {
   int8_t cmd[4];
   
@@ -682,7 +696,7 @@
   
 }
 
-void EEPROM::read(uint16_t address, float& data)
+void EEPROM::read(uint32_t address, float& data)
 {
   int8_t cmd[4];
   
@@ -702,10 +716,10 @@
   
 }
 
-void EEPROM::read(uint16_t address, void *data, uint16_t size)
+void EEPROM::read(uint32_t address, void *data, uint32_t size)
 {
   int8_t *cmd = NULL;
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -717,12 +731,13 @@
   }
   
   cmd = (int8_t *)malloc(size);
+
   if(cmd == NULL) {
     _errnum = EEPROM_MallocError;
     return;
   }
   
-  read(address,cmd,size);
+  read(address,(int8_t *)cmd,size);
   
   memcpy(data,cmd,size);
   
@@ -730,11 +745,23 @@
   
 }
 
+void EEPROM::clear(void)
+{
+  int32_t data;
+  uint32_t i;
+  
+  data = 0;
+  
+  for(i = 0; i < _size / 4;i++) {
+     write((uint32_t)(i * 4),data);  
+  }
+}
+
 void EEPROM::ready(void)
 {
   int ack;
   uint8_t addr;
-  uint8_t cmd;
+  uint8_t cmd[2];
   
   // Check error
   if(_errnum) 
@@ -743,11 +770,12 @@
   // Device address
   addr = EEPROM_Address | _address;
   
-  cmd = 0;
+  cmd[0] = 0;
   
   // Wait end of write
   do {
        ack = _i2c.write((int)addr,(char *)cmd,0);
+           //wait(0.5);
   } while(ack != 0);
 
 }
@@ -757,12 +785,58 @@
   return(_size);
 }
 
+const char* EEPROM::getName(void)
+{
+  uint8_t i = 0;
+  
+  switch(_type) {
+                  case T24C01 :
+                                         i = 0;
+                     break;
+                  case T24C02 :
+                                         i = 1;
+                     break;
+                  case T24C04 :
+                                         i = 2;
+                     break;
+                  case T24C08 :
+                                         i = 3;
+                     break;
+                  case T24C16 :
+                                         i = 4;
+                     break;
+                  case T24C32 :
+                                         i = 5; 
+                     break;
+                  case T24C64 :
+                                         i = 6;
+                     break;
+                  case T24C128 :
+                                         i = 7;
+                     break;
+                  case T24C256 :
+                                         i = 8;
+                     break;
+                  case T24C512 :
+                                         i = 9;
+                     break;
+                  case T24C1024 :
+                                         i = 10;
+                     break;
+                  case T24C1025 :
+                                         i = 11;
+                     break;
+  }
+  
+  return(_name[i]);
+}
+
 uint8_t EEPROM::getError(void)
 {
   return(_errnum);
 }
 
-bool EEPROM::checkAddress(uint16_t address)
+bool EEPROM::checkAddress(uint32_t address)
 {
   bool ret = true;
   
@@ -818,4 +892,4 @@
   }
   
   return(ret);
-}  
\ No newline at end of file
+}