Spécifications électriques des broches GPIO ESP32 et mappage SPI
Contraintes électriques des GPIO spécifiques aux broches attribuées au SPI
Les ingénieurs travaillant sur des afficheurs ou des capteurs connectés en SPI rencontrent régulièrement un schéma familier : le bus fonctionne de manière fiable à 10 MHz lors des tests sur banc, puis commence à perdre des transactions à 40 MHz dans la disposition finale du PCB. La cause n'est presque jamais le périphérique SPI lui-même. Cela remonte au comportement électrique des GPIO et aux choix de routage qui n'ont jamais été validés sous charge.
Tolérance de tension, force de commande et limites de courant sur les lignes GPIO SPI
Les GPIO ESP32 fonctionnent avec une logique de 3,3 V. Aucune des broches GPIO n'est tolérante à 5 V. Connecter directement un appareil SPI 5 V sans décalage de niveau endommagera les diodes de protection d'entrée avec le temps, même si le système semble fonctionner initialement.
Le courant de sortie maximal absolu par GPIO est de 40 mA. Pour un fonctionnement SPI soutenu, 12 mA est la limite pratique. Dépasser cette valeur provoque un affaissement de tension sur la sortie, ce qui dégrade la qualité des fronts de signal sur SCLK et MOSI à des fréquences d'horloge élevées.
Chaque GPIO possède un registre de force de commande avec quatre réglages (0-3). À la force par défaut (réglage 2), les temps de montée et de descente sur SCLK sont généralement adéquats jusqu'à environ 20 MHz. Au-delà, augmenter la force de commande au réglage 3 affûte les bords et réduit les violations de temps de setup — mais cela augmente également les EMI et peut injecter du bruit sur les lignes GPIO adjacentes. Sur un PCB dense avec des lignes SPI routées près des entrées ADC, ce compromis est important.
MISO mérite une attention particulière. C'est une ligne d'entrée, donc la force de commande ne s'applique pas directement. Ce qui est important, c'est l'interaction entre les résistances de pull internes et la capacité du bus. Le pull-up interne sur le GPIO ESP32 est d'environ 45 kΩ. Sur un bus avec plusieurs centimètres de piste et un appareil avec une capacité de sortie de 10-20 pF, ce pull-up crée une constante de temps RC qui limite l'échantillonnage propre de MISO à haute vitesse. Un pull-up externe de 10 kΩ est la solution correcte au-dessus de 20 MHz.
Surcoût du Routage de la Matrice GPIO et Intégrité du Signal sur les Chemins SPI

