Broches SPI de l'ESP32 : brochage, spécifications et configuration

Ce que sont réellement les broches SPI de l'ESP32

SPI sur ESP32 — Bus quatre fils, quatre contrôleurs, une matrice GPIO

Les équipes qui construisent des écrans ou des capteurs connectés en SPI sur ESP32 rencontrent un problème familier : l'appareil s'initialise correctement sur l'établi, puis échoue de manière intermittente en production. Les symptômes varient : images d'affichage corrompues, un capteur qui cesse de répondre après quelques heures, un bus qui se bloque sous une charge DMA. La cause profonde est souvent la même. Quelqu'un a affecté des signaux SPI à des broches qui entrent en conflit avec les fonctions de strapping, ou a acheminé une horloge de 40 MHz via la matrice GPIO alors que le chemin IO_MUX était disponible et nécessaire.

L'ESP32 diffère des microcontrôleurs à broches fixes comme les STM32 ou les AVR car la plupart de ses signaux SPI peuvent être routés vers presque n'importe quel GPIO. Cette flexibilité est vraiment utile pour la conception de PCB. Elle crée également un plus grand nombre de mauvais choix possibles. Comprendre quelles broches sont sûres, lesquelles entraînent des pénalités de performance, et lesquelles sont totalement interdites est la base d'une conception SPI fiable.

Cette page couvre le paysage complet des broches SPI pour l'ESP32 : tables de broches par défaut pour toutes les variantes majeures, règles de remappage et leurs limites, caractéristiques électriques, câblage multi-appareils et un cadre de décision pour choisir la bonne configuration.

Fonctionnement du SPI de l'ESP32 au niveau matériel

La matrice GPIO et pourquoi les broches SPI de l'ESP32 ne sont pas fixes

L'ESP32 fournit deux chemins de routage internes pour les signaux périphériques. L'IO_MUX est une connexion directe entre un périphérique et un pad GPIO spécifique. Il ajoute un délai minimal et prend en charge la fréquence d'horloge maximale que le périphérique peut générer. La matrice GPIO est un commutateur crossbar qui permet à tout signal périphérique de se connecter à presque n'importe quel GPIO. Il ajoute environ un cycle d'horloge APB de délai dans chaque direction.

Pour le SPI, ce délai supplémentaire est important aux fréquences d'horloge élevées. La documentation d'Espressif place la limite pratique pour le SPI routé via la matrice GPIO à environ 26 MHz sur l'ESP32 d'origine. Au-dessus de ce seuil, les conditions de setup et de hold se dégradent. Vous observez des erreurs de bits qui dépendent de la fréquence et sont souvent intermittentes — elles apparaissent sous contrainte thermique ou lorsque la trace du PCB est plus longue que prévu.

Si votre horloge SPI dépasse 26 MHz, utilisez les broches par défaut de l'IO_MUX. La matrice GPIO n'est pas assez rapide au-dessus de ce seuil sur la plupart des variantes d'ESP32.

Les broches par défaut de l'IO_MUX pour chaque contrôleur SPI sont fixées dans le silicium. Vous ne pouvez pas les déplacer et conserver le chemin direct. Lorsque la disposition de la carte vous oblige à utiliser des broches non par défaut, la matrice GPIO gère le routage automatiquement — mais votre plafond d'horloge diminue. La plupart des conceptions de mémoires flash SPI, d'écrans et de capteurs restent bien en dessous de 26 MHz, le chemin de la matrice est donc acceptable. Les conceptions à haute vitesse, en particulier celles qui pilotent de grands écrans TFT à des taux de rafraîchissement complets, nécessitent les broches IO_MUX.

Caractéristiques électriques du bus SPI sur l'ESP32

Oscilloscope probe on ESP32 SPI clock trace showing 3.3V signal on development bench

Tous les pads GPIO de l'ESP32 fonctionnent en logique 3,3 V. Le niveau haut de sortie est généralement supérieur à 2,64 V. Le seuil haut d'entrée est d'environ 0,75 × VDD, soit environ 2,48 V. Les appareils qui nécessitent une logique SPI 5 V ont besoin d'une translation de niveau. C'est une omission courante lors de la connexion de l'ESP32 à d'anciens capteurs industriels ou à des modules de carte SD conçus pour des systèmes 5 V.

La force de commande est configurable par GPIO. Le réglage par défaut est de 20 mA maximum. Pour les signaux SPI pilotant de longues pistes ou plusieurs périphériques en parallèle, augmenter la force de commande au réglage de 40 mA réduit le temps de montée et améliore l'intégrité du signal à des fréquences d'horloge plus élevées. D'un autre côté, une force de commande élevée sur de courtes pistes augmente les EMI. La plupart des conceptions sur un PCB bien routé fonctionnent correctement au réglage par défaut.

