Bonjour, cliquez-ici pour vous inscrire et participer au forum.
  • Login:



+ Répondre à la discussion
Affichage des résultats 1 à 1 sur 1

Adressage Eeprom I2C 24 L....Sur 1 ou 2 octets ?

  1. hary

    Date d'inscription
    mai 2010
    Localisation
    Perpignan
    Messages
    390

    Adressage Eeprom I2C 24 L....Sur 1 ou 2 octets ?

    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.


     


    • Publicité




Poursuivez votre recherche :




Sur le même thème :




 

Discussions similaires

  1. I2C communication entre pic 18f4550 et EEPROM 24C64
    Par kixxxx dans le forum Électronique
    Réponses: 1
    Dernier message: 21/05/2010, 22h57
  2. Eeprom i2c
    Par Costeed dans le forum Électronique
    Réponses: 3
    Dernier message: 30/06/2009, 15h50
  3. RAM à la place EEPROM I2C
    Par flyingrock dans le forum Électronique
    Réponses: 6
    Dernier message: 13/04/2009, 21h28
  4. reception 2 octets en I2C
    Par noisyboxes dans le forum Électronique
    Réponses: 15
    Dernier message: 05/06/2007, 09h43
  5. Soucis I2C EEPROM 24C08
    Par M_Makia dans le forum Électronique
    Réponses: 0
    Dernier message: 08/03/2007, 20h45