🛠 USB host MAX3421E : diagnostic et pièges d'alimentation

Arduino Mega ADK (Rev3) · avance · Schéma : IMG-mega-adk-avance-1-mega-adk-usb-host-max3421e.svg — Chaîne d'alimentation : USB 500 mA partagé vs alimentation externe 1,5 A, polyfuse 500 mA du port USB-A, puce MAX3421E et broche 7 réservée (RST)

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

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

  1. 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.
  2. 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.
  3. 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.
  4. 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).
  5. 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.
  6. 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

← Volver a la ficha 🛠 Todos los tutoriales