Problème de lecture et d'écriture avec une eeprom 24LC16B

Bonjour,

J’ai acheté des eeprom 24LC16B et depuis jeudi, j’essaie d’écrite et de lire sans y arriver.
J’ai essayé plusieurs librairies, plusieurs sketch, plusieurs eeproms, des résistance de pull up de 2k à 10k, mais ca ne fonctionne pas.

L’eeprom vient de chez AliExpress et, j’utilise cet adaptateur car j’ai pas fait attention au boitier lors de la commande de l’eeprom.

J’ai raccordé la broche :
4 → GND
5 → SDA
6 → SCL
7 → GND
8 → 5v
Actuellement, il y a une résistance de 10K sur les broches SCL et SDA.
J’utilise la librairie extEeprom et le code ci-dessous :

#include <Wire.h>
#include<extEEPROM.h>;

#define disk1 0x50

int totalCOUNTS = 6;
int total = 5;

extEEPROM POND_eep(kbits_16, 1, 16, disk1);

void setup() {
  Serial.begin (9600);

  uint8_t POND_eepStatus = POND_eep.begin();
  if (POND_eepStatus){
    Serial.print(F("extEEPROM.begin() failed, status = "));
    Serial.println(POND_eepStatus);
    while (1);
  }

  Serial.println("STARTING");
  byte i2cStatA = POND_eep.write(0,totalCOUNTS,sizeof(totalCOUNTS));

  if (i2cStatA !=0)
  {
    if(i2cStatA == EEPROM_ADDR_ERR)
    {
      Serial.println("error");
      while(1);
    }
    else Serial.println("error write 2");
  }

  delay(200);
  byte error = POND_eep.read(0,total,sizeof(total));
  if (error !=0)
  {
    if(error == EEPROM_ADDR_ERR)
    {
      Serial.println("error");
      while(1);
    }
    else Serial.println("error 2");
  }
  Serial.println((int)total);
}

void loop() {
  
}

J’obtiens ce résultat :

STARTING
5

Donc, soit il n’écrit pas dans l’eeprom, soit il ne lit pas ou c’est les 2. Or il n’y a pas de retour d’erreur et je ne sait plus quoi tester pour réussir à écrire et lire.

Quelqu’un peut-il m’aider ?

Bonjour
Voir sur la documentation le rôle de l'entrée WP. De mémoire je dirai qu'il faut mettre WP à l'état bas pour pouvoir écrire, c'est à vérifier.

  • Un sketch scanneur de bus I2C peut tester la présence de la mémoire sur le bus I2C

Bonjour

For devices with write-protect functionality, the WP pinprovides a hardware write-protect feature which allowsthe user to protect the entire array when the pin is tiedto VCC. If tied to VSS, the write protection is disabled.A pull-up resistor connected to the WP pin can be usedto ensure the device remains write-protected duringpower-up/power-down and any other time the pin is notbeing driven explicitly. This helps to guard againstunwanted writes which may occur due to noise on theSDA/SCL lines or for other reasons. In order for a writecycle to be initiated, the WP pin must be driven to logic‘0’, otherwise the write cycle will not execute.If the designer chooses not to control the WP pin, butrather to always disable write protection, the pin mustbe hard-wired to logic ‘0’. As with the Chip Addressinputs, this pin cannot be left floating, otherwise thedevice will not operate correctly.

mettre a0 a1 a2 a la masse et vérifier l'adresse

Merci pour vos réponses

al1fch:
Bonjour
Voir sur la documentation le rôle de l'entrée WP. De mémoire je dirai qu'il faut mettre WP à l'état bas pour pouvoir écrire, c'est à vérifier.

  • Un sketch scanneur de bus I2C peut tester la présence de la mémoire sur le bus I2C

D'après la doc et comme tu le dis, WP doit être à 0 et correspond à la broche 7 qui est connecté à GND.

J'ai refait un scan et il me trouve un périphérique sur chaque adresse de 0x50 à 0x57 alors qu'il y a une seule eeprom.
J'ai refait un scan avec les broches A0, A1 et A2 à la masse mais ca ne change rien. De plus, d'après la doc, les broches A0, A1 et A2 ne sont pas connectées dans un 24LC16B.

Edit: J'ai utilisé un 2eme scan I2C et il me trouve également 8 périphériques de 0x50 à 0x57

kobisfu:
J'ai utilisé un 2eme scan I2C et il me trouve également 8 périphériques de 0x50 à 0x57

Et c'est normal

The control byte consists of a four-bit control code.
For the 24LC16B, this is set as ‘1010’ binary for read
and write operations. The next three bits of the control
byte are the Block Select bits (B2, B1, B0). They are
used by the master device to select which of the eight
256 word-blocks of memory are to be accessed.
These bits are, in effect, the three Most Significant bits
(MSb) of the word address.

Ces bits servent à sélectionner un bloc mémoire parmi 8.

Bonjour

J'ai utilisé un 2eme scan I2C et il me trouve également 8 périphériques de 0x50 à 0x57

2020-08-18_12-36.png
En voyant le rôle des 8 blocs de 256 octets qui composent la mémoire 24LC16B , le positionnement des bits B0, B1 et B2 dans le mot de commande n'est-il pas logique que celle-ci apparaisse sur le bus à 8 adresses successives ? .
...... Comme si l'on avait affaire dans le boitier unique à 8 EEPROM de 256 octets chacune câblées à 8 addresses successives (0x50 à 0x57)

2020-08-18_12-36.png

Oui, c'est ça une adresse par bloc.
Dans la suite du doc de la mémoire, il est expliqué que du coup comme on ne peut pas changer l'adresse du composant sur le bus il ne peut y avoir qu'une seule mémoire sur le bus.

Cette référence de mémoire , avec la particularité des addresses multiples consécutives pour un boitier, ne semble pas prise en charge par la librairie extEEPROM (lire les restrictions sur le dépôt : GitHub - JChristensen/extEEPROM: Arduino library to support external I2C EEPROMs. )
elle est de ce type (exclu) :

The three least-significant bits in the control byte (excluding the R/W bit) comprise the three most-significant bits for the entire address space, i.e. all chips on the bus. As such, these may be chip-select bits or block-select bits (for individual chips that have an internal block organization), or a combination of both (in which case the block-select bits must be of lesser significance than the chip-select bits).

-> Il faut écrire un code adapté permettant de traiter un bloc parmi 8 dans la puce (= une des 8 adresses)

...ou tester cette librairie : GitHub - blins/c24LC16B: arduino library for 24LC16B EEPROM memory

Je comprend mieux le résultat du scan
Demain, je vais tester la librairie c24LC16B
Merci