🛠 Scanner les deux bus I2C de la Due (Wire sur 20/21, Wire1 sur 70/71)
Objectifs
La Due dispose de DEUX contrôleurs I2C matériels, avec un piège de numérotation documenté dans le core : l'objet Wire correspond au contrôleur TWI1 (broches 20 = SDA, 21 = SCL, près de AREF) tandis que Wire1 correspond à TWI0 (broches 70/71, petit connecteur 4 broches près de RESET). Ce tuto écrit un scanner qui balaie les deux bus et rapporte les adresses 7 bits qui répondent — la base de tout dépannage capteur I2C.
Matériel
- 1 Arduino Due
- 1 ou 2 périphériques I2C pour le test (module RTC DS3231, OLED SSD1306, capteur BME280…) — modules 3,3 V ou tolérants 3,3 V
- Câble micro-USB ; éventuellement résistances de pull-up 4,7 kΩ si le module n'en a pas
Code complet
// Scanner Wire (TWI1: 20/21) et Wire1 (TWI0: 70/71)
#include <Wire.h>
uint8_t scanner(TwoWire &w, const char *nom) {
uint8_t trouves = 0;
SerialUSB.print(nom); SerialUSB.print(" : ");
for (uint8_t a = 1; a < 127; a++) {
w.beginTransmission(a);
if (w.endTransmission == 0) { // 0 = ACK reçu
SerialUSB.print("0x"); SerialUSB.print(a, HEX); SerialUSB.print(" ");
trouves++;
}
}
if (!trouves) SerialUSB.print("(aucun) ");
SerialUSB.println;
return trouves;
}
void setup {
SerialUSB.begin(115200);
delay(1500); // laisser le CDC s'énumérer
SerialUSB.println("=== Scan I2C Due ===");
Wire.begin; // TWI1 -> broches 20 (SDA) / 21 (SCL)
Wire1.begin; // TWI0 -> broches 70 / 71 (connecteur près RESET)
scanner(Wire, "Wire (TWI1, broches 20/21)");
scanner(Wire1, "Wire1 (TWI0, broches 70/71)");
SerialUSB.println("Fin de scan.");
}
void loop { }
Vérification attendue
Avec un module sur le connecteur I2C classique (20/21), la ligne « Wire » affiche son adresse (ex. 0x68 pour un DS3231, 0x3C pour un SSD1306) et la ligne « Wire1 » affiche (aucun). Déplacer le module sur le connecteur 4 broches 70/71 inverse les résultats. Sans périphérique branché, les deux lignes affichent (aucun).
Erreurs fréquentes
- Croire que
Wire= TWI0 : c'est l'inverse (Wire→TWI1 sur 20/21, Wire1→TWI0 sur 70/71) ; les datasheets du SAM3X qui parlent de TWI0/TWI1 ne correspondent pas aux noms Arduino — d'où ce tuto. - Oublier les pull-up sur SDA/SCL : sans elles, le scan ne voit rien ou voit n'importe quoi ; la plupart des modules du commerce en intègrent déjà.
- Alimenter un module I2C en 5 V et relier SDA/SCL directement à la Due : niveau 5 V sur des broches 3,3 V = risque de destruction ; utiliser des modules 3,3 V.
- Utiliser les vieilles API
TWCR/TWDRhéritées des tutos AVR : le core SAM utilise l'APIWiremoderne (byte, pas int, pourendTransmission). - Scanner trop tôt après ouverture du moniteur : le CDC natif met un instant à s'énumérer, d'où le
delay(1500)initial. - Confondre adresse 7 bits et 8 bits : le scan affiche 0x3C (7 bits) alors que certains tutos écrivent 0x78 (8 bits) — c'est le même périphérique.
Autres tutoriels pour cette carte
- Faire clignoter la LED de l'Arduino Due et apprivoiser ses deux ports USB
- Lire un potentiomètre avec le vrai ADC 12 bits de la Due
- Allumer une LED externe en respectant les broches 3,3 V et 9 mA de la Due
- Générer une vraie tension analogique avec les DAC 12 bits (broches 66 et 67)
- Dialoguer avec un GPS (ou tout module TTL) sur Serial1 sans bloquer la boucle
- Monter la Due sur un bus CAN 500 kbit/s avec un transceiver externe
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinodac-onde.inoArduinoadc-12-bits.inoArduinopwm-12-bits.inoArduinogps-serial1.inoArduino