I2C EEPROM library from 24C01 to 24C1025

Dependents:   Digitalni_Sat_MG_AN EEROM_1768 EEPROM_kamal EEPROM_MY ... more

Revision:
3:925096a4c7f0
Parent:
2:79ed7ff7c23d
--- a/eeprom.cpp	Mon Nov 02 23:20:56 2015 +0000
+++ b/eeprom.cpp	Mon Dec 21 23:26:42 2015 +0000
@@ -1,5 +1,10 @@
 /***********************************************************
 Author: Bernard Borredon
+Version: 1.3
+  - Correct write(uint32_t address, int8_t data[], uint32_t length) for eeprom >= T24C32.
+    Tested with 24C02, 24C08, 24C16, 24C64, 24C256, 24C512, 24C1025 on LPC1768 (mbed online and µVision V5.16a).
+  - Correct main test.
+    
 Date : 12 decembre 2013
 Version: 1.2
   - Update api documentation
@@ -27,6 +32,16 @@
 const char * const EEPROM::_name[] = {"24C01","24C02","24C04","24C08","24C16","24C32",
                                         "24C64","24C128","24C256","24C512","24C1024","24C1025"};
 
+/**
+ * EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2c(sda, scl)
+ *
+ * Constructor, initialize the eeprom on i2c interface.
+ * @param sda sda i2c pin (PinName)
+ * @param scl scl i2c pin (PinName)
+ * @param address eeprom address, according to eeprom type (uint8_t)
+ * @param type eeprom type (TypeEeprom) 
+ * @return none
+*/
 EEPROM::EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type) : _i2c(sda, scl) 
 {
   
@@ -117,8 +132,17 @@
   
   // Set I2C frequency
   _i2c.frequency(400000);
+
 }
 
+/**
+ * void write(uint32_t address, int8_t data)
+ *
+ * Write byte
+ * @param address start address (uint32_t)
+ * @param data byte to write (int8_t)
+ * @return none
+*/
 void EEPROM::write(uint32_t address, int8_t data)
 {
   uint8_t page;
@@ -126,7 +150,7 @@
   uint8_t cmd[3];
   int len;
   int ack;
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -166,7 +190,7 @@
     // Data
     cmd[2] = (uint8_t) data;
   }
- 
+    
   ack = _i2c.write((int)addr,(char *)cmd,len);
   if(ack != 0) {
     _errnum = EEPROM_I2cError;
@@ -178,6 +202,15 @@
 
 }
 
+/**
+ * void write(uint32_t address, int8_t data[], uint32_t length)
+ *
+ * Write array of bytes (use the page mode)
+ * @param address start address (uint32_t)
+ * @param data bytes array to write (int8_t[])
+ * @param size number of bytes to write (uint32_t)
+ * @return none
+*/
 void EEPROM::write(uint32_t address, int8_t data[], uint32_t length)
 {
   uint8_t page;
@@ -187,7 +220,7 @@
   uint8_t i,j,ind;
   uint8_t cmd[129];
   int ack;
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -209,7 +242,7 @@
   
   // Compute remaining bytes
   remain = length - blocs * _page_write;
-  
+    
   for(i = 0;i < blocs;i++) {
      // Compute page number
      page = 0;
@@ -323,7 +356,7 @@
      }
   }
   
-    if(remain) {
+  if(remain) {
     // Compute page number
     page = 0;
     if(_type < T24C32)
@@ -402,37 +435,45 @@
           // Wait end of write
           ready();
         }
-            }
+      }
     }
-  }
-  else {
-    // Fist word address (MSB)
-    cmd[0] = (uint8_t) (address >> 8);
+    else {
+      // Fist word address (MSB)
+      cmd[0] = (uint8_t) (address >> 8);
     
-    // Second word address (LSB)
-    cmd[1] = (uint8_t) address;
+      // Second word address (LSB)
+      cmd[1] = (uint8_t) address;
 
-    // Add data for the current page
-    for(j = 0;j < remain;j++)
-       cmd[j + 2] = (uint8_t) data[blocs * _page_write + j];
-    
-    // Write data for the current page
-    ack = _i2c.write((int)addr,(char *)cmd,remain + 2);
-    if(ack != 0) {
-      _errnum = EEPROM_I2cError;
-      return;
-    }
+      // Add data for the current page
+      for(j = 0;j < remain;j++)
+         cmd[j + 2] = (uint8_t) data[blocs * _page_write + j];
+        
+      // Write data for the current page
+      ack = _i2c.write((int)addr,(char *)cmd,remain + 2);
+      if(ack != 0) {
+        _errnum = EEPROM_I2cError;
+        return;
+      }
   
-    // Wait end of write
-    ready();
+      // Wait end of write
+      ready();
+        }
   }
   
 }
 
+/**
+ * void write(uint32_t address, int16_t data)
+ *
+ * Write short
+ * @param address start address (uint32_t)
+ * @param data short to write (int16_t)
+ * @return none
+*/
 void EEPROM::write(uint32_t address, int16_t data)
 {
   int8_t cmd[2];
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -449,10 +490,18 @@
   
 }
 
+/**
+ * void write(uint32_t address, int32_t data)
+ *
+ * Write long
+ * @param address start address (uint32_t)
+ * @param data long to write (int32_t)
+ * @return none
+*/
 void EEPROM::write(uint32_t address, int32_t data)
 {
   int8_t cmd[4];
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -469,10 +518,18 @@
   
 }
 