La matrice GPIO de l'ESP32 permet de connecter n'importe quel GPIO à n'importe quel signal périphérique. Cette flexibilité a un coût. Le routage via la matrice ajoute environ 4 à 6 ns de délai de propagation par rapport au chemin direct IO MUX.
À une horloge SPI de 40 MHz, une période d'horloge est de 25 ns — une pénalité de routage de 6 ns consomme près d'un quart de ce budget avant même que le signal ne quitte la puce.
Le chemin direct IO MUX contourne entièrement la matrice. Sur les modules WROOM-32, ce chemin n'est disponible que sur les affectations de broches SPI par défaut listées dans la section suivante. Tout GPIO remappé passe par la matrice et subit la pénalité de délai.
La conséquence pratique est l'accumulation de gigue sur SCLK. À 80 MHz, la gigue de SCLK routée par la matrice peut amener les périphériques SPI avec des exigences de setup/hold serrées à mémoriser des données incorrectes. La décision d'ingénierie est simple : utiliser les affectations de broches SPI par défaut pour les conceptions critiques en matière d'horloge, et réserver le remappage de la matrice pour les bus à plus basse vitesse ou les lignes CS où quelques nanosecondes de délai supplémentaire n'affectent pas les marges de synchronisation.
Affectations des Broches GPIO sur les Variantes de Modules ESP32
Numéros GPIO SPI par défaut des ESP32 WROOM-32 et WROVER
| Signal SPI | GPIO HSPI (SPI2) | GPIO VSPI (SPI3) |
|---|---|---|
| SCLK | GPIO 14 | GPIO 18 |
| MOSI | GPIO 13 | GPIO 23 |
| MISO | GPIO 12 | GPIO 19 |
| CS0 | GPIO 15 | GPIO 5 |
Les GPIO 6 à 11 sont réservés à l'interface flash interne sur les modules WROOM. Leur assignation au SPI ou à tout périphérique externe corrompra l'accès à la flash et provoquera des plantages imprévisibles. Ceci est une contrainte matérielle, pas une recommandation.
Le GPIO 12 sert également de pin de strapping (MTDI). Son état au démarrage définit la tension d'alimentation de la flash : BAS sélectionne 3,3 V, HAUT sélectionne 1,8 V. L'utilisation du GPIO 12 comme MISO HSPI nécessite une résistance de tirage vers le bas pour le maintenir à BAS pendant la réinitialisation. Une mauvaise configuration bloque l'accès à la flash.
Le GPIO 15 contrôle la sortie du log de démarrage UART0. Le tirer vers le BAS fait taire le log de démarrage, ce qui perturbe le flux de production de flash par défaut. Si le CS0 HSPI doit utiliser le GPIO 15, documentez l'état de tirage requis et mettez à jour la procédure de flash en conséquence.
Différences entre les GPIO et les périphériques SPI de l'ESP32-S3 WROOM-1
Le S3 expose les GPIO 0 à 21 sur l'empreinte standard du module. La variante -N16R8 ajoute les GPIO 26 à 48. Les pins SPI2 par défaut sur le S3 sont SCLK GPIO 12, MOSI GPIO 11, MISO GPIO 13 et CS GPIO 10.
Le SPI3 existe sur le S3 mais n'est pas câblé sur toutes les variantes de module. Vérifiez toujours la fiche technique du module spécifique avant d'assigner le SPI3 dans le firmware.
Les GPIO 19 et 20 sur le S3 transportent les USB D+ et D−. Ceux-ci ne peuvent pas servir de lignes SPI lorsque l'USB CDC est actif. Les ingénieurs qui portent les conceptions WROOM-32 vers le S3 et réutilisent la même numérotation GPIO rencontrent souvent ce conflit silencieusement — le bus SPI s'initialise sans erreur, mais les transactions échouent de manière intermittente lorsque l'activité USB se produit.
Le S3 utilise un IO MUX complet avec une pénalité de routage plus faible que la matrice GPIO du WROOM-32. Les assignations GPIO SPI non par défaut présentent moins de risques de temporisation sur le S3 que sur l'ESP32 d'origine. Pour les conceptions fortement axées sur l'affichage où le débit SPI est critique, utilisez notre estimation de la bande passante de l'interface d'affichage et du débit SPI outil pour valider les choix de fréquence d'horloge par rapport à vos besoins de taux de rafraîchissement.
Restrictions des GPIO uniquement en entrée et leur effet sur les affectations SPI CS et MISO
Les GPIO 34 à 39 de l'ESP32 WROOM-32 sont uniquement en entrée. Ils n'ont pas de résistances de rappel internes et aucune capacité de sortie. L'affectation de l'un d'eux à CS ou SCLK entraîne un échec d'initialisation silencieux — le pilote SPI ESP-IDF ne signalera pas d'erreur, mais la ligne CS ne sera jamais assertée.
Les GPIO 36 (VP) et 39 (VN) sont des broches d'entrée de capteur ADC1. Leur utilisation comme MISO SPI pendant que l'ADC1 est actif crée un couplage de bruit entre le chemin d'échantillonnage ADC et le bus SPI. Le symptôme est des lectures ADC qui changent lorsque des transactions SPI se produisent. Séparer ces fonctions sur différentes lignes GPIO élimine complètement le problème.
Configuration des modes GPIO pour le fonctionnement SPI
Sélection du mode de pilotage des GPIO pour les lignes SCLK, MOSI et CS
SCLK et MOSI doivent utiliser GPIO_MODE_OUTPUT en configuration push-pull. Le push-pull offre les pentes de front les plus rapides et est approprié pour un bus SPI à maître unique. Le MOSI en drain ouvert ajoute un retard RC de résistance de rappel qui limite la fréquence d'horloge maximale — évitez-le, sauf si la topologie du bus l'exige spécifiquement.
Les lignes CS nécessitent plus de réflexion. Lorsque plusieurs périphériques SPI partagent un bus et que certains ont des habilitations actives basses avec des résistances de rappel internes, un CS push-pull forçant à l'état BAS contre la résistance de rappel interne d'un périphérique provoque une contention de bus. Un CS en drain ouvert avec une résistance de rappel externe résout ce problème. Utilisez GPIO_MODE_INPUT_OUTPUT_OD pour ce cas.
Le MISO nécessite une résistance de rappel lorsque le bus est inactif. Un MISO flottant échantillonne des niveaux logiques aléatoires entre les transactions, ce qui peut corrompre la lecture suivante si le pilote démarre une transaction avant que la ligne ne se stabilise. La résistance de rappel interne de 45 kΩ est acceptable pour les bus fonctionnant à moins de 20 MHz. Au-delà, installez une résistance externe de 10–22 kΩ sur le PCB.
Remappage des broches GPIO SPI à l'aide du multiplexeur d'E/S et de la matrice GPIO
Deux chemins existent pour connecter un GPIO à un signal SPI. Le chemin du multiplexeur d'E/S est fixe aux affectations de broches par défaut dans H3 2.1 et n'ajoute aucun délai de routage. Le chemin de la matrice GPIO accepte n'importe quel numéro GPIO valide mais ajoute un délai de 4 à 6 ns, comme abordé dans H2 1.
Dans ESP-IDF, la spi_bus_config_t structure accepte n'importe quel numéro GPIO dans son mosi_io_num, miso_io_num, et sclk_io_num champs. Le pilote achemine automatiquement via la matrice lorsque des broches non par défaut sont spécifiées. Le développeur doit tenir compte du délai supplémentaire dans les calculs de marge de temporisation — le pilote ne prévient pas lorsque le routage de la matrice réduit la marge de temporisation.
Pour le contexte complet d'initialisation du bus SPI et la configuration au niveau du pilote, consultez la page Architecture et configuration du bus périphérique SPI ESP32 Les GPIO 6–11 ne doivent jamais apparaître dans ces champs sur les modules WROOM-32, quelle que soit la façon dont la matrice peut techniquement les acheminer.
Gestion de plusieurs périphériques SPI avec des lignes GPIO CS distinctes
ESP-IDF prend en charge plusieurs périphériques SPI via des lignes distinctes spi_device_handle_t instances. Chaque périphérique nécessite un GPIO CS dédié configuré en sortie avant la création du handle du périphérique. Le pilote active et désactive automatiquement le CS par transaction une fois configuré.
Les conceptions avec plus de trois périphériques SPI manquent souvent de GPIO disponibles. Un décodeur 74HC138 de 3 vers 8 piloté par trois lignes GPIO permet de gérer jusqu'à huit signaux CS. Cela réduit considérablement la consommation de GPIO sur les schémas où les broches sont limitées.
Le cs_ena_pretrans paramètre dans spi_device_interface_config_t contrôle le temps d'établissement du CS avant le premier front de SCLK. Consultez la fiche technique du périphérique cible pour connaître son exigence minimale d'établissement CS avant SCLK. De nombreux contrôleurs de mémoire flash et d'affichage nécessitent au moins un demi-cycle d'horloge de maintien du CS avant le début du SCLK.
Un mode de défaillance courant dans les cartes de production : la ligne CS flotte sur HIGH pendant la mise sous tension, puis le périphérique SPI s'active avant que le firmware n'initialise le GPIO. Une résistance de pull-up de 10 kΩ sur la ligne CS sur le PCB évite cela. La détection tardive dans le cycle de conception implique généralement une nouvelle révision de la carte.
Comportement de l'état des broches GPIO pendant le démarrage et la réinitialisation
Conflits de broches de Strapping avec les affectations GPIO SPI
Cinq broches GPIO de l'ESP32 sont échantillonnées au redémarrage pour configurer le comportement de démarrage : GPIO 0, 2, 5, 12 et 15. Leur état pendant l'impulsion de réinitialisation détermine la tension de flash, le timing SDIO et la sortie du log UART. Tout signal SPI attribué à ces broches doit maintenir le niveau logique correct pendant le redémarrage, sinon la puce démarre dans un mode inattendu.
GPIO 12 définit la tension VDD_SDIO du flash. GPIO 5 affecte le timing SDIO et doit être à l'état HAUT au démarrage pour un comportement correct de la broche CS VSPI. GPIO 15 contrôle la sortie du log UART0. Chacune de ces broches nécessite une résistance de tirage explicite sur le PCB — ne vous fiez pas aux résistances de tirage internes, qui ne sont pas actives pendant la fenêtre d'échantillonnage de configuration (strapping).
L'approche de production la plus sûre est d'éviter complètement les broches de configuration (strapping) pour les lignes CS. Lorsque les contraintes de conception imposent leur utilisation, ajoutez des résistances de tirage explicites, vérifiez le comportement de démarrage avec un analyseur logique sur le premier prototype, et documentez l'état requis de la carte dans les notes de conception matérielle. Pour les équipes qui évaluent des plateformes où ces contraintes sont déjà résolues, les modules d'affichage HMI industriels basés sur ESP32 fournissent un point de départ validé.
États par défaut des GPIO et comportement de veille du bus SPI après redémarrage

