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.

Committer:
JackB
Date:
Wed Nov 23 16:28:46 2016 +0000
Revision:
1:b90c5754d8db
Parent:
0:dac961a38be5
Updated comment

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