+/**
+ * void write(uint32_t address, float data)
+ *
+ * Write float
+ * @param address start address (uint32_t)
+ * @param data float to write (float)
+  * @return none
+*/
 void EEPROM::write(uint32_t address, float data)
 {
   int8_t cmd[4];
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -489,10 +546,19 @@
   
 }
 
+/**
+ * void write(uint32_t address, void *data, uint32_t size)
+ *
+ * Write anything (use the page write mode)
+ * @param address start address (uint32_t)
+ * @param data data to write (void *)
+ * @param size number of bytes to write (uint32_t)
+ * @return none
+*/
 void EEPROM::write(uint32_t address, void *data, uint32_t size)
 {
   int8_t *cmd = NULL;
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -517,6 +583,14 @@
   
 }
 
+/**
+ * void read(uint32_t address, int8_t& data)
+ *
+ * Random read byte
+ * @param address start address (uint32_t)
+ * @param data byte to read (int8_t&)
+ * @return none
+*/
 void EEPROM::read(uint32_t address, int8_t& data)
 {
   uint8_t page;
@@ -524,7 +598,7 @@
   uint8_t cmd[2];
   uint8_t len;
   int ack;
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -534,7 +608,7 @@
     _errnum = EEPROM_OutOfRange;
     return;
   }
-  
+    
   // Compute page number
   page = 0;
   if(_type < T24C32)
@@ -575,6 +649,15 @@
   
 }
 
+/**
+ * void read(uint32_t address, int8_t *data, uint32_t size)
+ *
+ * Sequential read byte
+ * @param address start address (uint32_t)
+ * @param data bytes array to read (int8_t[]&)
+ * @param size number of bytes to read (uint32_t)
+ * @return none
+*/
 void EEPROM::read(uint32_t address, int8_t *data, uint32_t size)
 {
   uint8_t page;
@@ -582,7 +665,7 @@
   uint8_t cmd[2];
   uint8_t len;
   int ack;
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -639,11 +722,18 @@
   
 }
 
+/**
+ * void read(int8_t& data)
+ *
+ * Current address read byte
+ * @param data byte to read (int8_t&)
+ * @return none
+ */
 void EEPROM::read(int8_t& data)
 {
   uint8_t addr;
   int ack;
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -660,10 +750,18 @@
   
 }
 
+/**
+ * void read(uint32_t address, int16_t& data)
+ *
+ * Random read short
+ * @param address start address (uint32_t)
+ * @param data short to read (int16_t&)
+ * @return none
+*/
 void EEPROM::read(uint32_t address, int16_t& data)
 {
   int8_t cmd[2];
-  
+        
   // Check error
   if(_errnum) 
     return;
@@ -680,10 +778,18 @@
   
 }
 
+/**
+ * void read(uint32_t address, int32_t& data)
+ *
+ * Random read long
+ * @param address start address (uint32_t)
+ * @param data long to read (int32_t&)
+ * @return none
+*/
 void EEPROM::read(uint32_t address, int32_t& data)
 {
   int8_t cmd[4];
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -700,10 +806,18 @@
   
 }
 
+/**
+ * void read(uint32_t address, float& data)
+ *
+ * Random read float
+ * @param address start address (uint32_t)
+ * @param data float to read (float&)
+ * @return none
+ */
 void EEPROM::read(uint32_t address, float& data)
 {
   int8_t cmd[4];
-  
+    
   // Check error
   if(_errnum) 
     return;
@@ -720,6 +834,15 @@
   
 }
 
+/**
+ * void read(uint32_t address, void *data, uint32_t size)
+ *
+ * Random read anything
+ * @param address start address (uint32_t)
+ * @param data data to read (void *)
+ * @param size number of bytes to read (uint32_t)
+ * @return none
+*/
 void EEPROM::read(uint32_t address, void *data, uint32_t size)
 {
   int8_t *cmd = NULL;
@@ -749,6 +872,13 @@
   
 }
 
+/**
+ * void clear(void)
+ *
+ * Clear eeprom (write with 0)
+ * @param none
+ * @return none
+ */
 void EEPROM::clear(void)
 {
   int32_t data;
@@ -761,6 +891,13 @@
   }
 }
 
+/**
+ * void ready(void)
+ *
+ * Wait eeprom ready
+ * @param none
+ * @return none
+*/
 void EEPROM::ready(void)
 {
   int ack;
@@ -784,11 +921,25 @@
 
 }
 
+/**
+ * uint32_t getSize(void)
+ *
+ * Get eeprom size in bytes
+ * @param  none
+ * @return size in bytes (uint32_t)
+*/
 uint32_t EEPROM::getSize(void)
 {
   return(_size);
 }
 
+/**
+ * const char* getName(void)
+ *
+ * Get eeprom name
+ * @param none
+ * @return name (const char*)
+ */
 const char* EEPROM::getName(void)
 {
   uint8_t i = 0;
@@ -835,11 +986,25 @@
   return(_name[i]);
 }
 
+/**
+ * uint8_t getError(void)
+ *
+ * Get the current error number (EEPROM_NoError if no error)
+ * @param none
+ * @return none
+*/
 uint8_t EEPROM::getError(void)
 {
   return(_errnum);
 }
 
+/**
+ * bool checkAddress(uint32_t address)
+ *
+ * Check if address is in the eeprom range address
+ * @param address address to check (uint32_t)
+ * @return true if in eeprom range, overwise false (bool)
+*/
 bool EEPROM::checkAddress(uint32_t address)
 {
   bool ret = true;