Library to use on memories 24Cxx

Committer:
lucasmoraeseng
Date:
Wed Mar 02 01:11:22 2016 +0000
Revision:
0:0a68754e37e4
Library to use on memories 24Cxx

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lucasmoraeseng 0:0a68754e37e4 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
lucasmoraeseng 0:0a68754e37e4 2 *
lucasmoraeseng 0:0a68754e37e4 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
lucasmoraeseng 0:0a68754e37e4 4 * and associated documentation files (the "Software"), to deal in the Software without
lucasmoraeseng 0:0a68754e37e4 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
lucasmoraeseng 0:0a68754e37e4 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
lucasmoraeseng 0:0a68754e37e4 7 * Software is furnished to do so, subject to the following conditions:
lucasmoraeseng 0:0a68754e37e4 8 *
lucasmoraeseng 0:0a68754e37e4 9 * The above copyright notice and this permission notice shall be included in all copies or
lucasmoraeseng 0:0a68754e37e4 10 * substantial portions of the Software.
lucasmoraeseng 0:0a68754e37e4 11 *
lucasmoraeseng 0:0a68754e37e4 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
lucasmoraeseng 0:0a68754e37e4 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
lucasmoraeseng 0:0a68754e37e4 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
lucasmoraeseng 0:0a68754e37e4 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
lucasmoraeseng 0:0a68754e37e4 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
lucasmoraeseng 0:0a68754e37e4 17 */
lucasmoraeseng 0:0a68754e37e4 18
lucasmoraeseng 0:0a68754e37e4 19 #include "M24CXX.h"
lucasmoraeseng 0:0a68754e37e4 20
lucasmoraeseng 0:0a68754e37e4 21 #ifndef MaxTimes
lucasmoraeseng 0:0a68754e37e4 22 #define MaxTimes 5
lucasmoraeseng 0:0a68754e37e4 23 #endif
lucasmoraeseng 0:0a68754e37e4 24
lucasmoraeseng 0:0a68754e37e4 25 #ifndef AdrLength
lucasmoraeseng 0:0a68754e37e4 26 #define AdrLength 16
lucasmoraeseng 0:0a68754e37e4 27 #endif
lucasmoraeseng 0:0a68754e37e4 28
lucasmoraeseng 0:0a68754e37e4 29 M24CXX::M24CXX(PinName SDA, PinName SCL,int Adr):m_i2c(SDA,SCL), m_Address(Adr){
lucasmoraeseng 0:0a68754e37e4 30 m_i2c.frequency(100000);
lucasmoraeseng 0:0a68754e37e4 31 }
lucasmoraeseng 0:0a68754e37e4 32
lucasmoraeseng 0:0a68754e37e4 33 M24CXX::~M24CXX() { }
lucasmoraeseng 0:0a68754e37e4 34
lucasmoraeseng 0:0a68754e37e4 35 int M24CXX::write(int EEAddres, uint8_t Data){
lucasmoraeseng 0:0a68754e37e4 36 uint8_t MT = MaxTimes;
lucasmoraeseng 0:0a68754e37e4 37 uint8_t Ackno=1;
lucasmoraeseng 0:0a68754e37e4 38 uint8_t AckOld=1;
lucasmoraeseng 0:0a68754e37e4 39
lucasmoraeseng 0:0a68754e37e4 40 uint8_t MAd;
lucasmoraeseng 0:0a68754e37e4 41 uint8_t MHAd,MLAd;
lucasmoraeseng 0:0a68754e37e4 42 uint8_t Mdata;
lucasmoraeseng 0:0a68754e37e4 43
lucasmoraeseng 0:0a68754e37e4 44
lucasmoraeseng 0:0a68754e37e4 45
lucasmoraeseng 0:0a68754e37e4 46 MAd = (0b10100000) | 0x00; //m_Address;
lucasmoraeseng 0:0a68754e37e4 47 MHAd = (EEAddres >> 8) & 0xff;
lucasmoraeseng 0:0a68754e37e4 48 MLAd = (EEAddres & 0xff);
lucasmoraeseng 0:0a68754e37e4 49 Mdata = Data & 0xff;
lucasmoraeseng 0:0a68754e37e4 50
lucasmoraeseng 0:0a68754e37e4 51
lucasmoraeseng 0:0a68754e37e4 52 while(Ackno==1 && MT>0)
lucasmoraeseng 0:0a68754e37e4 53 {
lucasmoraeseng 0:0a68754e37e4 54 m_i2c.start();
lucasmoraeseng 0:0a68754e37e4 55 //printf("Ack is %d\r\n",Ackno);
lucasmoraeseng 0:0a68754e37e4 56 //printf("Memory Ad %d\r\n",m_Address);
lucasmoraeseng 0:0a68754e37e4 57 //printf("Try to send Memory Address %d\r\n",MAd);
lucasmoraeseng 0:0a68754e37e4 58 AckOld = m_i2c.write(MAd);
lucasmoraeseng 0:0a68754e37e4 59 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 60 //printf("Ack is %d\r\n",Ackno);
lucasmoraeseng 0:0a68754e37e4 61
lucasmoraeseng 0:0a68754e37e4 62 if(AdrLength == 16)
lucasmoraeseng 0:0a68754e37e4 63 {
lucasmoraeseng 0:0a68754e37e4 64 //printf("Try to send EE High Address %d\r\n",MHAd);
lucasmoraeseng 0:0a68754e37e4 65 AckOld = m_i2c.write(MHAd);
lucasmoraeseng 0:0a68754e37e4 66 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 67 //printf("Ack is %d\r\n",Ackno);
lucasmoraeseng 0:0a68754e37e4 68 }
lucasmoraeseng 0:0a68754e37e4 69
lucasmoraeseng 0:0a68754e37e4 70 //printf("Try to send EE Low Address %d\r\n",MLAd);
lucasmoraeseng 0:0a68754e37e4 71 AckOld = m_i2c.write(MLAd);
lucasmoraeseng 0:0a68754e37e4 72 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 73 //printf("Ack is %d\r\n",Ackno);
lucasmoraeseng 0:0a68754e37e4 74
lucasmoraeseng 0:0a68754e37e4 75 //printf("Try to send Data %d\r\n",Mdata);
lucasmoraeseng 0:0a68754e37e4 76 AckOld = m_i2c.write(Mdata);
lucasmoraeseng 0:0a68754e37e4 77 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 78 //printf("Ack is %d\r\n",Ackno);
lucasmoraeseng 0:0a68754e37e4 79
lucasmoraeseng 0:0a68754e37e4 80 m_i2c.stop();
lucasmoraeseng 0:0a68754e37e4 81
lucasmoraeseng 0:0a68754e37e4 82 wait(1);
lucasmoraeseng 0:0a68754e37e4 83
lucasmoraeseng 0:0a68754e37e4 84 if(Ackno == 0){
lucasmoraeseng 0:0a68754e37e4 85 MT--;
lucasmoraeseng 0:0a68754e37e4 86 if( MT>0){
lucasmoraeseng 0:0a68754e37e4 87 Ackno = 1;
lucasmoraeseng 0:0a68754e37e4 88 }
lucasmoraeseng 0:0a68754e37e4 89 }
lucasmoraeseng 0:0a68754e37e4 90 else
lucasmoraeseng 0:0a68754e37e4 91 {
lucasmoraeseng 0:0a68754e37e4 92 MT=0;
lucasmoraeseng 0:0a68754e37e4 93 }
lucasmoraeseng 0:0a68754e37e4 94 }
lucasmoraeseng 0:0a68754e37e4 95
lucasmoraeseng 0:0a68754e37e4 96 return Ackno;
lucasmoraeseng 0:0a68754e37e4 97 }
lucasmoraeseng 0:0a68754e37e4 98
lucasmoraeseng 0:0a68754e37e4 99 int M24CXX::Write(int EEAddres, uint8_t Data)
lucasmoraeseng 0:0a68754e37e4 100 {
lucasmoraeseng 0:0a68754e37e4 101 return write(EEAddres,Data);
lucasmoraeseng 0:0a68754e37e4 102 }
lucasmoraeseng 0:0a68754e37e4 103
lucasmoraeseng 0:0a68754e37e4 104 int M24CXX::writePage(int EEAddres, uint8_t* Data, int Length)
lucasmoraeseng 0:0a68754e37e4 105 {
lucasmoraeseng 0:0a68754e37e4 106 uint8_t MT = MaxTimes;
lucasmoraeseng 0:0a68754e37e4 107 uint8_t Ackno=1;
lucasmoraeseng 0:0a68754e37e4 108 uint8_t AckOld=1;
lucasmoraeseng 0:0a68754e37e4 109
lucasmoraeseng 0:0a68754e37e4 110 uint8_t MAd;
lucasmoraeseng 0:0a68754e37e4 111 uint8_t MHAd,MLAd;
lucasmoraeseng 0:0a68754e37e4 112
lucasmoraeseng 0:0a68754e37e4 113
lucasmoraeseng 0:0a68754e37e4 114 MAd = (0b10100000) | m_Address;
lucasmoraeseng 0:0a68754e37e4 115 MHAd = (EEAddres >> 8) & 0xff;
lucasmoraeseng 0:0a68754e37e4 116 MLAd = (EEAddres & 0xff);
lucasmoraeseng 0:0a68754e37e4 117
lucasmoraeseng 0:0a68754e37e4 118
lucasmoraeseng 0:0a68754e37e4 119 while(Ackno==1 && MT>0)
lucasmoraeseng 0:0a68754e37e4 120 {
lucasmoraeseng 0:0a68754e37e4 121 m_i2c.start();
lucasmoraeseng 0:0a68754e37e4 122 //printf("Ack is %d\r\n",Ackno);
lucasmoraeseng 0:0a68754e37e4 123 //printf("Memory Ad %d\r\n",m_Address);
lucasmoraeseng 0:0a68754e37e4 124 //printf("Try to send Memory Address %d\r\n",MAd);
lucasmoraeseng 0:0a68754e37e4 125 AckOld = m_i2c.write(MAd);
lucasmoraeseng 0:0a68754e37e4 126 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 127 //printf("Ack is %d\r\n",Ackno);
lucasmoraeseng 0:0a68754e37e4 128
lucasmoraeseng 0:0a68754e37e4 129 if(AdrLength == 16)
lucasmoraeseng 0:0a68754e37e4 130 {
lucasmoraeseng 0:0a68754e37e4 131 //printf("Try to send EE High Address %d\r\n",MHAd);
lucasmoraeseng 0:0a68754e37e4 132 AckOld = m_i2c.write(MHAd);
lucasmoraeseng 0:0a68754e37e4 133 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 134 //printf("Ack is %d\r\n",Ackno);
lucasmoraeseng 0:0a68754e37e4 135 }
lucasmoraeseng 0:0a68754e37e4 136
lucasmoraeseng 0:0a68754e37e4 137 //printf("Try to send EE Low Address %d\r\n",MLAd);
lucasmoraeseng 0:0a68754e37e4 138 AckOld = m_i2c.write(MLAd);
lucasmoraeseng 0:0a68754e37e4 139 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 140 //printf("Ack is %d\r\n",Ackno);
lucasmoraeseng 0:0a68754e37e4 141
lucasmoraeseng 0:0a68754e37e4 142 int i=0;
lucasmoraeseng 0:0a68754e37e4 143
lucasmoraeseng 0:0a68754e37e4 144 for(i=0;i<Length;i++){
lucasmoraeseng 0:0a68754e37e4 145 //printf("Try to send Data %d\r\n",Data[i]);
lucasmoraeseng 0:0a68754e37e4 146 //printf("Try to send Data %c\r\n",Data[i]);
lucasmoraeseng 0:0a68754e37e4 147 AckOld = m_i2c.write(Data[i]);
lucasmoraeseng 0:0a68754e37e4 148 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 149 //printf("Ack is %d\r\n",Ackno);
lucasmoraeseng 0:0a68754e37e4 150 }
lucasmoraeseng 0:0a68754e37e4 151 m_i2c.stop();
lucasmoraeseng 0:0a68754e37e4 152
lucasmoraeseng 0:0a68754e37e4 153 if(Ackno == 0){
lucasmoraeseng 0:0a68754e37e4 154 MT--;
lucasmoraeseng 0:0a68754e37e4 155 if( MT>0){
lucasmoraeseng 0:0a68754e37e4 156 Ackno = 1;
lucasmoraeseng 0:0a68754e37e4 157 }
lucasmoraeseng 0:0a68754e37e4 158 }
lucasmoraeseng 0:0a68754e37e4 159 else
lucasmoraeseng 0:0a68754e37e4 160 {
lucasmoraeseng 0:0a68754e37e4 161 MT=0;
lucasmoraeseng 0:0a68754e37e4 162 }
lucasmoraeseng 0:0a68754e37e4 163 }
lucasmoraeseng 0:0a68754e37e4 164
lucasmoraeseng 0:0a68754e37e4 165 return Ackno;
lucasmoraeseng 0:0a68754e37e4 166 }
lucasmoraeseng 0:0a68754e37e4 167
lucasmoraeseng 0:0a68754e37e4 168 int M24CXX::WritePage(int EEAddres, uint8_t* Data, int Length)
lucasmoraeseng 0:0a68754e37e4 169 {
lucasmoraeseng 0:0a68754e37e4 170 return writePage(EEAddres,(uint8_t*) &Data, Length);
lucasmoraeseng 0:0a68754e37e4 171 }
lucasmoraeseng 0:0a68754e37e4 172
lucasmoraeseng 0:0a68754e37e4 173
lucasmoraeseng 0:0a68754e37e4 174 uint8_t M24CXX::read(int EEAddres)
lucasmoraeseng 0:0a68754e37e4 175 {
lucasmoraeseng 0:0a68754e37e4 176 uint8_t Read;
lucasmoraeseng 0:0a68754e37e4 177 uint8_t AckOld=1, Ackno=1;
lucasmoraeseng 0:0a68754e37e4 178
lucasmoraeseng 0:0a68754e37e4 179 m_i2c.start();
lucasmoraeseng 0:0a68754e37e4 180
lucasmoraeseng 0:0a68754e37e4 181 m_i2c.write((0b10100000) | m_Address);
lucasmoraeseng 0:0a68754e37e4 182
lucasmoraeseng 0:0a68754e37e4 183 if(AdrLength == 16)
lucasmoraeseng 0:0a68754e37e4 184 {
lucasmoraeseng 0:0a68754e37e4 185 AckOld = m_i2c.write((EEAddres >> 8) & 0xff);
lucasmoraeseng 0:0a68754e37e4 186 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 187 }
lucasmoraeseng 0:0a68754e37e4 188
lucasmoraeseng 0:0a68754e37e4 189 AckOld = m_i2c.write((EEAddres & 0xff));
lucasmoraeseng 0:0a68754e37e4 190 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 191
lucasmoraeseng 0:0a68754e37e4 192 m_i2c.start();
lucasmoraeseng 0:0a68754e37e4 193
lucasmoraeseng 0:0a68754e37e4 194 m_i2c.write((0b10100001) | m_Address);
lucasmoraeseng 0:0a68754e37e4 195
lucasmoraeseng 0:0a68754e37e4 196 Read = m_i2c.read(0);
lucasmoraeseng 0:0a68754e37e4 197
lucasmoraeseng 0:0a68754e37e4 198 return Read;
lucasmoraeseng 0:0a68754e37e4 199 }
lucasmoraeseng 0:0a68754e37e4 200
lucasmoraeseng 0:0a68754e37e4 201 uint8_t M24CXX::Read(int EEAddres)
lucasmoraeseng 0:0a68754e37e4 202 {
lucasmoraeseng 0:0a68754e37e4 203 return read(EEAddres);
lucasmoraeseng 0:0a68754e37e4 204 }
lucasmoraeseng 0:0a68754e37e4 205
lucasmoraeseng 0:0a68754e37e4 206 void M24CXX::readPage(int EEAddres,int Length,uint8_t* Data)
lucasmoraeseng 0:0a68754e37e4 207 {
lucasmoraeseng 0:0a68754e37e4 208 int i;
lucasmoraeseng 0:0a68754e37e4 209 uint8_t AckOld=1, Ackno=1;
lucasmoraeseng 0:0a68754e37e4 210
lucasmoraeseng 0:0a68754e37e4 211 m_i2c.start();
lucasmoraeseng 0:0a68754e37e4 212
lucasmoraeseng 0:0a68754e37e4 213 m_i2c.write((0b10100000) | m_Address);
lucasmoraeseng 0:0a68754e37e4 214
lucasmoraeseng 0:0a68754e37e4 215 if(AdrLength == 16)
lucasmoraeseng 0:0a68754e37e4 216 {
lucasmoraeseng 0:0a68754e37e4 217 AckOld = m_i2c.write((EEAddres >> 8) & 0xff);
lucasmoraeseng 0:0a68754e37e4 218 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 219 }
lucasmoraeseng 0:0a68754e37e4 220
lucasmoraeseng 0:0a68754e37e4 221 AckOld = m_i2c.write((EEAddres & 0xff));
lucasmoraeseng 0:0a68754e37e4 222 Ackno = Ackno && AckOld;
lucasmoraeseng 0:0a68754e37e4 223
lucasmoraeseng 0:0a68754e37e4 224 m_i2c.start();
lucasmoraeseng 0:0a68754e37e4 225
lucasmoraeseng 0:0a68754e37e4 226 m_i2c.write((0b10100001) | m_Address);
lucasmoraeseng 0:0a68754e37e4 227
lucasmoraeseng 0:0a68754e37e4 228
lucasmoraeseng 0:0a68754e37e4 229 for(i=0;i<Length-1;i++){
lucasmoraeseng 0:0a68754e37e4 230 Data[i] = m_i2c.read(1);
lucasmoraeseng 0:0a68754e37e4 231 }
lucasmoraeseng 0:0a68754e37e4 232
lucasmoraeseng 0:0a68754e37e4 233 Data[Length] = m_i2c.read(0);
lucasmoraeseng 0:0a68754e37e4 234 }
lucasmoraeseng 0:0a68754e37e4 235
lucasmoraeseng 0:0a68754e37e4 236 void M24CXX::ReadPage(int EEAddres,int Length,uint8_t* Data)
lucasmoraeseng 0:0a68754e37e4 237 {
lucasmoraeseng 0:0a68754e37e4 238 readPage(EEAddres,Length,(uint8_t*)Data);
lucasmoraeseng 0:0a68754e37e4 239 }
lucasmoraeseng 0:0a68754e37e4 240
lucasmoraeseng 0:0a68754e37e4 241
lucasmoraeseng 0:0a68754e37e4 242
lucasmoraeseng 0:0a68754e37e4 243