Class to provide simple access to I2C EEPROM chiles like Microchip's 24LC range or AMTELS AT24C range. Chips up to 64Kb in size are directly supported.

Dependents:   Test_I2CEeprom Alternator2020_06

This class provides a simple read write interface for I2C EEPROMs like Microchip's 24LC range and AMTELS AT24C range. The class ensure that writes respect the page size of the chip to ensure larger blocks can be written in one call. The class uses the supplied buffer to directly write to the chip so no extra RAM is used.

Revision:
1:b23f5561266c
Parent:
0:f275a33797f1
--- a/Mem24LCXX.cpp	Sat Jun 27 13:03:49 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,170 +0,0 @@
-/* Simple access class for Microchip 24LC EEPROM chips library
- * Copyright (c) 2015 Robin Hourahane
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "Mem24LCXX.h"
-
-const int PageSize = 64;
-
-Mem24LCXX::Mem24LCXX(PinName sda, PinName scl, int address, size_t chipSize, int busSpeed):
-    m_i2c(sda, scl),
-    m_i2cAddress(address),
-    m_chipSize(chipSize)
-{
-    m_i2c.frequency(busSpeed);
-}
-
-size_t Mem24LCXX::read(size_t address, char &value) {
-    if (!checkSpace(address, 1))
-        return 0;
-        
-    char values[] = { (address >> 8), (address & 0xFF) };
-    if (m_i2c.write(m_i2cAddress, values, 2) == 0) {
-        if (m_i2c.read(m_i2cAddress, &value, 1) == 0) {
-            return 1;
-        }
-    }
-    
-    return 0;
-}
-
-size_t Mem24LCXX::read(size_t address, char *buffer, size_t size) {
-    if (!checkSpace(address, size))
-        return 0;
-        
-    char values[] = { (address >> 8), (address & 0xFF) };
-    if (m_i2c.write(m_i2cAddress, values, 2) == 0) {
-        if (m_i2c.read(m_i2cAddress, buffer, size) == 0) {
-            return size;
-        }
-    }
-    
-    return 0;
-}
-
-size_t Mem24LCXX::write(size_t address, char value) {
-    if (!checkSpace(address, 1))
-        return 0;
-        
-    char values[] = { (address >> 8), (address & 0xFF), value };
-    if (m_i2c.write(m_i2cAddress, values, 3) != 0) {
-        return 0;
-    }
-    
-    waitForWrite();
-    
-    return 1;
-}
-
-size_t Mem24LCXX::write(size_t address, const char *buffer, size_t size) {
-    if (!checkSpace(address, size))
-        return 0;
-        
-    const char *page = buffer;
-    size_t left = size;
-    
-    while (left != 0) {
-        size_t toWrite;
-        if ((address % PageSize) != 0) {
-            toWrite = (((address / PageSize) + 1) * 64) - address;
-            if (toWrite > size) {
-                toWrite = size;
-            }
-        } else {
-            if (left <= PageSize) {
-                toWrite = left;
-            } else {
-                toWrite = PageSize;
-            }
-        }
-        
-        printf("Writing [%.*s] at %d size %d\n\r", toWrite, page, address, toWrite);
-        char values[] = { (address >> 8), (address & 0xFF) };
-        if (m_i2c.write(m_i2cAddress, values, 2, true) != 0) {
-            return size - left;
-        }
-        
-        for (int count = 0; count != toWrite; ++count) {
-            if (m_i2c.write(*page) == 0) {
-                return size - left;
-            }
-            ++page;
-        }
-        
-        m_i2c.stop();
-        
-        waitForWrite();
-        
-        left -= toWrite;
-        address += toWrite;
-    }
-    return size;
-}
-
-size_t Mem24LCXX::fill(size_t address, char value, size_t size) {
-    if (!checkSpace(address, size))
-        return 0;
-        
-    size_t left = size;
-    
-    while (left != 0) {
-        size_t toWrite;
-        if ((address % PageSize) != 0) {
-            toWrite = (((address / PageSize) + 1) * 64) - address;
-            if (toWrite > size) {
-                toWrite = size;
-            }
-        } else {
-            if (left <= PageSize) {
-                toWrite = left;
-            } else {
-                toWrite = PageSize;
-            }
-        }
-        
-        printf("Writing %d at %d size %d\n\r", value, address, toWrite);
-        char values[] = { (address >> 8), (address & 0xFF) };
-        if (m_i2c.write(m_i2cAddress, values, 2, true) != 0) {
-            return size - left;
-        }
-        
-        for (int count = 0; count != toWrite; ++count) {
-            if (m_i2c.write(value) == 0)
-                return size - left;
-        }
-        
-        m_i2c.stop();
-        
-        waitForWrite();
-        
-        left -= toWrite;
-        address += toWrite;
-    }
-    return true;
-}
-
-void Mem24LCXX::waitForWrite() {
-    while (m_i2c.write(m_i2cAddress, 0, 0) != 0) {
-        // Wait for ack.
-        wait_ms(1);
-    }
-}
-
-bool Mem24LCXX::checkSpace(size_t address, size_t size) {
-    if ((address >= m_chipSize) || ((address + size) >= m_chipSize))
-        return false;
-    else
-        return true;
-}
-