🛠 USB host MAX3421E : diagnostic et pièges d'alimentation
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
- 1 × Arduino Mega ADK
- 1 × alimentation externe 6–20 V (7–12 V recommandé), idéalement 1,5 A — au-delà de 12 V le régulateur linéaire chauffe
- 1 × petit périphérique USB-A inoffensif pour le test : clé USB ou clavier
- Multimètre utile pour vérifier la tension d'entrée réelle
- Bibliothèque : USB Host Shield 2.0 (BOARD_MEGA_ADK auto-détecté sur cores ≥ 1.5.5, sinon USE_UHS_MEGA_ADK dans settings.h)
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
- 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.
- 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.
- 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.
- 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).
- 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.
- 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
clignotante.inoArduinobouton-led.inoArduinoscan-hote-usb.inoArduinoadk-chat-android.inoArduinoadk-telemetrie.inoArduinohote-clavier-usb.inoArduino