Connexion entre deux Arduino MEGA via SDA/SCL

Bonjour,

Je cherche à faire dialoguer deux cartes.

Pour cela, j'utilise les ports SDA et SCL. Mais ces ports sont déjà utilisés pour une horloge et une EEPROM.

Lorsque je débranche l'horloge, cela fonctionne. Mais lorsque je la branche, la communication s'arrête. Puis reprend lorsque je débranche.

Le code est celui du MasterReader de mchobby

Maître :

void loop()
{
  Wire.requestFrom(3, 6);    // lecture de 6 octets (bytes) depuis l'esclave #2

  while(Wire.available())    // l'esclave pourrait envoyer moins de données qu'attendu
  {
    char c = Wire.read();    // Reception de l'octet (byte) comme caractère
    Serial.print(c);         // Affichage du caractère.
  }

  delay(500); // Attendre une demi seconde.
}

Esclave :

#include <Wire.h>

void setup()
{
  Wire.begin(3);                // Joindre le bus i2c avec l'adresse #2
  Wire.onRequest(requestEvent); // enregistrer l'événement (lorsqu'une demande arrive)
}

void loop()
{
  delay(100); // Attendre 100ms
}

void requestEvent()
{
  Wire.write("hello "); // Répondre avec un message de 6 octets (bytes)
                        // comme attendu par le maître.
}

J'ai changé le n° du port (2 -> 3), mais rien n'y fait.

Or, dans les documents relatifs au port I2c, j'ai lu qu'on pouvait en mettre autant qu'on veut.

D'où provient mon erreur ?

Merci beaucoup.

Vous avez mis des résistances de pull-up?

Bonjour,

J-M-L:
Vous avez mis des résistances de pull-up?

La carte Mega intègre les résistances de pullup.
Voir au milieu et en haut du schéma

Oui - certains clones sont mal fichus...

Merci pour vos réponses, mais je n'ai aucune résistance dans le montage.

L'horloge et l'EEPROM sont reliées directement à la carte (ground, +5, SDA et SCL).

Vbloc:
Merci pour vos réponses, mais je n'ai aucune résistance dans le montage.
L'horloge et l'EEPROM sont reliées directement à la carte (ground, +5, SDA et SCL).

le problème est peut être l'inverse : trop de résistances de pull-up car présentent sur toutes les cartes ...

La norme I2C utilise des collecteurs ouverts, c'est à dire que le circuit électronique doit être terminé à l'extérieur des circuits intégrés.
Tous les CI I2C partagent la même résistance externe, c'est grace à cette astuce qui permet de faire des "ou câblés" gratuitement qu'il est inutile d'ajouter la moindre porte logique.

Il suffit d'une seule résistance sur SDA et d'une seule sur SDC, s'il y en a plusieur en parrallèle ce n'est pas gênant tant que leur nombre est résonnable : il est préférable que la résistance équivalente reste supérieure à 500 ohms pour que le courant dans les transistors reste modéré.

La bibliothèque "TWO-WIRE" qui instancie un objet "Wire" active les résistances de tirage au plus (pull-up) mais elles sont trop élevées pour l'I2C, elles protègent juste contre un blocage du programme en cas d'oubli.
Il faut au minimum des résistances de 10 kohms entre les sorties SDA ou SCL et l'alimentation Vcc.
C'est la valeur qui est généralement câblée sur les modules (quand il en comporte une).

Merci 68tjs,

C'était bien ça le problème.