Après le redémarrage, toutes les GPIO sont par défaut en mode entrée, sans aucune résistance de tirage active. Chaque ligne du bus SPI flotte jusqu'à ce que le firmware configure le pilote GPIO. Sur un bus avec un périphérique SPI qui démarre rapidement, le SCLK flottant peut ressembler à des fronts d'horloge pour le périphérique, déclenchant des transactions erronées avant l'exécution du firmware.
La solution réside sur le PCB. Une résistance de tirage vers le bas de 10 kΩ sur le SCLK et des résistances de tirage vers le haut sur toutes les lignes CS définissent un état de veille sûr dès l'application de la tension. Cela coûte quelques composants passifs et élimine une classe entière d'échecs de démarrage intermittents.
Pour les conceptions utilisant le mode veille légère, gpio_hold_en() préserve l'état de sortie GPIO pendant le cycle de veille. Sans cela, les lignes CS flottent pendant la veille, ce qui peut activer partiellement un périphérique SPI. La veille profonde ne préserve pas l'état GPIO sauf si gpio_deep_sleep_hold_en() est appelée explicitement. Les résistances de rappel externes restent la solution de repli fiable lorsque le comportement en veille est incertain.
Obtenir la configuration GPIO correcte avant la première transaction SPI est ce qui sépare une conception qui fonctionne sur l'établi de celle qui est expédiée de manière fiable. STONE HMI développe des micrologiciels de qualité production pour les systèmes HMI industriels. Ce type de discipline de processus — validation des états de démarrage, comportement des broches de configuration et gestion des GPIO en mode veille avant la production de masse — réduit directement le risque de défaillances sur le terrain qui sont coûteuses à diagnostiquer et impossibles à corriger à distance.