Bonjour.
Je fais quelques manipulation avec des mémoires I2C Eeprom.
Sous réserve de lire correctement ce qu'il y a écrit dessus, j'ai à ma disposition :
1- 24C02 6
1- 24C04 (marquage très difficile à lire, mais j'en déduis que c'est une 4kb d'après les résultats que j'obtiens quand je la scanne grâce à un Sketch Arduino
Ci-joint, le sketch Arduino utilisé pour scanner les composant I2C
Pour la 24C02 6, j'obtiens :Code:// I2C Scanner // Written by Nick Gammon // Date: 20th April 2011 #include <Wire.h> void setup() { Serial.begin (9600); // Leonardo: wait for serial port to connect while (!Serial) { } Serial.println (); Serial.println ("I2C scanner. Scanning ..."); byte count = 0; Wire.begin(); for (byte i = 1; i < 120; i++) { Wire.beginTransmission (i); if (Wire.endTransmission () == 0) { Serial.print ("Found address: "); Serial.print (i, DEC); Serial.print (" (0x"); Serial.print (i, HEX); Serial.println (")"); count++; delay (1); // maybe unneeded? } // end of good response } // end of for loop Serial.println ("Done."); Serial.print ("Found "); Serial.print (count, DEC); Serial.println (" device(s)."); } // end of setup void loop() {}
1 mémoire détectée à l'adresse 0x50
Pour la 24C04, J'obtiens :
2 mémoire détectées aux adresses 0x50 et 0x51
A la lecture de différents documents sur ces Eeproms, il semble qu'il y ait différent système d'adressage.
Les 1 et 2 kb sont adressées sur 1 octet
Mais au delà de 2kb, il semblerait qu'il y a plusieurs principe.
- Soit l'adressage se fait sur 2 octets (ce qui donnerait la possibilité pour avoir jusqu'à 512kb soit 64kB ou 2^16=65536 adresses de 8bit) En effet les plus grosses Eeprom I2C disponibles semblent être les 24CL512
-Soit il y a un autre type d'adressage (celui de ma 24C04 dont j'ai du soucis avec) pour laquelle l'adressage se ferait sur 1 octet et l'Eeprom considérée comme 2 Eeprom (Aux adresses 0x50 et 0x51)
Pour lire et écrire mes Eeproms, j'ai utilisé le sketch suivant :
Pour mes Eeprom, j'ai du neutraliser la partie de code lisant le MSB:Code:#include <Wire.h> // for I2C #define i2caddr 0x51 // device address byte d=0; // data to store in or read from the EEPROM void setup() { Serial.begin(9600); // Initialize the serial line Wire.begin(); // wake up the I2C Serial.println("Writing data..."); for (int i=0; i<255; i++) { writeData(i,i); } Serial.println("DONE"); Serial.println("Reading data..."); for (int i=0; i<255; i++) { Serial.print(i); Serial.print(" : "); d=readData(i); Serial.println(d, DEC); } Serial.println("DONE"); } // writes a byte of data in memory location addr void writeData(unsigned int addr, byte data) { Wire.beginTransmission(i2caddr); // set the pointer position //Wire.write((int)(addr >> 8)); Wire.write((int)(addr & 0xFF)); Wire.write(data); Wire.endTransmission(); while(1) { Wire.beginTransmission(i2caddr); if(Wire.endTransmission() == 0)break; } } // reads a byte of data from memory location addr byte readData(unsigned int addr) { byte result; Wire.beginTransmission(i2caddr); // set the pointer position //Wire.write((int)(addr >> 8)); Wire.write((int)(addr & 0xFF)); Wire.endTransmission(1); Wire.requestFrom(i2caddr,1); // get the byte of data result = Wire.read(); return result; } void loop() { }
Et ce pour le 2 Eeproms, la 2kb et la 4kb.Code://Wire.write((int)(addr >> 8));
Et pour la 4kb, je dois changer l'adresse 0x50 en 0x51 ou vice versa pour avoir accès à tout les octets disponibles.
Je n'ai pas d'autre Eeprom avec adressage sur 2 octets (par exemple 24LC256) pour valider le Sketch de lecture écriture ci dessus.
Mais je pense que ma 24C04 est un cas "à part" et à besoin d'un adressage spécial avec un code spécifique sur 1 octet.
Or les Sketches que je trouve pour Arduino semble être tous sur le même principe de l'adressage sur 2 octets.
Merci de confirmer ou infirmer mes déductions.
-----