Les lignes CS nécessitent des résistances de pull-up lorsque l'ESP32 ne les pilote pas activement. Pendant le démarrage et la réinitialisation, les sorties GPIO sont dans un état de haute impédance. Une ligne CS flottante peut s'activer accidentellement et corrompre l'état d'un périphérique. Un pull-up de 10 kΩ vers 3,3 V sur chaque ligne CS est une pratique courante. Évitez les pull-down sur CS, sauf si le périphérique nécessite explicitement une sélection de puce active-haute.

La fréquence d'horloge SPI maximale varie selon la variante et le chemin de routage. L'ESP32 d'origine atteint 80 MHz sur les chemins IO_MUX en mode maître. L'ESP32-S3 prend en charge jusqu'à 80 MHz sur SPI2 et SPI3 via IO_MUX. L'ESP32-C3 atteint 60 MHz sur son unique contrôleur SPI à usage général. Ce sont des limites de silicium. Les conceptions de cartes pratiques fonctionnent souvent 10 à 20 % en dessous du maximum pour laisser une marge pour l'impédance de trace et la capacité de charge.

Spécifications des broches SPI de l'ESP32 par contrôleur et variante

Affectations par défaut des broches SPI — ESP32 (WROOM / WROVER)

ESP32 WROOM module on breakout PCB with jumper wires connected to SPI GPIO headers

L'ESP32 d'origine dispose de quatre contrôleurs SPI. SPI0 et SPI1 sont réservés à l'accès interne à la mémoire flash et au PSRAM. Espressif les connecte aux GPIO6 à GPIO11 (et aux GPIO16-GPIO17 sur WROVER pour le PSRAM). Ces broches ne doivent jamais être réaffectées. Tenter de les utiliser comme signaux SPI à usage général entraîne des échecs de lecture de la mémoire flash ou des plantages système, souvent à des intervalles aléatoires difficiles à reproduire sur un banc de test.

Les deux contrôleurs accessibles par l'utilisateur sont HSPI (SPI2) et VSPI (SPI3). Leurs affectations par défaut de broches IO_MUX sont :

Contrôleur MOSI MISO CLK CS0
HSPI (SPI2) GPIO13 GPIO12 GPIO14 GPIO15
VSPI (SPI3) GPIO23 GPIO19 GPIO18 GPIO5

Les broches GPIO34 à GPIO39 sont des broches d'entrée uniquement. Elles n'ont pas de pilote de sortie. L'affectation de MOSI ou CLK à l'une de ces broches ne produit aucun signal sur le fil. C'est une erreur courante lorsque les ingénieurs choisissent des GPIO "disponibles" à partir d'un schéma de brochage sans vérifier le drapeau "entrée uniquement". MISO peut utiliser ces broches en toute sécurité, car MISO est toujours une entrée du côté maître.

Affectations des broches SPI — ESP32-S3, ESP32-S2 et ESP32-C3

L'ESP32-S3 WROOM-1 expose les interfaces SPI2 et SPI3 en tant que contrôleurs à usage général. Les broches IO_MUX par défaut pour SPI2 sont MOSI sur GPIO11, MISO sur GPIO13, CLK sur GPIO12 et CS sur GPIO10. Les valeurs par défaut de SPI3 sont MOSI sur GPIO35, MISO sur GPIO37, CLK sur GPIO36 et CS sur GPIO34. L'ESP32-S3 réserve également les GPIO26 à GPIO32 pour l'interface flash Octal-SPI interne sur les modules WROOM-1. Ces broches ne sont pas disponibles sur le connecteur périphérique du module et ne doivent pas être assignées aux bus SPI utilisateur.

L'ESP32-S2 fournit SPI2 comme contrôleur principal accessible par l'utilisateur. Les broches IO_MUX par défaut sont MOSI sur GPIO35, MISO sur GPIO37, CLK sur GPIO36 et CS sur GPIO34. La numérotation des broches diffère considérablement de celle de l'ESP32 d'origine, de sorte que les conceptions de cartes ne peuvent pas être portées directement sans une révision du remappage des broches.

L'ESP32-C3 dispose d'un seul contrôleur SPI à usage général (SPI2). Les broches IO_MUX par défaut sont MOSI sur GPIO7, MISO sur GPIO2, CLK sur GPIO6 et CS sur GPIO10. Le cœur RISC-V du C3 et son nombre réduit de broches en font un bon choix pour les conceptions à périphérique unique sensibles aux coûts, mais le contrôleur unique limite les topologies multi-périphériques.

