Library to use on memories 24Cxx

M24CXX.cpp

Committer:
lucasmoraeseng
Date:
2016-03-02
Revision:
0:0a68754e37e4

File content as of revision 0:0a68754e37e4:

/* Copyright (c) 2010-2011 mbed.org, MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

#include "M24CXX.h"

#ifndef MaxTimes
#define MaxTimes 5
#endif

#ifndef AdrLength
#define AdrLength 16
#endif

M24CXX::M24CXX(PinName SDA, PinName SCL,int Adr):m_i2c(SDA,SCL), m_Address(Adr){
    m_i2c.frequency(100000);
}

M24CXX::~M24CXX() { }

int M24CXX::write(int EEAddres, uint8_t Data){
    uint8_t MT = MaxTimes;
    uint8_t Ackno=1;
    uint8_t AckOld=1;
    
    uint8_t MAd;
    uint8_t MHAd,MLAd;
    uint8_t Mdata;
    
    
    
    MAd = (0b10100000) | 0x00; //m_Address;
    MHAd = (EEAddres >> 8) & 0xff;
    MLAd = (EEAddres & 0xff);
    Mdata = Data & 0xff;
    
    
    while(Ackno==1 && MT>0)
    {
        m_i2c.start();
        //printf("Ack is %d\r\n",Ackno);  
        //printf("Memory Ad %d\r\n",m_Address);
        //printf("Try to send Memory Address %d\r\n",MAd);
        AckOld = m_i2c.write(MAd);
        Ackno = Ackno && AckOld; 
        //printf("Ack is %d\r\n",Ackno);  
        
        if(AdrLength == 16)
        {
            //printf("Try to send EE High Address %d\r\n",MHAd);
            AckOld = m_i2c.write(MHAd);
            Ackno = Ackno && AckOld; 
            //printf("Ack is %d\r\n",Ackno);  
         }
            
        //printf("Try to send EE Low Address %d\r\n",MLAd);
        AckOld = m_i2c.write(MLAd);
        Ackno = Ackno && AckOld; 
        //printf("Ack is %d\r\n",Ackno);  
        
        //printf("Try to send Data %d\r\n",Mdata);
        AckOld = m_i2c.write(Mdata);
        Ackno = Ackno && AckOld; 
        //printf("Ack is %d\r\n",Ackno);  
        
        m_i2c.stop();
        
        wait(1);
        
        if(Ackno == 0){
            MT--;
            if( MT>0){
                Ackno = 1;
            }
        }
        else
        {
            MT=0;
        }
    }        
    
    return Ackno;
}

int M24CXX::Write(int EEAddres, uint8_t Data)
{
    return write(EEAddres,Data);
} 
    
int M24CXX::writePage(int EEAddres, uint8_t* Data, int Length)
{
    uint8_t MT = MaxTimes;
    uint8_t Ackno=1;
    uint8_t AckOld=1;
    
    uint8_t MAd;
    uint8_t MHAd,MLAd;
    
    
    MAd = (0b10100000) | m_Address;
    MHAd = (EEAddres >> 8) & 0xff;
    MLAd = (EEAddres & 0xff);
    
    
    while(Ackno==1 && MT>0)
    {
        m_i2c.start();
        //printf("Ack is %d\r\n",Ackno);  
        //printf("Memory Ad %d\r\n",m_Address);
        //printf("Try to send Memory Address %d\r\n",MAd);
        AckOld = m_i2c.write(MAd);
        Ackno = Ackno && AckOld; 
        //printf("Ack is %d\r\n",Ackno);  
        
        if(AdrLength == 16)
        {
            //printf("Try to send EE High Address %d\r\n",MHAd);
            AckOld = m_i2c.write(MHAd);
            Ackno = Ackno && AckOld; 
            //printf("Ack is %d\r\n",Ackno);  
         }
            
        //printf("Try to send EE Low Address %d\r\n",MLAd);
        AckOld = m_i2c.write(MLAd);
        Ackno = Ackno && AckOld; 
        //printf("Ack is %d\r\n",Ackno);  
        
        int i=0;
        
        for(i=0;i<Length;i++){
            //printf("Try to send Data %d\r\n",Data[i]);
            //printf("Try to send Data %c\r\n",Data[i]);
            AckOld = m_i2c.write(Data[i]);
            Ackno = Ackno && AckOld; 
            //printf("Ack is %d\r\n",Ackno);  
        }
        m_i2c.stop();
        
        if(Ackno == 0){
            MT--;
            if( MT>0){
                Ackno = 1;
            }
        }
        else
        {
            MT=0;
        }
    }        
    
    return Ackno;   
}

int M24CXX::WritePage(int EEAddres, uint8_t* Data, int Length)
{
    return writePage(EEAddres,(uint8_t*) &Data, Length);
}

    
uint8_t M24CXX::read(int EEAddres)
{
    uint8_t Read;
    uint8_t AckOld=1, Ackno=1;
    
    m_i2c.start();
    
    m_i2c.write((0b10100000) | m_Address);    
    
    if(AdrLength == 16)
    {
        AckOld = m_i2c.write((EEAddres >> 8) & 0xff);
        Ackno = Ackno && AckOld;  
    }
            
    AckOld = m_i2c.write((EEAddres & 0xff));
    Ackno = Ackno && AckOld; 
    
    m_i2c.start();
        
    m_i2c.write((0b10100001) | m_Address);    
    
    Read = m_i2c.read(0);
    
    return Read;    
}

uint8_t M24CXX::Read(int EEAddres)
{
    return read(EEAddres);
}

void M24CXX::readPage(int EEAddres,int Length,uint8_t* Data)
{
    int i;
    uint8_t AckOld=1, Ackno=1;
    
    m_i2c.start();
    
    m_i2c.write((0b10100000) | m_Address);    
    
    if(AdrLength == 16)
    {
        AckOld = m_i2c.write((EEAddres >> 8) & 0xff);
        Ackno = Ackno && AckOld;  
    }
            
    AckOld = m_i2c.write((EEAddres & 0xff));
    Ackno = Ackno && AckOld; 
    
    m_i2c.start();
        
    m_i2c.write((0b10100001) | m_Address);    
    
    
    for(i=0;i<Length-1;i++){
        Data[i] = m_i2c.read(1);
    }
        
    Data[Length] = m_i2c.read(0);
}
    
void M24CXX::ReadPage(int EEAddres,int Length,uint8_t* Data)
{
    readPage(EEAddres,Length,(uint8_t*)Data);
}