🛠 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)

Objectifs

Comprendre et dépanner la partie USB host de la carte : le contrôleur MAX3421E (Maxim/Analog Devices) soudé sur la carte, connecté au bus SPI de l'ATmega2560 (MISO 50, MOSI 51, SCK 52, SS 53 + broche ICSP), avec un port USB-A protégé par un polyfuse réarmable de 500 mA. On couvre les trois pièges classiques : l'erreur « OSCOKIRQ failed to assert », la guerre des broches de reset (D7 vs PJ2), et le budget d'alimentation quand on branche de vrais périphériques.

Faits vérifiés et conflit ouvert : la page officielle indique que le RST du MAX3421E est sur la broche numérique 7 (« do not use Digital pin 7 »), tandis que la bibliothèque USB Host Shield 2.0 mappe BOARD_MEGA_ADK avec MAX_RESET sur PJ2 et INT sur PE6, en commentant « These pins are not broken out on the Arduino ADK ». Ne câblez rien sur ces fonctions vous-même ; suivez le schéma officiel de votre révision.

Matériel

Code complet

// 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("État USB (tache) = 0x"));
    Serial.println(etatPrecedent, HEX);
  }
}

Vérification attendue

Sans périphérique : « Host OK » puis un état de tâche USB stable (host en attente). Avec une clé ou un clavier : la console trace un changement d'état quand l'énumération démarre. En cas d'OSCOKIRQ, le test est binaire : soit le 3,3 V interne est effondré (alimentation externe trop basse, court-circuit sur 5V/3V3), soit la puce n'est pas sélectionnée (mauvais mapping de broches selon la bibliothèque), soit elle est morte. Rappel : ne jamais rétro-alimenter par les broches 5V/3.3V, « can damage your board ».

Erreurs fréquentes

  1. OSCOKIRQ failed to assert interprété comme un bug logiciel : c'est presque toujours matériel — quartz du MAX3421E qui ne démarre pas, puce HS, ou broche 7 détournée par un shield ou un fil.
  2. Oublier que le MAX3421E occupe en permanence le bus SPI partagé : un lecteur de carte SD ou tout périphérique SPI exige de désélectionner l'hôte USB pendant vos transferts, sous peine de données corrompues des deux côtés.
  3. Alimenter la carte par USB tout en chargeant un téléphone sur le port host : 500 mA pour tout le monde ; le budget annoncé de 1,5 A (750 + 750) suppose une alimentation externe ≥ 1,5 A.
  4. Entrée > 12 V « parce que ça marche » : le régulateur linéaire chauffe et finit par couper ; la plage recommandée est 7–12 V (limites 6–20 V).
  5. Polyfuse déclenché pris pour une panne définitive : le port USB-A se coupe en surintensité puis se réarme ; débranchez le périphérique en court-circuit et attendez quelques secondes.
  6. Exemples de shield USB host standard compilés tels quels : le SS y est PB4 (D10) alors que l'ADK câble le MAX3421E autrement — toujours sélectionner le variant de carte de la bibliothèque.

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels