🛠 USB host MAX3421E : diagnostic et pièges d'alimentation
Objetivos
Comprender y solucionar problemas de la parte de host USB de la placa: el controlador MAX3421E (Maxim/Analog Devices) soldado en la placa, conectado al bus SPI del ATmega2560 (MISO 50, MOSI 51, SCK 52, SS 53 + pin ICSP), con un puerto USB-A protegido por un fusible autorreseteable (polyfuse) de 500 mA. Cubrimos las tres trampas clásicas: el error «OSCOKIRQ failed to assert», la guerra de pines de reset (D7 vs PJ2), y el presupuesto de alimentación cuando se conectan periféricos reales.
Hechos verificados y conflicto abierto: la página oficial indica que el RST del MAX3421E está en el pin digital 7 («do not use Digital pin 7»), mientras que la biblioteca USB Host Shield 2.0 mapea BOARD_MEGA_ADK con MAX_RESET en PJ2 e INT en PE6, comentando «These pins are not broken out on the Arduino ADK». No cablees nada tú mismo sobre estas funciones; sigue el esquema oficial de tu revisión.
Material
- 1 × Arduino Mega ADK
- 1 × fuente de alimentación externa 6–20 V (7–12 V recomendado), idealmente 1,5 A — por encima de 12 V el regulador lineal se calienta
- 1 × pequeño periférico USB-A inofensivo para la prueba: memoria USB o teclado
- Multímetro útil para verificar la tensión de entrada real
- Biblioteca: USB Host Shield 2.0 (BOARD_MEGA_ADK autodetectado en cores ≥ 1.5.5, si no, USE_UHS_MEGA_ADK en settings.h)
Código completo
// mega-adk-usb-host-diagnostic.ino — Board: "Arduino Mega ADK"
// Diagnostic minimal du MAX3421E : init, révision, puis scan d'adresse.
#include <Usb.h>
#include <usbhub.h>
USB Usb;
void setup {
Serial.begin(115200);
delay(1000); // laisser l'auto-reset DTR se calmer
Serial.println(F("== Diagnostic MAX3421E =="));
if (Usb.Init == -1) {
Serial.println(F("OSCOKIRQ failed to assert"));
Serial.println(F("-> MAX3421E muet : verif. alim 3,3V interne, broche 7"));
Serial.println(F(" occupee par un montage, ou variant de broches (PJ2)"));
while (1);
}
Serial.print(F("MAX3421E revision = ")); // le chip répond : SPI OK
Serial.println(Usb.getRevision, HEX);
Serial.println(F("Host OK. Branchez un peripherique USB-A."));
}
void loop {
Usb.Task;
static uint8_t etatPrecedent = 0xFF;
if (Usb.getUsbTaskState != etatPrecedent) {
etatPrecedent = Usb.getUsbTaskState;
Serial.print(F("Etat USB (tache) = 0x"));
Serial.println(etatPrecedent, HEX);
}
}
Verificación esperada
Sin periférico: «Host OK» seguido de un estado de tarea USB estable (host en espera). Con una memoria o un teclado: la consola registra un cambio de estado cuando comienza la enumeración. En caso de OSCOKIRQ, la prueba es binaria: o bien los 3,3 V internos han colapsado (alimentación externa demasiado baja, cortocircuito en 5V/3V3), o bien el chip no está seleccionado (mapeo incorrecto de pines según la biblioteca), o bien está muerto. Recordatorio: nunca retroalimentar por los pines 5V/3.3V, «can damage your board».
Errores frecuentes
- OSCOKIRQ failed to assert interpretado como un error de software: casi siempre es un problema de hardware — el cristal del MAX3421E que no arranca, chip dañado, o el pin 7 desviado por un shield o un cable.
- Olvidar que el MAX3421E ocupa permanentemente el bus SPI compartido: un lector de tarjetas SD o cualquier periférico SPI exige deseleccionar el host USB durante tus transferencias, so pena de datos corruptos en ambos lados.
- Alimentar la placa por USB mientras se carga un teléfono en el puerto host: 500 mA para todos; el presupuesto anunciado de 1,5 A (750 + 750) supone una alimentación externa ≥ 1,5 A.
- Entrada > 12 V «porque funciona»: el regulador lineal se calienta y termina por cortar; el rango recomendado es 7–12 V (límites 6–20 V).
- Polyfuse disparado tomado como una avería definitiva: el puerto USB-A se corta por sobrecorriente y luego se autorresetea; desenchufa el periférico en cortocircuito y espera unos segundos.
- Ejemplos de shield USB host estándar compilados tal cual: el SS está en PB4 (D10) mientras que el ADK cablea el MAX3421E de otra manera — siempre selecciona la variante de placa de la biblioteca.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinoscan-hote-usb.inoArduinoadk-chat-android.inoArduinoadk-telemetrie.inoArduinohote-clavier-usb.inoArduino