[Résolu ] Lecture/Ecriture sur une EEPROM externe .. qui marche pas

Bonsoir,
je teste en ce moment en vue d’intégration de la sauvegarde sur une EEPROM

j’ai récupéré un sketch ICI
je l’ai adapté à mon cas et lorsque je le lance
en lecture il me donne comme valeur enregistrée pour tout les octets de 255!

pourtant en théorie, j’enregistre des nombres aléatoires

pourriez vous m’aider ?
voici le code que j’ai modifié: j’ai gardé la structure d’écriture et de lecture

/*
 * sketch test lecture ecriture EEPROM externe en adresse 0x58
 * 
 * 08/08/19 23h
 * ne fonctionne pas pourquoi? en lecture = toujours 255!!
 */
#include <Wire.h>    
#define disk1 0x58  //Address of 24LC256 eeprom chip
   byte b;
  unsigned int i ;
  byte valeur;
void setup(void)
{
  Serial.begin(9600);
  Wire.begin();  
  unsigned int address = 0;
  randomSeed(analogRead(0));

  Serial.print(" debut ecriture sur l eeprom");
   for ( i = 0; i < 56; i++)
  {  b=random(0, 250);
    Serial.print(" Ecriture du Byte ");
    Serial.print(i);
    Serial.print(" = ");
    Serial.print(b);
    writeEEPROM(disk1, i, b);
    Serial.print(" valeur ecrite: ");
  Serial.println(readEEPROM(disk1, i));
  delay(100);
  }
  
for (i = 0; i < 56; i++)
  {

    Serial.print("lecture : ");
    Serial.print(i);
    Serial.print(" = ");
    Serial.println(readEEPROM(disk1, i));
    delay(100);
  
  
  }
  
}
 
void loop()
{
  
}

void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) 
{
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8));   // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.write(data);
  Wire.endTransmission();
 
  delay(5);
}
 
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) 
{
  byte rdata = 0xFF;
 
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8));   // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.endTransmission();
 
  Wire.requestFrom(deviceaddress,1);
 
  if (Wire.read()) rdata = Wire.read();
 
  return rdata;
}

un extrait de l’affichage serial

23:49:24.319 ->  Ecriture du Byte 54 = 100 valeur ecrite: 255
23:49:24.427 ->  Ecriture du Byte 55 = 34 valeur ecrite: 255
23:49:24.535 -> lecture : 0 = 255
23:49:24.607 -> lecture : 1 = 255
23:49:24.715 -> lecture : 2 = 255
23:49:24.823 -> lecture : 3 = 255 etc ..

mon EEPROM est bien reconnu en 0x58

merci

l'adresse i2c du 24lc256 est de 0x50 a 0x57, adresse 0x58 n'est pas valide pour une 24lc256

merci elektrax,
mais l'adresse m'a été trouvée par le sketch ICI
et si je modifie physiquement l'adresse sur mon EEPROM, le testeur le retrouve bien.
par contre je ne suis pas certain que ce soit une 24LC256.. c'est une puce sur un petit CI acheté chez ali

Mon EEPROM

je regarde ca ce soir et je remet la bonne ref.

Merci

Si tu as un module RTC DS3231 Il y a une eeprom dessus dans 99% des cas.

hello
tu as bien mis le résistance de pullup I2C et enlevé la protection en écriture ?

dfgh:
hello
tu as bien mis le résistance de pullup I2C et enlevé la protection en écriture ?

Résistance de 10ko sur les 2 lignes sda et scl ok.
Protection en ecriture ?? Rien vu ..c'est oú ?

Édit:
Ha oui ,pardon.. WP.. il est bien positionné.

68tjs:
Si tu as un module RTC DS3231 Il y a une eeprom dessus dans 99% des cas.

Ha bon? Le sketch ne le Voit pas. Il utilise La meme adresse? Sinon, comment on l'utilise ?

Les modules DS1302; DS1307; DS3231 contiennent très souvent deux boîtiers noir.
Le premier boîtier est celui de la RTC.
Le deuxième boîtier est une EEPROM : la référence est gravée sur le boîtier, avec la référence on peut trouver sa capacité.
Cette EEPROM devait, je pense, servir à enregistrer les dates de remise à l'heure.

Force est de constater qu'elle est completement ignorée des auteurs de bibliothèques.

Arzou:
Ha bon? Le sketch ne le Voit pas. Il utilise La meme adresse? Sinon, comment on l'utilise ?

Le sketch ne le Voit pas.
Ben c'est parce que les auteurs d'exemple n'ont jamais vu son utilité.

Il utilise La meme adresse?
Évidement non. En I2C il ne peut y avoir 2 composants avec la même adresse.
Pour trouver l'adresse le plus simple est d'utiliser un programme scanner I2C.

Sur un même réseau I2C on peut mettre 8 boîtiers EEPROM : 3 bits de l'adresse sont configurables (A0 A1 A2).
Rappel : on ne peut mettre qu'une seule RTC, toutes les RTC ont la même adresse unique.

Sinon, comment on l'utilise ?
Je ne sais pas s'il existe des bibliothèques pour gérer une EEPROM I2C, il faudrait faire une recherche sur la référence, je n'ai pas de modules RTC actuellement sous la main donc je ne connais pas la référence..

Sinon c'est expliqué dans les datasheets,
C'est une histoire de sélection de numéro de registre et d'écriture ou de lecture dans le registre sélectionné.
Lire ou écrire ne doit pas être difficile, savoir retrouver une information particulière au milieu des autres demande de mettre en place une gestion.

68tjs:
Il utilise La meme adresse?
Évidement non. En I2C il ne peut y avoir 2 composants avec la même adresse.
Pour trouver l'adresse le plus simple est d'utiliser un programme scanner I2C.

apparemment non, sur mon module rtc, il n'y a pas d'EEPROM.

Bonsoir,
Ca y est! j'ai trouvé;

lors de l'adaptation du sketch d'origne je me suis planté

j'ai mis

  if (Wire.read()) rdata = Wire.read();

Au lieu de

if (Wire.available()) rdata = Wire.read();

c'est sur que ça marchais moins bien!!
là c'est ok

merci