Revision:
0:0a68754e37e4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/M24CXX.cpp	Wed Mar 02 01:11:22 2016 +0000
@@ -0,0 +1,243 @@
+/* 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);
+}
+    
+    
+
+