/* i2c eeprom iras/olvasas*/
/* Macsek, 2012.09.03 */
/* v 1.02 varakozas modositasa blokkolora */
/* rengeteg (reszben szuksegtelen) hibaellenorzes */
#include "Wire.h" //I2C, azaz TWI miatt kell
#define I2C_EEPROM_CIM 0x50
#define EEPROM_LAPMERET 64 // 64 bajt 1 lap, ez a belso puffermeret is
#define EEPROM_MERET (32U*1024) //24LC256 = 32kB
#define EEPROM_IRAS_LAPATLEPES_HIBA -1
#define EEPROM_IRAS_IRAS_HIBA -2 //254
#define EEPROM_IRAS_ENDTRANSMISSION_HIBA -3
#define EEPROM_IRAS_CIMZES_HIBA -4 //252
#define EEPROM_OLVASAS_HIBA -11
#define EEPROM_OLVASAS_CIMZES_HIBA -12
#define EEPROM_OLVASAS_ENDTRANSMISSION_HIBA -13
//#define DEBUG
void setup(void)
{
byte b;
byte tarolo[64]; //
unsigned int i;
int valasz;
Serial.begin(9600);
Serial.println("EEPROM teszt, Macsek");
Wire.begin();
//teszt
#define TESZT_CIM 333
b = read_eeprom(TESZT_CIM);
Serial.print("olvasott bajt:");
Serial.println(b);
valasz = write_eeprom(TESZT_CIM, b+1);
if(valasz)
{
Serial.print("IRASHIBA!! :");
Serial.println(valasz);
}
b = read_eeprom(TESZT_CIM);
Serial.print("Iras utan olvasott bajt:");
Serial.println(b);
//// blokkokkal ugyanez
#define TESZT_BLOKK_CIM (2*EEPROM_LAPMERET)
#define TESZT_BLOKK_MERET 10
Serial.println("Bajtonkent kettovel noveljuk a teszt blokk adatait");
for(i=0; i<TESZT_BLOKK_MERET; i++)
{
valasz=read_eeprom(TESZT_BLOKK_CIM+i);
if(i)
Serial.print(", ");
Serial.print(valasz);
Serial.print("=>");
write_eeprom(TESZT_BLOKK_CIM+i, valasz+2);
valasz=read_eeprom(TESZT_BLOKK_CIM+i);
Serial.print(valasz);
}
Serial.println();
Serial.println("eeprom blokk olvasas");
valasz = read_eeprom_tobbet(TESZT_BLOKK_CIM, tarolo, TESZT_BLOKK_MERET);
if(valasz)
{
Serial.print("BLOKK OLVASAS HIBA!! :");
Serial.println(valasz);
}
for(i=0; i<TESZT_BLOKK_MERET; i++)
{
Serial.print(tarolo);
if (i<TESZT_BLOKK_MERET-1)
Serial.print(", ");
else
Serial.println("");
}
for(i=0; i<TESZT_BLOKK_MERET; i++)
if(tarolo)
//tarolo *= i+2;
tarolo++;
else
tarolo=millis(); // ha nulla volt tegyunk bele valami ertelmeset
Serial.println("==>");
for(i=0; i<TESZT_BLOKK_MERET; i++)
{
Serial.print(tarolo);
if (i<TESZT_BLOKK_MERET-1)
Serial.print(", ");
else
Serial.println("");
}
valasz = write_eeprom_lap(TESZT_BLOKK_CIM, tarolo, TESZT_BLOKK_MERET);
if(valasz)
{
Serial.print("IRASHIBA!! :");
Serial.println(valasz);
}
Serial.println("eeprom blokk iras utani ujraolvasas");
valasz = read_eeprom_tobbet(TESZT_BLOKK_CIM, tarolo, TESZT_BLOKK_MERET);
if(valasz)
{
Serial.print("BLOKK OLVASAS HIBA!! :");
Serial.println(valasz);
}
for(i=0; i<TESZT_BLOKK_MERET; i++)
{
Serial.print(tarolo);
if (i<TESZT_BLOKK_MERET-1)
Serial.print(", ");
else
Serial.println("\n");
}
;
}
void loop(void)
{
;
}
byte read_eeprom(unsigned int cim)
{
byte valaszkod=0;
Wire.beginTransmission(I2C_EEPROM_CIM);
if( !Wire.write(cim>>8) )
{
valaszkod = EEPROM_OLVASAS_CIMZES_HIBA;
}
else if( !Wire.write(cim&0xff) )
{
valaszkod = EEPROM_OLVASAS_CIMZES_HIBA;
}
else if(Wire.endTransmission())
{
valaszkod = EEPROM_OLVASAS_ENDTRANSMISSION_HIBA;
}
// hiba lehet 1 cimre nem valaszolt 2 adatra nem valaszolt?
// lehetne egy globalis valtozoval jelezni vagy egy cim szerint atadott parameterben
Wire.requestFrom(I2C_EEPROM_CIM, 1); // // requestFrom nem ad hibakodot
// requestFrom mar beolvasta, csak akkor jott tovabb
// while( !Wire.available() ) // kivarjuk, meg ha blokkol is
// ;
#ifdef DEBUG
if(valaszkod)
{
Serial.print("read_eeprom(");
Serial.print(cim);
Serial.print(") : HIBA!!! : ");
Serial.println((int)valaszkod);
}
#endif
return( Wire.read() ); // read nem ad hibakodot
}
byte write_eeprom(unsigned int cim, byte kiirando)
{
byte valaszkod=0;
Wire.beginTransmission(I2C_EEPROM_CIM);
if( !Wire.write(cim>>8) )
{
valaszkod = EEPROM_IRAS_CIMZES_HIBA;
}
else if( !Wire.write(cim&0xff) )
{
valaszkod = EEPROM_IRAS_CIMZES_HIBA;
}
else if( !Wire.write(kiirando) )
{
valaszkod = EEPROM_IRAS_IRAS_HIBA;
}
else if(Wire.endTransmission())
{
valaszkod = EEPROM_IRAS_ENDTRANSMISSION_HIBA;
}
if(valaszkod == 0) // nem volt hiba
delay(5);
return valaszkod;
}
// max 32 byte olvashato egyszerre: Wire.h, twi.h
byte read_eeprom_tobbet(unsigned int cim, byte *beolvasohely, unsigned int olvasando_db)
{
byte valaszkod=0;
unsigned int i;
Wire.beginTransmission(I2C_EEPROM_CIM);
if( !Wire.write(cim>>8) )
{
valaszkod = EEPROM_OLVASAS_CIMZES_HIBA;
}
else if( !Wire.write(cim&0xff) )
{
valaszkod = EEPROM_OLVASAS_CIMZES_HIBA;
}
else if(Wire.endTransmission())
{
valaszkod = EEPROM_OLVASAS_ENDTRANSMISSION_HIBA;
}
if(valaszkod == 0) // nincs hiba a cimzesnel
{
//if(Wire.requestFrom(I2C_EEPROM_CIM, olvasando_db) != olvasando_db) // nem dokumentalt, hagyjuk inkabb
Wire.requestFrom(I2C_EEPROM_CIM, olvasando_db); // beolvassa az osszes adatot aztan tovabbmegy
// azt az esetet nem kezeltuk ha NACK miatt abbamarad a beolvasas
// available() megmondhatna, h annyi bajt jott-e be
for(i=0; i<olvasando_db; i++)
{
// nem kell, mert mar tudjuk, h bejott az osszes kert adat
// while( !Wire.available() ) // kivarjuk, meg ha blokkol is
// ;
beolvasohely = Wire.read(); // beolvasas bajtonkent
#ifdef DEBUG
//if(valaszkod)
{
Serial.print(beolvasohely);
if(i<olvasando_db-1) Serial.print(", ");
else Serial.println();
}
#endif
} // for
} // if valaszkod
#ifdef DEBUG
//if(valaszkod)
{
Serial.print("read_eeprom_tobbet(");
Serial.print(cim);
Serial.print(", ");
Serial.print((long)beolvasohely);
Serial.print(", ");
Serial.print(olvasando_db);
Serial.print(") : HIBA!!! : ");
Serial.println(valaszkod);
}
#endif
return( valaszkod );
}
// max 32 byte irhato egyszerre: Wire.h, twi.h
// A rutin tudNA max 64 byte kiirasat egy lapra (64 bajtos lapon belul)
byte write_eeprom_lap(unsigned int cim, byte *kiirandok, byte kiirando_db)
{
byte valaszkod = 0;
unsigned int i;
#define EEPROM_LAPMASK (0xffff - EEPROM_LAPMERET +1) // azaz (-EEPROM_LAPMERET)
if(cim&EEPROM_LAPMASK != (cim+kiirando_db)&EEPROM_LAPMASK) // Lapon belul marad?
valaszkod = EEPROM_IRAS_LAPATLEPES_HIBA;
else
{
Wire.beginTransmission(I2C_EEPROM_CIM);
if( !Wire.write(cim>>8) )
{
valaszkod = EEPROM_IRAS_CIMZES_HIBA;
}
else if( !Wire.write(cim&0xff) )
{
valaszkod = EEPROM_IRAS_CIMZES_HIBA;
}
else
{
for(i=0; i<kiirando_db; i++)
{
#ifdef debug
Serial.print(kiirandok);
Serial.print(" ");
#endif
if( !Wire.write(kiirandok[i]) ) // hibakezeles: 1=ok, 0=hiba
{
valaszkod = EEPROM_IRAS_IRAS_HIBA;
break; // ne is irjunk tovabb, mar hibas
}
}
#ifdef debug
Serial.println();
#endif
//// if (!valaszkod) // meg nem volt hiba
if(Wire.endTransmission())
valaszkod = EEPROM_IRAS_ENDTRANSMISSION_HIBA;
if(!valaszkod) // nem volt hiba
delay(5); // 5ms a max lap kiirasi ido
} // cimzes jo
} // lap atlepes
return valaszkod;
}
Reset-nyomogatás után az első futási eredmények:
Kód: Egész kijelölése
EEPROM teszt, Macsek
olvasott bajt:0
Iras utan olvasott bajt:1
Bajtonkent kettovel noveljuk a teszt blokk adatait
2=>4, 2=>4, 2=>4, 2=>4, 2=>4, 2=>4, 2=>4, 2=>4, 2=>4, 2=>4
eeprom blokk olvasas
4, 4, 4, 4, 4, 4, 4, 4, 4, 4
==>
5, 5, 5, 5, 5, 5, 5, 5, 5, 5
eeprom blokk iras utani ujraolvasas
5, 5, 5, 5, 5, 5, 5, 5, 5, 5
EEPROM teszt, Macsek
olvasott bajt:1
Iras utan olvasott bajt:2
Bajtonkent kettovel noveljuk a teszt blokk adatait
5=>7, 5=>7, 5=>7, 5=>7, 5=>7, 5=>7, 5=>7, 5=>7, 5=>7, 5=>7
eeprom blokk olvasas
7, 7, 7, 7, 7, 7, 7, 7, 7, 7
==>
8, 8, 8, 8, 8, 8, 8, 8, 8, 8
eeprom blokk iras utani ujraolvasas
8, 8, 8, 8, 8, 8, 8, 8, 8, 8
EEPROM teszt, Macsek
olvasott bajt:2
Iras utan olvasott bajt:3
Bajtonkent kettovel noveljuk a teszt blokk adatait
8=>10, 8=>10, 8=>10, 8=>10, 8=>10, 8=>10, 8=>10, 8=>10, 8=>10, 8=>10
eeprom blokk olvasas
10, 10, 10, 10, 10, 10, 10, 10, 10, 10
==>
11, 11, 11, 11, 11, 11, 11, 11, 11, 11
eeprom blokk iras utani ujraolvasas
11, 11, 11, 11, 11, 11, 11, 11, 11, 11