Pour les équipes qui construisent du matériel HMI de production, il est utile de voir comment ces variantes se comportent dans les produits finis avant de s'engager sur une variante. Matériel HMI de production utilisant des périphériques ESP32 montre comment les écrans et périphériques connectés en SPI s'intègrent sur différents choix de modules ESP32.

Variante Contrôleurs SPI utilisateur Horloge IO_MUX Max Broches Flash réservées
ESP32 SPI2 (HSPI), SPI3 (VSPI) 80 MHz GPIO6–GPIO11
ESP32-S3 SPI2, SPI3 80 MHz GPIO26–GPIO32
ESP32-S2 SPI2 80 MHz GPIO26–GPIO32
ESP32-C3 SPI2 60 MHz GPIO12–GPIO17

Contraintes de broches, broches de configuration et affectations interdites

Plusieurs GPIO de chaque variante ESP32 ont un double rôle : ils transportent des signaux compatibles SPI pendant le fonctionnement normal, mais ils contrôlent également le comportement de démarrage lors de la réinitialisation. Espressif appelle ces broches des broches de configuration (strapping pins). La puce les échantillonne à la mise sous tension pour décider du mode de démarrage, de la tension de la flash et de la configuration JTAG. L'affectation de ces broches aux lignes SPI CS — où des périphériques externes pourraient les tirer à l'état bas au démarrage — provoque des échecs de démarrage qui ressemblent à des défauts matériels.

Sur l'ESP32 d'origine, les broches de configuration critiques sont :

  • GPIO0 — sélection du mode de démarrage (bas = mode téléchargement)
  • GPIO2 — doit être bas ou flottant pendant le mode téléchargement
  • GPIO5 — sélection du timing SDIO, également VSPI CS0 par défaut
  • GPIO12 — sélection de la tension de flash (MTDI), également par défaut HSPI MISO
  • GPIO15 — signal JTAG, également par défaut HSPI CS0

GPIO12 mérite une attention particulière sur les modules WROVER. Si GPIO12 est mis à l'état haut au démarrage, l'ESP32 s'attend à une flash de 1,8 V. La plupart des modules utilisent une flash de 3,3 V. La mise à l'état haut de GPIO12 via la sortie d'un périphérique SPI provoque une inadéquation de la tension de flash et le module ne parvient pas à démarrer. Ce problème est intermittent si le périphérique SPI ne commande le MISO à l'état haut qu'occasionnellement au démarrage — ce qui en fait l'un des échecs de démarrage les plus difficiles à reproduire de manière cohérente.

Sur l'ESP32-S3, les broches de strapping incluent GPIO0, GPIO3, GPIO45 et GPIO46. Sur l'ESP32-C3, GPIO2, GPIO8 et GPIO9 sont des broches de strapping. Vérifiez toujours la liste des broches de strapping dans le manuel de référence technique pertinent avant d'attribuer des lignes CS.

Configuration et câblage des broches SPI de l'ESP32 en pratique

Remappage des broches SPI dans le firmware — Comment fonctionne l'affectation de la matrice GPIO

Lorsque vous initialisez un bus SPI dans ESP-IDF en utilisant spi_bus_initialize(), vous passez une structure de configuration qui spécifie les numéros GPIO pour MOSI, MISO, CLK et éventuellement CS. Si ces numéros correspondent aux valeurs par défaut de l'IO_MUX pour l'hôte choisi, ESP-IDF achemine les signaux par le chemin direct automatiquement. S'ils diffèrent, le pilote achemine via la matrice GPIO sans aucune configuration supplémentaire de votre part.

Une initialisation de bus représentative ressemble à ceci :

/* Illustrative only — not a production-ready snippet */
spi_bus_config_t buscfg = {
.mosi_io_num = 23, /* VSPI default — IO_MUX path */
.miso_io_num = 19,
.sclk_io_num = 18,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 4096,
};
spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO);

Le SPI_DMA_CH_AUTO paramètre permet au pilote de sélectionner un canal DMA. Sur ESP32, SPI2 et SPI3 partagent les canaux DMA 1 et 2. L'affectation des deux bus au même canal DMA provoque des conflits de transfert. Si vous exécutez deux bus SPI simultanément, affectez explicitement les canaux ou utilisez SPI_DMA_CH_AUTO sur les deux et vérifiez que le pilote attribue des canaux différents.

