Langue: FR

L’ESP32 ne démarre plus avec une carte SD sur GPIO12

Notes · Publié le

Un ESP32 sur une plaque d’essai, relié par des fils à un écran et à un module de carte microSD

Vous branchez un module de carte SD sur votre ESP32 et vous téléversez votre programme. Puis la carte ne démarre pas. Elle redémarre en boucle, ou n’affiche rien du tout. Débranchez le module SD et tout remarche.

Si le fil MISO du module va sur GPIO12, c’est presque sûrement la raison. Ce n’est ni la carte SD ni votre code. C’est la façon dont l’ESP32 choisit la tension de sa mémoire flash à la mise sous tension.

Le symptôme

  • La carte redémarre sans arrêt, ou semble morte, mais seulement avec le module SD branché.

  • Dans le moniteur série (115200 bauds), les messages de démarrage s’arrêtent tôt. Souvent, les dernières lignes ressemblent à ceci.

    flash read err, 1000
    ets_main.c 371
    
  • Débrancher seulement le fil MISO suffit à la faire redémarrer.

Pourquoi ça arrive

GPIO12 est une broche de démarrage (« strapping »). À la mise sous tension et après chaque reset, l’ESP32 lit quelques broches une seule fois, avant votre code, pour décider comment démarrer. GPIO12 fixe la tension de la mémoire flash, où votre programme est stocké.

GPIO12 au reset Tension de la flash
Bas (par défaut) 3,3 V
Haut 1,8 V

L’ESP32 a une faible résistance de tirage vers le bas (pull-down) sur GPIO12. Il lit donc un niveau bas et choisit 3,3 V. C’est la bonne valeur pour les modules courants ESP32-WROOM-32.

Beaucoup de modules de carte SD ont des résistances de tirage vers le haut (pull-up) sur leurs lignes de données, MISO compris, parce que les cartes SD en ont besoin. Sur GPIO12, cette résistance l’emporte sur le faible pull-down. L’ESP32 lit un niveau haut, alimente la flash en 1,8 V, et n’arrive plus à lire son propre programme.

Le piège est facile, parce que GPIO12 est la broche MISO par défaut du second bus SPI de l’ESP32 (HSPI). Les broches HSPI par défaut sont 14 (SCK), 13 (MOSI), 12 (MISO) et 15 (CS). Beaucoup de tutoriels et de schémas de brochage mettent donc la carte SD exactement là.

Comment je l’ai évité

Pour ma visionneuse de photos sur ESP32, je voulais la carte SD sur HSPI, sur son propre bus. J’ai gardé 14, 13 et 15, et j’ai seulement déplacé MISO sur GPIO27.

#define PIN_SD_SCLK    14
#define PIN_SD_MOSI    13
#define PIN_SD_MISO    27   // not GPIO12, the board won't boot
#define PIN_SD_CS      15

L’ESP32 peut envoyer le SPI sur presque n’importe quelle broche. La classe Arduino SPIClass prend donc simplement les broches qu’on lui donne.

static SPIClass sdSpi(HSPI);

sdSpi.begin(PIN_SD_SCLK, PIN_SD_MISO, PIN_SD_MOSI, PIN_SD_CS);
SD.begin(PIN_SD_CS, sdSpi, 20000000);

Les broches qui ne sont pas celles par défaut passent par la matrice GPIO de l’ESP32. Cela ajoute un tout petit délai, mais une carte SD à 20 MHz ne le remarque pas.

Trois façons de corriger

  1. Déplacer le fil sur une autre broche. C’est la meilleure solution. GPIO27, 26, 25, 33 ou 32 conviennent toutes pour MISO. On change un fil et un nombre dans le code.

  2. Fixer la tension de la flash dans la puce. Un eFuse peut être grillé pour que l’ESP32 utilise toujours 3,3 V et ignore GPIO12. Ensuite, GPIO12 est une broche normale. C’est définitif, et sans danger seulement sur les modules à flash 3,3 V, comme l’ESP32-WROOM-32. Certains modules ESP32-WROVER ont une flash en 1,8 V, et cela les rendrait inutilisables. C’est une solution pour une carte déjà fabriquée qu’on ne peut plus recâbler. L’outil esptool d’Espressif a une commande pour ça. Vérifiez la documentation d’esptool pour votre version, car les noms des commandes ont changé avec le temps.

    $ espefuse.py --port /dev/ttyUSB0 set_flash_voltage 3.3V
    
  3. Retirer le pull-up de MISO sur le module. Ça marche, mais il faut alors un pull-up ailleurs, et on l’oublie facilement sur le module suivant.

Les autres broches de démarrage

GPIO12 n’est pas la seule. L’ESP32 lit aussi GPIO0, 2, 5 et 15 au reset.

  • GPIO0 et GPIO2 choisissent entre lancer le programme et attendre un téléversement. Évitez d’y brancher ce qui les tire dans le mauvais sens.
  • GPIO15 active ou coupe les messages de démarrage sur le port série, et GPIO5 règle un timing du mode esclave SDIO. Les deux sont sans danger en pratique. J’utilise donc GPIO15 pour le CS de la carte SD et GPIO5 pour le CS de l’écran.

Quand une carte ne démarre pas, regardez d’abord ce qui est branché sur ces cinq broches.

Liens

← Retour aux articles