[Résolu] Soucis I2C entre Nano IoT 33 et 24LC256

Bonjour,

Pour un projet personnel, j'essaye de faire communiquer mon Arduino Nano IoT 33 et une EEPROM 24LC256 en I²C.
L'écriture se passe très bien, visiblement, mais lors de la lecture, j'ai un retour d'erreur sur le Wire.endTransmission() (error 2), que je n'ai pas en écriture.

Au début, j'ai pensé à un soucis de Pull-Up. J'avait ajouté deux pull-up de 10k, en sachant que la Nano IoT en ai déjà pourvu, j'ai donc retirées les miennes.

M'étant fortement inspiré d'un code déjà prêt sur le net, j'ai essayer de le copier/coller brut, mais toujours rien pour la lecture.

Niveau tension, j'ai du 3.6V sur la Nano (abaissement du 5V USB depuis l'Arduino).
Comme indiqué sur le schéma, les A0, A1 et A2 de l'EEPROM sont au GND.

Je reste débutant en électronique et en Arduino, et j'ai du mal à trouvé des exemple spécifique avec une IoT 33.
Si l'un d'entre vous à quelques idées :).

Petite précision :
Je n'ai pas encore d'Oscilloscope, du moins hose du cadre du travail.
Je travail sur un PCB développer moi-même. Pas de board de développement.

Le code :

#include <Wire.h>

#define WIT_On digitalWrite(A2, HIGH)
#define WIT_Off digitalWrite(A2, LOW)
#define EEPROM 0x50

void setup() {
  // put your setup code here, to run once:
  pinMode(A2, OUTPUT);
  WIT_Off;
  Wire.begin();
  Serial.begin(9600);
  while(!Serial);
  unsigned int address = 0;
  writeEEPROM(address, 128);
  byte reader = readEEPROM(address);
}

void loop() {
  // put your main code here, to run repeatedly:

}

void writeEEPROM(unsigned int eeaddress, byte data)
{
  Wire.beginTransmission(EEPROM);
  Wire.write((int)(eeaddress >> 8));
  Wire.write((int)(eeaddress & 0xFF));
  Wire.write(data);
  Serial.print("Error code W : ");
  Serial.println(Wire.endTransmission());
  WIT_On;
}

byte readEEPROM(byte eeaddress) 
{
  byte rdata = 0xFF;
  eeaddress = eeaddress >> 8;
  eeaddress = eeaddress & 0xFF;
  Wire.beginTransmission(EEPROM);
  Wire.write((int)(eeaddress >> 8));
  Wire.write((int)(eeaddress & 0xFF));
  int error = Wire.endTransmission();
  Wire.requestFrom(EEPROM, 1);
  while (Wire.available())
  {
    rdata = Wire.read();
    Serial.println("Succès de lecture");
    digitalWrite(A2, HIGH);
  }
  Serial.print("Error code R : ");
  Serial.println(error);
  Serial.print("Lecture de : ");
  Serial.println(rdata, DEC);
  return rdata;
  
}

Merci pour votre aide :slight_smile:

Ces 2 lignes

  eeaddress = eeaddress >> 8;
  eeaddress = eeaddress & 0xFF;

au début de la fonction de lecture modifie l'adresse à laquelle tu vas lire. Du coup, tu ne lis pas où tu as écrit.

Effectivement, elles n’ont rien à faire la.

Mais ces 2 lignes correspondent à l’adresse dans l’EEPROM, et une erreur 2 en retour d’un endTransmission(), d’après Arduino (2:received NACK on transmit of address) correspond du coup plutôt à l’adresse du composant, je me trompe ? (Et dont le bit de lecture/écriture est gérer par Arduino)

Après moulte recherche :

Le hard était bon, il suffisait de rajouter un delay(10) après chaque Wire.write().

En espérant que cela serve à d'autre !