Jack Berkhout / EEPROM
Committer:
JackB
Date:
Wed Nov 23 16:27:46 2016 +0000
Revision:
0:dac961a38be5
Renamed read and write functions so they speak for them selves and do no longer recursively call themselves, causing hangs.; Also changed the way they return values. and added double and string handling.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JackB 0:dac961a38be5 1 #ifndef __EEPROM__H_
JackB 0:dac961a38be5 2 #define __EEPROM__H_
JackB 0:dac961a38be5 3
JackB 0:dac961a38be5 4 /***********************************************************
JackB 0:dac961a38be5 5 Author: Bernard Borredon
JackB 0:dac961a38be5 6 Date : 21 decembre 2015
JackB 0:dac961a38be5 7 Version: 1.3
JackB 0:dac961a38be5 8 - Correct write(uint32_t address, int8_t data[], uint32_t length) for eeprom >= T24C32.
JackB 0:dac961a38be5 9 Tested with 24C02, 24C08, 24C16, 24C64, 24C256, 24C512, 24C1025 on LPC1768 (mbed online and µVision V5.16a).
JackB 0:dac961a38be5 10 - Correct main test.
JackB 0:dac961a38be5 11
JackB 0:dac961a38be5 12 Date : 12 decembre 2013
JackB 0:dac961a38be5 13 Version: 1.2
JackB 0:dac961a38be5 14 - Update api documentation
JackB 0:dac961a38be5 15
JackB 0:dac961a38be5 16 Date: 11 december 2013
JackB 0:dac961a38be5 17 Version: 1.1
JackB 0:dac961a38be5 18 - Change address parameter size form uint16_t to uint32_t (error for eeprom > 24C256).
JackB 0:dac961a38be5 19 - Change size parameter size from uint16_t to uint32_t (error for eeprom > 24C256).
JackB 0:dac961a38be5 20 - Add EEPROM name as a private static const char array.
JackB 0:dac961a38be5 21 - Add function getName.
JackB 0:dac961a38be5 22 - Add a test program.
JackB 0:dac961a38be5 23
JackB 0:dac961a38be5 24 Date: 27 december 2011
JackB 0:dac961a38be5 25 Version: 1.0
JackB 0:dac961a38be5 26 ************************************************************/
JackB 0:dac961a38be5 27
JackB 0:dac961a38be5 28 // Includes
JackB 0:dac961a38be5 29 #include <string>
JackB 0:dac961a38be5 30
JackB 0:dac961a38be5 31 #include "mbed.h"
JackB 0:dac961a38be5 32
JackB 0:dac961a38be5 33 // Example
JackB 0:dac961a38be5 34 /*
JackB 0:dac961a38be5 35 #include <string>
JackB 0:dac961a38be5 36
JackB 0:dac961a38be5 37 #include "mbed.h"
JackB 0:dac961a38be5 38 #include "eeprom.h"
JackB 0:dac961a38be5 39
JackB 0:dac961a38be5 40 #define EEPROM_ADDR 0x0 // I2c EEPROM address is 0x00
JackB 0:dac961a38be5 41
JackB 0:dac961a38be5 42 #define SDA p9 // I2C SDA pin
JackB 0:dac961a38be5 43 #define SCL p10 // I2C SCL pin
JackB 0:dac961a38be5 44
JackB 0:dac961a38be5 45 #define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
JackB 0:dac961a38be5 46 #define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
JackB 0:dac961a38be5 47
JackB 0:dac961a38be5 48 DigitalOut led2(LED2);
JackB 0:dac961a38be5 49
JackB 0:dac961a38be5 50 typedef struct _MyData {
JackB 0:dac961a38be5 51 int16_t sdata;
JackB 0:dac961a38be5 52 int32_t idata;
JackB 0:dac961a38be5 53 float fdata;
JackB 0:dac961a38be5 54 } MyData;
JackB 0:dac961a38be5 55
JackB 0:dac961a38be5 56 static void myerror(std::string msg)
JackB 0:dac961a38be5 57 {
JackB 0:dac961a38be5 58 printf("Error %s\n",msg.c_str());
JackB 0:dac961a38be5 59 exit(1);
JackB 0:dac961a38be5 60 }
JackB 0:dac961a38be5 61
JackB 0:dac961a38be5 62 void eeprom_test(void)
JackB 0:dac961a38be5 63 {
JackB 0:dac961a38be5 64 EEPROM ep(SDA,SCL,EEPROM_ADDR,EEPROM::T24C64); // 24C64 eeprom with sda = p9 and scl = p10
JackB 0:dac961a38be5 65 uint8_t data[256],data_r[256];
JackB 0:dac961a38be5 66 int8_t ival;
JackB 0:dac961a38be5 67 uint16_t s;
JackB 0:dac961a38be5 68 int16_t sdata,sdata_r;
JackB 0:dac961a38be5 69 int32_t ldata[1024];
JackB 0:dac961a38be5 70 int32_t eeprom_size,max_size;
JackB 0:dac961a38be5 71 uint32_t addr;
JackB 0:dac961a38be5 72 int32_t idata,idata_r;
JackB 0:dac961a38be5 73 uint32_t i,j,k,l,t,id;
JackB 0:dac961a38be5 74 float fdata,fdata_r;
JackB 0:dac961a38be5 75 MyData md,md_r;
JackB 0:dac961a38be5 76
JackB 0:dac961a38be5 77 eeprom_size = ep.getSize();
JackB 0:dac961a38be5 78 max_size = MIN(eeprom_size,256);
JackB 0:dac961a38be5 79
JackB 0:dac961a38be5 80 printf("Test EEPROM I2C model %s of %d bytes\n\n",ep.getName(),eeprom_size);
JackB 0:dac961a38be5 81
JackB 0:dac961a38be5 82 // Test sequential read byte (max_size first bytes)
JackB 0:dac961a38be5 83 for(i = 0;i < max_size;i++) {
JackB 0:dac961a38be5 84 ep.read(i,ival);
JackB 0:dac961a38be5 85 data_r[i] = ival;
JackB 0:dac961a38be5 86 if(ep.getError() != 0)
JackB 0:dac961a38be5 87 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 88 }
JackB 0:dac961a38be5 89
JackB 0:dac961a38be5 90 printf("Test sequential read %d first bytes :\n",max_size);
JackB 0:dac961a38be5 91 for(i = 0;i < max_size/16;i++) {
JackB 0:dac961a38be5 92 for(j = 0;j < 16;j++) {
JackB 0:dac961a38be5 93 addr = i * 16 + j;
JackB 0:dac961a38be5 94 printf("%3d ",(uint8_t)data_r[addr]);
JackB 0:dac961a38be5 95 }
JackB 0:dac961a38be5 96 printf("\n");
JackB 0:dac961a38be5 97 }
JackB 0:dac961a38be5 98
JackB 0:dac961a38be5 99 // Test sequential read byte (max_size last bytes)
JackB 0:dac961a38be5 100 for(i = 0;i < max_size;i++) {
JackB 0:dac961a38be5 101 addr = eeprom_size - max_size + i;
JackB 0:dac961a38be5 102 ep.read(addr,ival);
JackB 0:dac961a38be5 103 data_r[i] = ival;
JackB 0:dac961a38be5 104 if(ep.getError() != 0)
JackB 0:dac961a38be5 105 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 106 }
JackB 0:dac961a38be5 107
JackB 0:dac961a38be5 108 printf("\nTest sequential read %d last bytes :\n",max_size);
JackB 0:dac961a38be5 109 for(i = 0;i < max_size/16;i++) {
JackB 0:dac961a38be5 110 for(j = 0;j < 16;j++) {
JackB 0:dac961a38be5 111 addr = i * 16 + j;
JackB 0:dac961a38be5 112 printf("%3d ",(uint8_t)data_r[addr]);
JackB 0:dac961a38be5 113 }
JackB 0:dac961a38be5 114 printf("\n");
JackB 0:dac961a38be5 115 }
JackB 0:dac961a38be5 116
JackB 0:dac961a38be5 117 // Test write byte (max_size first bytes)
JackB 0:dac961a38be5 118 for(i = 0;i < max_size;i++)
JackB 0:dac961a38be5 119 data[i] = i;
JackB 0:dac961a38be5 120
JackB 0:dac961a38be5 121 for(i = 0;i < max_size;i++) {
JackB 0:dac961a38be5 122 ep.write(i,(int8_t)data[i]);
JackB 0:dac961a38be5 123 if(ep.getError() != 0)
JackB 0:dac961a38be5 124 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 125 }
JackB 0:dac961a38be5 126
JackB 0:dac961a38be5 127 // Test read byte (max_size first bytes)
JackB 0:dac961a38be5 128 for(i = 0;i < max_size;i++) {
JackB 0:dac961a38be5 129 ep.read(i,(int8_t&)ival);
JackB 0:dac961a38be5 130 data_r[i] = (uint8_t)ival;
JackB 0:dac961a38be5 131 if(ep.getError() != 0)
JackB 0:dac961a38be5 132 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 133 }
JackB 0:dac961a38be5 134
JackB 0:dac961a38be5 135 printf("\nTest write and read %d first bytes :\n",max_size);
JackB 0:dac961a38be5 136 for(i = 0;i < max_size/16;i++) {
JackB 0:dac961a38be5 137 for(j = 0;j < 16;j++) {
JackB 0:dac961a38be5 138 addr = i * 16 + j;
JackB 0:dac961a38be5 139 printf("%3d ",(uint8_t)data_r[addr]);
JackB 0:dac961a38be5 140 }
JackB 0:dac961a38be5 141 printf("\n");
JackB 0:dac961a38be5 142 }
JackB 0:dac961a38be5 143
JackB 0:dac961a38be5 144 // Test current address read byte (max_size first bytes)
JackB 0:dac961a38be5 145 ep.read((uint32_t)0,(int8_t&)ival); // current address is 0
JackB 0:dac961a38be5 146 data_r[0] = (uint8_t)ival;
JackB 0:dac961a38be5 147 if(ep.getError() != 0)
JackB 0:dac961a38be5 148 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 149
JackB 0:dac961a38be5 150 for(i = 1;i < max_size;i++) {
JackB 0:dac961a38be5 151 ep.read((int8_t&)ival);
JackB 0:dac961a38be5 152 data_r[i] = (uint8_t)ival;
JackB 0:dac961a38be5 153 if(ep.getError() != 0)
JackB 0:dac961a38be5 154 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 155 }
JackB 0:dac961a38be5 156
JackB 0:dac961a38be5 157 printf("\nTest current address read %d first bytes :\n",max_size);
JackB 0:dac961a38be5 158 for(i = 0;i < max_size/16;i++) {
JackB 0:dac961a38be5 159 for(j = 0;j < 16;j++) {
JackB 0:dac961a38be5 160 addr = i * 16 + j;
JackB 0:dac961a38be5 161 printf("%3d ",(uint8_t)data_r[addr]);
JackB 0:dac961a38be5 162 }
JackB 0:dac961a38be5 163 printf("\n");
JackB 0:dac961a38be5 164 }
JackB 0:dac961a38be5 165
JackB 0:dac961a38be5 166 // Test sequential read byte (first max_size bytes)
JackB 0:dac961a38be5 167 ep.read((uint32_t)0,(int8_t *)data_r,(uint32_t) max_size);
JackB 0:dac961a38be5 168 if(ep.getError() != 0)
JackB 0:dac961a38be5 169 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 170
JackB 0:dac961a38be5 171 printf("\nTest sequential read %d first bytes :\n",max_size);
JackB 0:dac961a38be5 172 for(i = 0;i < max_size/16;i++) {
JackB 0:dac961a38be5 173 for(j = 0;j < 16;j++) {
JackB 0:dac961a38be5 174 addr = i * 16 + j;
JackB 0:dac961a38be5 175 printf("%3d ",(uint8_t)data_r[addr]);
JackB 0:dac961a38be5 176 }
JackB 0:dac961a38be5 177 printf("\n");
JackB 0:dac961a38be5 178 }
JackB 0:dac961a38be5 179
JackB 0:dac961a38be5 180 // Test write short, long, float
JackB 0:dac961a38be5 181 sdata = -15202;
JackB 0:dac961a38be5 182 addr = eeprom_size - 16;
JackB 0:dac961a38be5 183 ep.write(addr,(int16_t)sdata); // short write at address eeprom_size - 16
JackB 0:dac961a38be5 184 if(ep.getError() != 0)
JackB 0:dac961a38be5 185 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 186
JackB 0:dac961a38be5 187 idata = 45123;
JackB 0:dac961a38be5 188 addr = eeprom_size - 12;
JackB 0:dac961a38be5 189 ep.write(addr,(int32_t)idata); // long write at address eeprom_size - 12
JackB 0:dac961a38be5 190 if(ep.getError() != 0)
JackB 0:dac961a38be5 191 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 192
JackB 0:dac961a38be5 193 fdata = -12.26;
JackB 0:dac961a38be5 194 addr = eeprom_size - 8;
JackB 0:dac961a38be5 195 ep.write(addr,(float)fdata); // float write at address eeprom_size - 8
JackB 0:dac961a38be5 196 if(ep.getError() != 0)
JackB 0:dac961a38be5 197 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 198
JackB 0:dac961a38be5 199 // Test read short, long, float
JackB 0:dac961a38be5 200 printf("\nTest write and read short (%d), long (%d), float (%f) :\n",
JackB 0:dac961a38be5 201 sdata,idata,fdata);
JackB 0:dac961a38be5 202
JackB 0:dac961a38be5 203 ep.read((uint32_t)(eeprom_size - 16),(int16_t&)sdata_r);
JackB 0:dac961a38be5 204 if(ep.getError() != 0)
JackB 0:dac961a38be5 205 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 206 printf("sdata %d\n",sdata_r);
JackB 0:dac961a38be5 207
JackB 0:dac961a38be5 208 ep.read((uint32_t)(eeprom_size - 12),(int32_t&)idata_r);
JackB 0:dac961a38be5 209 if(ep.getError() != 0)
JackB 0:dac961a38be5 210 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 211 printf("idata %d\n",idata_r);
JackB 0:dac961a38be5 212
JackB 0:dac961a38be5 213 ep.read((uint32_t)(eeprom_size - 8),fdata_r);
JackB 0:dac961a38be5 214 if(ep.getError() != 0)
JackB 0:dac961a38be5 215 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 216 printf("fdata %f\n",fdata_r);
JackB 0:dac961a38be5 217
JackB 0:dac961a38be5 218 // Test read and write a structure
JackB 0:dac961a38be5 219 md.sdata = -15203;
JackB 0:dac961a38be5 220 md.idata = 45124;
JackB 0:dac961a38be5 221 md.fdata = -12.27;
JackB 0:dac961a38be5 222
JackB 0:dac961a38be5 223 ep.write((uint32_t)(eeprom_size - 32),(void *)&md,sizeof(md)); // write a structure eeprom_size - 32
JackB 0:dac961a38be5 224 if(ep.getError() != 0)
JackB 0:dac961a38be5 225 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 226
JackB 0:dac961a38be5 227 printf("\nTest write and read a structure (%d %d %f) :\n",md.sdata,md.idata,md.fdata);
JackB 0:dac961a38be5 228
JackB 0:dac961a38be5 229 ep.read((uint32_t)(eeprom_size - 32),(void *)&md_r,sizeof(md_r));
JackB 0:dac961a38be5 230 if(ep.getError() != 0)
JackB 0:dac961a38be5 231 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 232
JackB 0:dac961a38be5 233 printf("md.sdata %d\n",md_r.sdata);
JackB 0:dac961a38be5 234 printf("md.idata %d\n",md_r.idata);
JackB 0:dac961a38be5 235 printf("md.fdata %f\n",md_r.fdata);
JackB 0:dac961a38be5 236
JackB 0:dac961a38be5 237 // Test read and write of an array of the first max_size bytes
JackB 0:dac961a38be5 238 for(i = 0;i < max_size;i++)
JackB 0:dac961a38be5 239 data[i] = max_size - i - 1;
JackB 0:dac961a38be5 240
JackB 0:dac961a38be5 241 ep.write((uint32_t)(0),data,(uint32_t)max_size);
JackB 0:dac961a38be5 242 if(ep.getError() != 0)
JackB 0:dac961a38be5 243 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 244
JackB 0:dac961a38be5 245 ep.read((uint32_t)(0),data_r,(uint32_t)max_size);
JackB 0:dac961a38be5 246 if(ep.getError() != 0)
JackB 0:dac961a38be5 247 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 248
JackB 0:dac961a38be5 249 printf("\nTest write and read an array of the first %d bytes :\n",max_size);
JackB 0:dac961a38be5 250 for(i = 0;i < max_size/16;i++) {
JackB 0:dac961a38be5 251 for(j = 0;j < 16;j++) {
JackB 0:dac961a38be5 252 addr = i * 16 + j;
JackB 0:dac961a38be5 253 printf("%3d ",(uint8_t)data_r[addr]);
JackB 0:dac961a38be5 254 }
JackB 0:dac961a38be5 255 printf("\n");
JackB 0:dac961a38be5 256 }
JackB 0:dac961a38be5 257 printf("\n");
JackB 0:dac961a38be5 258
JackB 0:dac961a38be5 259 // Test write and read an array of int32
JackB 0:dac961a38be5 260 s = eeprom_size / 4; // size of eeprom in int32
JackB 0:dac961a38be5 261 int ldata_size = sizeof(ldata) / 4; // size of data array in int32
JackB 0:dac961a38be5 262 l = s / ldata_size; // loop index
JackB 0:dac961a38be5 263
JackB 0:dac961a38be5 264 // size of read / write in bytes
JackB 0:dac961a38be5 265 t = eeprom_size;
JackB 0:dac961a38be5 266 if(t > ldata_size * 4)
JackB 0:dac961a38be5 267 t = ldata_size * 4;
JackB 0:dac961a38be5 268
JackB 0:dac961a38be5 269 printf("Test write and read an array of %d int32 (write entire memory) :\n",t/4);
JackB 0:dac961a38be5 270
JackB 0:dac961a38be5 271 // Write entire eeprom
JackB 0:dac961a38be5 272 if(l) {
JackB 0:dac961a38be5 273 for(k = 0;k < l;k++) {
JackB 0:dac961a38be5 274 for(i = 0;i < ldata_size;i++)
JackB 0:dac961a38be5 275 ldata[i] = ldata_size * k + i;
JackB 0:dac961a38be5 276
JackB 0:dac961a38be5 277 addr = k * ldata_size * 4;
JackB 0:dac961a38be5 278 ep.write(addr,(void *)ldata,t);
JackB 0:dac961a38be5 279 if(ep.getError() != 0)
JackB 0:dac961a38be5 280 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 281 }
JackB 0:dac961a38be5 282
JackB 0:dac961a38be5 283 printf("Write OK\n");
JackB 0:dac961a38be5 284
JackB 0:dac961a38be5 285 // Read entire eeprom
JackB 0:dac961a38be5 286 id = 0;
JackB 0:dac961a38be5 287 for(k = 0;k < l;k++) {
JackB 0:dac961a38be5 288 addr = k * ldata_size * 4;
JackB 0:dac961a38be5 289 ep.read(addr,(void *)ldata,t);
JackB 0:dac961a38be5 290 if(ep.getError() != 0)
JackB 0:dac961a38be5 291 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 292
JackB 0:dac961a38be5 293 // format outputs with 8 words rows
JackB 0:dac961a38be5 294 for(i = 0;i < ldata_size / 8;i++) {
JackB 0:dac961a38be5 295 id++;
JackB 0:dac961a38be5 296 printf("%4d ",id);
JackB 0:dac961a38be5 297 for(j = 0;j < 8;j++) {
JackB 0:dac961a38be5 298 addr = i * 8 + j;
JackB 0:dac961a38be5 299 printf("%5d ",ldata[addr]);
JackB 0:dac961a38be5 300 }
JackB 0:dac961a38be5 301 printf("\n");
JackB 0:dac961a38be5 302 }
JackB 0:dac961a38be5 303 }
JackB 0:dac961a38be5 304 }
JackB 0:dac961a38be5 305 else {
JackB 0:dac961a38be5 306 for(i = 0;i < s;i++)
JackB 0:dac961a38be5 307 ldata[i] = i;
JackB 0:dac961a38be5 308
JackB 0:dac961a38be5 309 addr = 0;
JackB 0:dac961a38be5 310 ep.write(addr,(void *)ldata,t);
JackB 0:dac961a38be5 311 if(ep.getError() != 0)
JackB 0:dac961a38be5 312 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 313
JackB 0:dac961a38be5 314 printf("Write OK\n");
JackB 0:dac961a38be5 315
JackB 0:dac961a38be5 316 // Read entire eeprom
JackB 0:dac961a38be5 317 id = 0;
JackB 0:dac961a38be5 318
JackB 0:dac961a38be5 319 addr = 0;
JackB 0:dac961a38be5 320 ep.read(addr,(void *)ldata,t);
JackB 0:dac961a38be5 321 if(ep.getError() != 0)
JackB 0:dac961a38be5 322 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 323
JackB 0:dac961a38be5 324 // format outputs with 8 words rows
JackB 0:dac961a38be5 325 for(i = 0;i < s / 8;i++) {
JackB 0:dac961a38be5 326 id++;
JackB 0:dac961a38be5 327 printf("%4d ",id);
JackB 0:dac961a38be5 328 for(j = 0;j < 8;j++) {
JackB 0:dac961a38be5 329 addr = i * 8 + j;
JackB 0:dac961a38be5 330 printf("%5d ",ldata[addr]);
JackB 0:dac961a38be5 331 }
JackB 0:dac961a38be5 332 printf("\n");
JackB 0:dac961a38be5 333 }
JackB 0:dac961a38be5 334 }
JackB 0:dac961a38be5 335
JackB 0:dac961a38be5 336 // clear eeprom
JackB 0:dac961a38be5 337 printf("\nClear eeprom\n");
JackB 0:dac961a38be5 338
JackB 0:dac961a38be5 339 ep.clear();
JackB 0:dac961a38be5 340 if(ep.getError() != 0)
JackB 0:dac961a38be5 341 myerror(ep.getErrorMessage());
JackB 0:dac961a38be5 342
JackB 0:dac961a38be5 343 printf("End\n");
JackB 0:dac961a38be5 344
JackB 0:dac961a38be5 345 }
JackB 0:dac961a38be5 346
JackB 0:dac961a38be5 347 int main()
JackB 0:dac961a38be5 348 {
JackB 0:dac961a38be5 349
JackB 0:dac961a38be5 350 eeprom_test();
JackB 0:dac961a38be5 351
JackB 0:dac961a38be5 352 return(0);
JackB 0:dac961a38be5 353 }
JackB 0:dac961a38be5 354 */
JackB 0:dac961a38be5 355
JackB 0:dac961a38be5 356 // App address asignments
JackB 0:dac961a38be5 357 // uint8_t 0x0000
JackB 0:dac961a38be5 358 #define EEPROM_UINT8_BASE 0x0000
JackB 0:dac961a38be5 359 #define EEPROM_RUN_HOUR 0x0008
JackB 0:dac961a38be5 360 #define EEPROM_TOTAL_RUN_HOURS 0x000C
JackB 0:dac961a38be5 361
JackB 0:dac961a38be5 362 #define EEPROM_BT_NAME 0x0010
JackB 0:dac961a38be5 363 #define EEPROM_BT_PSWD 0x0020
JackB 0:dac961a38be5 364
JackB 0:dac961a38be5 365 #define EEPROM_OUTPUT_GROUPS 0x0040
JackB 0:dac961a38be5 366 #define EEPROM_OUTPUT_WIRES 0x0100
JackB 0:dac961a38be5 367
JackB 0:dac961a38be5 368 // uint16_t 0x0100
JackB 0:dac961a38be5 369 #define EEPROM_UINT16_BASE 0x0200
JackB 0:dac961a38be5 370 // uint32_t 0x0200
JackB 0:dac961a38be5 371 #define EEPROM_UINT32_BASE 0x0400
JackB 0:dac961a38be5 372 // float 0x0300
JackB 0:dac961a38be5 373 #define EEPROM_FLOAT_BASE 0x0600
JackB 0:dac961a38be5 374 #define EEPROM_DMX512_RGB_CAL 0x0600 // 3 * channels
JackB 0:dac961a38be5 375 // float 0x0300
JackB 0:dac961a38be5 376 #define EEPROM_ADC0_ACS712_BASE 0x0800
JackB 0:dac961a38be5 377
JackB 0:dac961a38be5 378
JackB 0:dac961a38be5 379 // Defines
JackB 0:dac961a38be5 380 #define EEPROM_Address 0xa0
JackB 0:dac961a38be5 381
JackB 0:dac961a38be5 382 #define EEPROM_NoError 0x00
JackB 0:dac961a38be5 383 #define EEPROM_BadAddress 0x01
JackB 0:dac961a38be5 384 #define EEPROM_I2cError 0x02
JackB 0:dac961a38be5 385 #define EEPROM_ParamError 0x03
JackB 0:dac961a38be5 386 #define EEPROM_OutOfRange 0x04
JackB 0:dac961a38be5 387 #define EEPROM_MallocError 0x05
JackB 0:dac961a38be5 388
JackB 0:dac961a38be5 389 #define EEPROM_MaxError 6
JackB 0:dac961a38be5 390
JackB 0:dac961a38be5 391 static std::string _ErrorMessageEEPROM[EEPROM_MaxError] = {
JackB 0:dac961a38be5 392 "",
JackB 0:dac961a38be5 393 "Bad chip address",
JackB 0:dac961a38be5 394 "I2C error (nack)",
JackB 0:dac961a38be5 395 "Invalid parameter",
JackB 0:dac961a38be5 396 "Data address out of range",
JackB 0:dac961a38be5 397 "Memory allocation error"
JackB 0:dac961a38be5 398 };
JackB 0:dac961a38be5 399
JackB 0:dac961a38be5 400 /** EEPROM Class
JackB 0:dac961a38be5 401 */
JackB 0:dac961a38be5 402 class EEPROM {
JackB 0:dac961a38be5 403
JackB 0:dac961a38be5 404 public:
JackB 0:dac961a38be5 405 enum TypeEeprom {T24C01=128,T24C02=256,T24C04=512,T24C08=1024,T24C16=2048,
JackB 0:dac961a38be5 406 T24C32=4096,T24C64=8192,T24C128=16384,T24C256=32768,
JackB 0:dac961a38be5 407 T24C512=65536,T24C1024=131072,T24C1025=131073} Type;
JackB 0:dac961a38be5 408
JackB 0:dac961a38be5 409 /**
JackB 0:dac961a38be5 410 * Constructor, initialize the eeprom on i2c interface.
JackB 0:dac961a38be5 411 * @param sda sda i2c pin (PinName)
JackB 0:dac961a38be5 412 * @param scl scl i2c pin (PinName)
JackB 0:dac961a38be5 413 * @param address eeprom address, according to eeprom type (uint8_t)
JackB 0:dac961a38be5 414 * @param type eeprom type (TypeEeprom)
JackB 0:dac961a38be5 415 * @return none
JackB 0:dac961a38be5 416 */
JackB 0:dac961a38be5 417 EEPROM(PinName sda, PinName scl, uint8_t address, TypeEeprom type);
JackB 0:dac961a38be5 418 // EEPROM(I2C* i2c = 0, uint8_t address, TypeEeprom type);
JackB 0:dac961a38be5 419
JackB 0:dac961a38be5 420 /**
JackB 0:dac961a38be5 421 * Write anything (use the page write mode)
JackB 0:dac961a38be5 422 * @param address start address (uint32_t)
JackB 0:dac961a38be5 423 * @param data data to write (void *)
JackB 0:dac961a38be5 424 * @param size number of bytes to write (uint32_t)
JackB 0:dac961a38be5 425 * @return none
JackB 0:dac961a38be5 426 */
JackB 0:dac961a38be5 427 void write_data(uint32_t address, void *data, uint32_t size);
JackB 0:dac961a38be5 428
JackB 0:dac961a38be5 429 /**
JackB 0:dac961a38be5 430 * Write array of bytes (use the page mode)
JackB 0:dac961a38be5 431 * @param address start address (uint32_t)
JackB 0:dac961a38be5 432 * @param data bytes array to write (int8_t[])
JackB 0:dac961a38be5 433 * @param size number of bytes to write (uint32_t)
JackB 0:dac961a38be5 434 * @return none
JackB 0:dac961a38be5 435 */
JackB 0:dac961a38be5 436 void write_data_array(uint32_t address, uint8_t data[], uint32_t size);
JackB 0:dac961a38be5 437
JackB 0:dac961a38be5 438
JackB 0:dac961a38be5 439 /**
JackB 0:dac961a38be5 440 * Random read anything
JackB 0:dac961a38be5 441 * @param address start address (uint32_t)
JackB 0:dac961a38be5 442 * @param data data to read (void *)
JackB 0:dac961a38be5 443 * @param size number of bytes to read (uint32_t)
JackB 0:dac961a38be5 444 * @return none
JackB 0:dac961a38be5 445 */
JackB 0:dac961a38be5 446 void read_data(uint32_t address, void *data, uint32_t size);
JackB 0:dac961a38be5 447
JackB 0:dac961a38be5 448 /**
JackB 0:dac961a38be5 449 * Sequential read byte
JackB 0:dac961a38be5 450 * @param address start address (uint32_t)
JackB 0:dac961a38be5 451 * @param data bytes array to read (int8_t[]&)
JackB 0:dac961a38be5 452 * @param size number of bytes to read (uint32_t)
JackB 0:dac961a38be5 453 * @return none
JackB 0:dac961a38be5 454 */
JackB 0:dac961a38be5 455 void read_data_array(uint32_t address, uint8_t *data, uint32_t size);
JackB 0:dac961a38be5 456
JackB 0:dac961a38be5 457
JackB 0:dac961a38be5 458
JackB 0:dac961a38be5 459 /**
JackB 0:dac961a38be5 460 * Random read byte
JackB 0:dac961a38be5 461 * @param address start address (uint32_t)
JackB 0:dac961a38be5 462 * @param data byte to read (int8_t&)
JackB 0:dac961a38be5 463 * @return none
JackB 0:dac961a38be5 464 */
JackB 0:dac961a38be5 465 void read_uint8_t(uint32_t address, uint8_t& data);
JackB 0:dac961a38be5 466
JackB 0:dac961a38be5 467 uint8_t read_uint8_t(uint32_t address);
JackB 0:dac961a38be5 468
JackB 0:dac961a38be5 469 /**
JackB 0:dac961a38be5 470 * Random read short
JackB 0:dac961a38be5 471 * @param address start address (uint32_t)
JackB 0:dac961a38be5 472 * @param data short to read (int16_t&)
JackB 0:dac961a38be5 473 * @return none
JackB 0:dac961a38be5 474 */
JackB 0:dac961a38be5 475 uint16_t read_uint16_t(uint32_t address);
JackB 0:dac961a38be5 476
JackB 0:dac961a38be5 477 /**
JackB 0:dac961a38be5 478 * Random read long
JackB 0:dac961a38be5 479 * @param address start address (uint32_t)
JackB 0:dac961a38be5 480 * @param data long to read (int32_t&)
JackB 0:dac961a38be5 481 * @return uint32_t
JackB 0:dac961a38be5 482 */
JackB 0:dac961a38be5 483 uint32_t read_uint32_t(uint32_t address);
JackB 0:dac961a38be5 484
JackB 0:dac961a38be5 485 /**
JackB 0:dac961a38be5 486 * Random read float
JackB 0:dac961a38be5 487 * @param address start address (uint32_t)
JackB 0:dac961a38be5 488 * @param data float to read (float&)
JackB 0:dac961a38be5 489 * @return float
JackB 0:dac961a38be5 490 */
JackB 0:dac961a38be5 491 float read_float(uint32_t address);
JackB 0:dac961a38be5 492
JackB 0:dac961a38be5 493 /**
JackB 0:dac961a38be5 494 * Random read double
JackB 0:dac961a38be5 495 * @param address start address (uint32_t)
JackB 0:dac961a38be5 496 * @param data double to read (double&)
JackB 0:dac961a38be5 497 * @return double
JackB 0:dac961a38be5 498 */
JackB 0:dac961a38be5 499 double read_double(uint32_t address);
JackB 0:dac961a38be5 500
JackB 0:dac961a38be5 501 /**
JackB 0:dac961a38be5 502 * Random read string
JackB 0:dac961a38be5 503 * @param address start address (uint32_t)
JackB 0:dac961a38be5 504 * @param data char * to read (char *)
JackB 0:dac961a38be5 505 * @return char *
JackB 0:dac961a38be5 506 */
JackB 0:dac961a38be5 507 char * read_string(uint32_t address);
JackB 0:dac961a38be5 508
JackB 0:dac961a38be5 509 /**
JackB 0:dac961a38be5 510 * Current address read byte
JackB 0:dac961a38be5 511 * @param data byte to read (int8_t&)
JackB 0:dac961a38be5 512 * @return none
JackB 0:dac961a38be5 513 */
JackB 0:dac961a38be5 514 void read(uint8_t& data);
JackB 0:dac961a38be5 515
JackB 0:dac961a38be5 516 /**
JackB 0:dac961a38be5 517 * Write byte
JackB 0:dac961a38be5 518 * @param address start address (uint32_t)
JackB 0:dac961a38be5 519 * @param data byte to write (int8_t)
JackB 0:dac961a38be5 520 * @return none
JackB 0:dac961a38be5 521 */
JackB 0:dac961a38be5 522 void write_uint8_t(uint32_t address, uint8_t data);
JackB 0:dac961a38be5 523
JackB 0:dac961a38be5 524 /**
JackB 0:dac961a38be5 525 * Write short
JackB 0:dac961a38be5 526 * @param address start address (uint32_t)
JackB 0:dac961a38be5 527 * @param data short to write (int16_t)
JackB 0:dac961a38be5 528 * @return none
JackB 0:dac961a38be5 529 */
JackB 0:dac961a38be5 530 void write_uint16_t(uint32_t address, uint16_t data);
JackB 0:dac961a38be5 531
JackB 0:dac961a38be5 532 /**
JackB 0:dac961a38be5 533 * Write long
JackB 0:dac961a38be5 534 * @param address start address (uint32_t)
JackB 0:dac961a38be5 535 * @param data long to write (int32_t)
JackB 0:dac961a38be5 536 * @return none
JackB 0:dac961a38be5 537 */
JackB 0:dac961a38be5 538 void write_uint32_t(uint32_t address, uint32_t data);
JackB 0:dac961a38be5 539
JackB 0:dac961a38be5 540 /**
JackB 0:dac961a38be5 541 * Write float
JackB 0:dac961a38be5 542 * @param address start address (uint32_t)
JackB 0:dac961a38be5 543 * @param data float to write (float)
JackB 0:dac961a38be5 544 * @return none
JackB 0:dac961a38be5 545 */
JackB 0:dac961a38be5 546 void write_float(uint32_t address, float data);
JackB 0:dac961a38be5 547
JackB 0:dac961a38be5 548 /**
JackB 0:dac961a38be5 549 * Write double
JackB 0:dac961a38be5 550 * @param address start address (uint32_t)
JackB 0:dac961a38be5 551 * @param data double to write (double)
JackB 0:dac961a38be5 552 * @return none
JackB 0:dac961a38be5 553 */
JackB 0:dac961a38be5 554 void write_double(uint32_t address, double data);
JackB 0:dac961a38be5 555
JackB 0:dac961a38be5 556 /**
JackB 0:dac961a38be5 557 * Write * data
JackB 0:dac961a38be5 558 * @param address start address (uint32_t)
JackB 0:dac961a38be5 559 * @param data * data to write (* data)
JackB 0:dac961a38be5 560 * @return none
JackB 0:dac961a38be5 561 */
JackB 0:dac961a38be5 562 void write_string(uint32_t address, char * data);
JackB 0:dac961a38be5 563
JackB 0:dac961a38be5 564
JackB 0:dac961a38be5 565
JackB 0:dac961a38be5 566
JackB 0:dac961a38be5 567
JackB 0:dac961a38be5 568
JackB 0:dac961a38be5 569
JackB 0:dac961a38be5 570
JackB 0:dac961a38be5 571 /**
JackB 0:dac961a38be5 572 * Wait eeprom ready
JackB 0:dac961a38be5 573 * @param none
JackB 0:dac961a38be5 574 * @return none
JackB 0:dac961a38be5 575 */
JackB 0:dac961a38be5 576 void ready(void);
JackB 0:dac961a38be5 577
JackB 0:dac961a38be5 578 /**
JackB 0:dac961a38be5 579 * Get eeprom size in bytes
JackB 0:dac961a38be5 580 * @param none
JackB 0:dac961a38be5 581 * @return size in bytes (uint32_t)
JackB 0:dac961a38be5 582 */
JackB 0:dac961a38be5 583 uint32_t getSize(void);
JackB 0:dac961a38be5 584
JackB 0:dac961a38be5 585 /**
JackB 0:dac961a38be5 586 * Get eeprom name
JackB 0:dac961a38be5 587 * @param none
JackB 0:dac961a38be5 588 * @return name (const char*)
JackB 0:dac961a38be5 589 */
JackB 0:dac961a38be5 590 const char* getName(void);
JackB 0:dac961a38be5 591
JackB 0:dac961a38be5 592 /**
JackB 0:dac961a38be5 593 * Clear eeprom (write with 0)
JackB 0:dac961a38be5 594 * @param none
JackB 0:dac961a38be5 595 * @return none
JackB 0:dac961a38be5 596 */
JackB 0:dac961a38be5 597 void clear(void);
JackB 0:dac961a38be5 598
JackB 0:dac961a38be5 599 /**
JackB 0:dac961a38be5 600 * Get the current error number (EEPROM_NoError if no error)
JackB 0:dac961a38be5 601 * @param none
JackB 0:dac961a38be5 602 * @return none
JackB 0:dac961a38be5 603 */
JackB 0:dac961a38be5 604 uint8_t getError(void);
JackB 0:dac961a38be5 605
JackB 0:dac961a38be5 606 /**
JackB 0:dac961a38be5 607 * Get current error message
JackB 0:dac961a38be5 608 * @param none
JackB 0:dac961a38be5 609 * @return current error message(std::string)
JackB 0:dac961a38be5 610 */
JackB 0:dac961a38be5 611 std::string getErrorMessage(void)
JackB 0:dac961a38be5 612 {
JackB 0:dac961a38be5 613 return(_ErrorMessageEEPROM[_errnum]);
JackB 0:dac961a38be5 614 }
JackB 0:dac961a38be5 615
JackB 0:dac961a38be5 616 protected:
JackB 0:dac961a38be5 617 // *I2C _i2c;
JackB 0:dac961a38be5 618
JackB 0:dac961a38be5 619 //---------- local variables ----------
JackB 0:dac961a38be5 620 private:
JackB 0:dac961a38be5 621 I2C _i2c; // Local i2c communication interface instance
JackB 0:dac961a38be5 622 int _address; // Local i2c address
JackB 0:dac961a38be5 623 uint8_t _errnum; // Error number
JackB 0:dac961a38be5 624 TypeEeprom _type; // EEPROM type
JackB 0:dac961a38be5 625 uint8_t _page_write; // Page write size
JackB 0:dac961a38be5 626 uint8_t _page_number; // Number of page
JackB 0:dac961a38be5 627 uint32_t _size; // Size in bytes
JackB 0:dac961a38be5 628 bool checkAddress(uint32_t address); // Check address range
JackB 0:dac961a38be5 629 static const char * const _name[]; // eeprom name
JackB 0:dac961a38be5 630
JackB 0:dac961a38be5 631 char buffer[32];
JackB 0:dac961a38be5 632 //-------------------------------------
JackB 0:dac961a38be5 633 };
JackB 0:dac961a38be5 634 #endif