mFS file system library for EEPROM memory chips.

i2c_eeprom.cpp

Committer:
HBP
Date:
2011-02-21
Revision:
0:cbf45dde2b49
Child:
5:a0fe74dce80d

File content as of revision 0:cbf45dde2b49:

/*H****************************************************************************
* FILENAME :        i2c_eeprom.cpp                                            *
*                                                                             *
* DESCRIPTION :                                                               *
*       Simple library for external I2C EEEPROM.                              *
*                                                                             *
* AUTHOR :    Olli Vanhoja        START DATE :    2011-02-17                  *
*******************************************************************************
*
* CHANGES :
*
* VERSION DATE       WHO             DETAIL
* 0.1     2011-02-21 Olli Vanhoja    Initial release version
*
*H*/

#include "mbed.h"
#include "i2c_eeprom.h"

I2C i2c(p28, p27);
DigitalOut BusyLed(LED1);

i2c_eeprom::i2c_eeprom()
{
}

i2c_eeprom::i2c_eeprom(int hwAddr)
{
    i_i2c_address = hwAddr;
}

void i2c_eeprom::write(char *data, uint16 iAddr, unsigned int n)
{
    char *pi2c_data[3]; // Pointers for CW items
    char i2c_data[3];   // Final CW
    
    BusyLed = 1;

    /* Convert address to hi and low byte array
     * This is really pointless even though they are
     * called pointers it would be lot easier to do this
     * conversion without any pointers */
    uint16 *piAddr = &iAddr;
    pi2c_data[0] = (char *)piAddr+1;
    pi2c_data[1] = (char *)piAddr;
    
    for (uint16 i=0; i < n; i++)
    {
        pi2c_data[2] = &data[i];
        
        // Apply actual values from pointer
        //for (int n=0; n < 3; n++)
        //    i2c_data[n] = *pi2c_data[n];
        i2c_data[0] = *pi2c_data[0];
        i2c_data[1] = *pi2c_data[1];
        i2c_data[2] = *pi2c_data[2];
        
        // Send write command
        if(i2c.write(i_i2c_address, i2c_data, 3))
            error("Write failed!\n\r");
        
        iAddr++; // increment address counter

        // Wait for ACK        
        while(i2c.write(i_i2c_address, NULL, 0)){}
    }
    
    BusyLed = 0;
}

void i2c_eeprom::read(uint16 iAddr, uint16 n, char *out)
{
    char *pi2c_data[2]; // Pointers for CW items
    char i2c_data[2];   // Final CW
    
    uint16 *piAddr = &iAddr;
    pi2c_data[0] = (char *)piAddr+1;
    pi2c_data[1] = (char *)piAddr;
    
    BusyLed = 1;
    
    // Apply actual values from pointer
    //for (int i=0; i < 2; i++)
    //    i2c_data[i] = *pi2c_data[i];
    i2c_data[0] = *pi2c_data[0];
    i2c_data[1] = *pi2c_data[1];
    
    // Send read command
    if(i2c.write(i_i2c_address, i2c_data, 2))
        error("Read failed! ref:1\n\r");
    
    if(i2c.read(i_i2c_address, out, n))
        error("Read failed! ref:2\n\r");
    
    BusyLed = 0;
}