La décision entre les broches IO_MUX et remappées dépend de la fréquence d'horloge. En dessous de 26 MHz, le chemin de la matrice GPIO est fiable sur toutes les variantes. Au-dessus, utilisez les broches par défaut IO_MUX. Pour une image complète des capacités GPIO au-delà du SPI — y compris les registres de force d'entraînement, les indicateurs d'entrée uniquement et le comportement des GPIO RTC — consultez la référence Rôles des broches GPIO ESP32 et limites électriques .

Connexion de plusieurs périphériques SPI avec des lignes CS distinctes

ESP32 board wired to two SPI devices sharing MOSI MISO CLK with separate CS lines

Un bus SPI partagé place MOSI, MISO et CLK en commun sur tous les périphériques. Chaque périphérique dispose de sa propre ligne CS. Le maître met CS à l'état bas pour sélectionner un périphérique, termine la transaction, puis remet CS à l'état haut avant de sélectionner un autre périphérique. Cette topologie fonctionne bien pour les écrans, les puces flash, les capteurs et les CAN sur le même bus — tant que les lignes CS sont gérées correctement.

La sélection des broches CS suit les mêmes règles que tout autre GPIO de sortie : éviter les broches de démarrage (strapping pins), éviter les GPIO uniquement en entrée (GPIO34–GPIO39 sur l'ESP32 d'origine) et éviter les broches connectées à la flash. Au-delà de ces contraintes, tout GPIO disponible convient. Choisissez des broches physiquement proches des périphériques sur le PCB pour maintenir les longueurs de trace CS courtes et réduire le couplage.

Dans le firmware, ESP-IDF gère CS automatiquement lorsque vous enregistrez chaque périphérique avec spi_bus_add_device() et fournissez le numéro du GPIO CS dans la configuration du périphérique. Le pilote active et désactive CS autour de chaque transfert. L'activation/désactivation manuelle de CS n'est nécessaire que pour les périphériques ayant des exigences de synchronisation non standard — par exemple, certains capteurs nécessitent un temps CS haut minimum entre les transactions qui dépasse la période de désactivation par défaut du pilote.

Description du câblage d'un bus à deux périphériques : connectez MOSI, MISO et CLK de l'ESP32 aux deux périphériques en parallèle. Exécutez un fil séparé depuis deux sorties GPIO différentes vers la broche CS de chaque périphérique. Ajoutez une résistance de rappel de 10 kΩ de chaque ligne CS vers 3,3 V. Gardez les traces MISO aussi courtes que possible — les longues traces MISO provenant de plusieurs périphériques créent une charge capacitive qui dégrade les fronts de signal à des fréquences d'horloge plus élevées.

Diagnostic des problèmes de câblage et de signal SPI

Logic analyzer probes on ESP32 SPI bus lines with decoded waveforms shown on laptop screen

Une mauvaise affectation des broches produit une défaillance totale : le périphérique ne répond jamais, le bus ne montre aucune activité d'horloge, ou le firmware renvoie une erreur lors du premier transfert. Vérifiez les numéros GPIO dans la configuration de votre bus par rapport aux connexions PCB réelles. Vérifiez ensuite qu'aucune des broches affectées ne tombe dans les catégories uniquement en entrée ou réservées à la flash.

Les problèmes de vitesse d'horloge se manifestent différemment. Le bus s'initialise et les premières transactions réussissent. Ensuite, des erreurs apparaissent de manière aléatoire — octets corrompus, trames partielles ou échecs de CRC. Ces erreurs augmentent avec la température et disparaissent souvent lorsque vous ralentissez l'horloge de moitié. Ce schéma indique une broche routée via la matrice GPIO fonctionnant au-dessus de son plafond de fréquence fiable. La solution consiste soit à abaisser l'horloge, soit à passer aux broches par défaut IO_MUX.

Un analyseur logique est l'outil le plus utile pour le débogage SPI. Vérifiez ces points dans l'ordre :

  • Polarité de l'horloge (CPOL) et phase (CPHA) — une incompatibilité entraîne une erreur sur chaque octet
  • État actif du CS — la plupart des périphériques sont actifs à l'état bas ; un CS actif à l'état haut ne s'affirme jamais correctement
  • État de la ligne MISO lorsque le périphérique n'est pas sélectionné — un MISO flottant crée du bruit qui corrompt la lecture suivante
  • Temporisation de désactivation du CS — certains périphériques nécessitent que le CS soit à l'état haut pendant une période minimale avant la transaction suivante

