🛠 Scanner les deux bus I2C de la Due (Wire sur 20/21, Wire1 sur 70/71)
Objetivos
La Due dispone de DOS controladores I2C por hardware, con una peculiaridad de numeración documentada en el core: el objeto Wire corresponde al controlador TWI1 (pines 20 = SDA, 21 = SCL, cerca de AREF), mientras que Wire1 corresponde a TWI0 (pines 70/71, pequeño conector de 4 pines cerca de RESET). Este tutorial escribe un escáner que recorre ambos buses e informa las direcciones de 7 bits que responden — la base de cualquier diagnóstico de sensores I2C.
Material
- 1 Arduino Due
- 1 o 2 dispositivos I2C para la prueba (módulo RTC DS3231, OLED SSD1306, sensor BME280…) — módulos de 3,3 V o tolerantes a 3,3 V
- Cable micro-USB; opcionalmente resistencias de pull-up de 4,7 kΩ si el módulo no las incluye
Código completo
// 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 pres RESET)
scanner(Wire, "Wire (TWI1, broches 20/21)");
scanner(Wire1, "Wire1 (TWI0, broches 70/71)");
SerialUSB.println("Fin de scan.");
}
void loop { }
Verificación esperada
Con un módulo en el conector I2C clásico (20/21), la línea « Wire » muestra su dirección (por ejemplo, 0x68 para un DS3231, 0x3C para un SSD1306) y la línea « Wire1 » muestra (ninguno). Mover el módulo al conector de 4 pines 70/71 invierte los resultados. Sin dispositivo conectado, ambas líneas muestran (ninguno).
Errores frecuentes
- Creer que
Wire= TWI0: es al revés (Wire→TWI1 en 20/21, Wire1→TWI0 en 70/71); las hojas de datos del SAM3X que hablan de TWI0/TWI1 no se corresponden con los nombres de Arduino — de ahí este tutorial. - Olvidar las resistencias de pull-up en SDA/SCL: sin ellas, el escaneo no detecta nada o detecta cualquier cosa; la mayoría de los módulos comerciales ya las integran.
- Alimentar un módulo I2C a 5 V y conectar SDA/SCL directamente a la Due: nivel de 5 V en pines de 3,3 V = riesgo de destrucción; utilizar módulos de 3,3 V.
- Utilizar las antiguas API
TWCR/TWDRheredadas de los tutoriales AVR: el core SAM utiliza la API modernaWire(byte, no int, paraendTransmission). - Escanear demasiado pronto después de abrir el monitor: el CDC nativo tarda un instante en enumerarse, de ahí el
delay(1500)inicial. - Confundir dirección de 7 bits y de 8 bits: el escaneo muestra 0x3C (7 bits) mientras que algunos tutoriales escriben 0x78 (8 bits) — es el mismo dispositivo.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinodac-onde.inoArduinoadc-12-bits.inoArduinopwm-12-bits.inoArduinogps-serial1.inoArduino