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

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() {}
Pour la 24C02 6, j'obtiens :
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 :

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()
{
}
Pour mes Eeprom, j'ai du neutraliser la partie de code lisant le MSB:
Code:
//Wire.write((int)(addr >> 8));
Et ce pour le 2 Eeproms, la 2kb et la 4kb.

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.