Un MISO flottant est un problème récurrent sur les bus multi-périphériques. Lorsqu'un périphérique est sélectionné, les autres doivent mettre leurs sorties MISO en état de haute impédance. Les périphériques qui ne se mettent pas correctement en état de haute impédance pilotent le MISO même lorsque leur CS est à l'état haut, corrompant les lectures du périphérique sélectionné. Vérifiez la fiche technique du comportement MISO de chaque périphérique lorsqu'il est désélectionné. Si un périphérique ne dispose pas d'une sortie à haute impédance appropriée, il nécessite un commutateur de bus ou une ligne MISO séparée.

Verrouillage du bus — où le contrôleur SPI cesse de répondre et nécessite une réinitialisation — remonte généralement à une erreur de configuration DMA ou à une transaction qui n'a jamais été terminée car le CS est resté actif. L'ajout d'une réinitialisation par watchdog en cas de dépassement du délai d'attente SPI est une pratique courante dans les firmwares de production. Un délai d'attente compris entre 100 et 500 ms couvre la plupart des transferts longs légitimes tout en détectant les conditions de bus bloqué avant qu'elles n'affectent l'application.

Choisir la bonne configuration de broches SPI pour votre conception

Cadre de décision — Broches par défaut vs. Réaffectation personnalisée vs. Sélection de variante

Quatre critères orientent la décision de configuration des broches SPI pour la plupart des conceptions ESP32.

Exigence de fréquence d'horloge. Si votre périphérique SPI nécessite plus de 26 MHz — courant pour les écrans TFT haute résolution ou les ADC rapides — vous devez utiliser les broches par défaut IO_MUX. Il n'y a pas de solution de contournement par micrologiciel. Si votre horloge reste inférieure à 20 MHz, n'importe quelle broche capable de GPIO fonctionne et la disposition de la carte peut orienter le choix librement.

Nombre de périphériques SPI. Un seul périphérique sur un bus dédié est simple. Deux périphériques ou plus sur un bus partagé nécessitent une sélection minutieuse de la broche CS et une vérification du tri-state MISO. Si votre conception nécessite trois bus SPI indépendants ou plus — par exemple, un bus d'affichage, un bus de capteur et une carte SD — l'ESP32 d'origine ou l'ESP32-S3 (tous deux avec deux contrôleurs SPI utilisateur) gèrent mieux cela que l'ESP32-C3, qui n'en a qu'un.

Capacité de la variante. Choisissez l'ESP32-S3 lorsque la conception nécessite une mémoire flash Octal-SPI pour de grands tampons d'image, ou lorsque des périphériques SPI à grand nombre de broches sont impliqués. Le plus grand nombre de GPIO et les contrôleurs SPI doubles du S3 en font le choix naturel pour les conceptions HMI complexes. Choisissez l'ESP32-C3 lorsque la conception dispose d'un seul périphérique SPI, que le coût est la contrainte principale et que la vitesse d'horloge reste confortablement en dessous de 40 MHz.

Flexibilité de la disposition de la carte. Lorsque les contraintes du circuit imprimé empêchent l'utilisation des broches par défaut IO_MUX et que l'horloge reste inférieure à 26 MHz, le remappage de la matrice GPIO est une solution propre. Documentez explicitement le remappage dans les notes de conception matérielle. Les ingénieurs qui déboguent ultérieurement la carte doivent savoir quelles broches transportent les signaux SPI — le tableau de broches par défaut dans la fiche technique ne correspondra pas à la conception réelle.

Si votre conception pilote un écran connecté en SPI et que vous devez vérifier que l'horloge et la résolution choisies correspondent à la bande passante du bus, calculez les exigences de bande passante de l'écran SPI avant de finaliser la configuration de l'horloge.

Le choix de la bonne configuration des broches SPI est un choix de conception qui s'accumule. Une mauvaise décision au stade du schéma — une ligne CS sur une broche de sélection de démarrage, une horloge de 40 MHz sur une broche routée par la matrice — prend des heures à diagnostiquer et nécessite parfois une republication du circuit imprimé. Les schémas qui causent ces défaillances se répètent dans les équipes de développement de produits embarqués. Examinez le tableau des contraintes de broches, vérifiez les broches de sélection de démarrage par rapport à vos affectations CS, et validez le comportement de tri-state MISO pour chaque appareil sur un bus partagé avant que la disposition ne soit finalisée.

Pour les conceptions destinées à la production, la discipline du processus est aussi importante que l'exactitude technique. Les équipes d'ingénierie STONE HMI suivent des pratiques alignées sur la norme IEC 61508. Ce type d'approche structurée réduit le risque que des erreurs d'affectation de broches atteignent le matériel fabriqué, où le coût de correction est bien plus élevé que celui de la détection du problème lors de la revue de conception.