ESP32 SPI Pins Pinout, Specifiche e Configurazione
Cosa Sono Effettivamente i Pin SPI dell'ESP32
SPI su ESP32 — Bus a Quattro Fili, Quattro Controller, Una GPIO Matrix
I team che costruiscono display o sensori collegati tramite SPI sull'ESP32 incontrano un problema comune: il dispositivo si inizializza correttamente sul banco, poi fallisce in modo intermittente in produzione. I sintomi variano: frame del display corrotti, un sensore che smette di rispondere dopo alcune ore, un bus che si blocca sotto carico DMA. La causa principale è spesso la stessa. Qualcuno ha assegnato segnali SPI a pin che entrano in conflitto con funzioni di strapping, o ha instradato un clock di 40 MHz attraverso la GPIO Matrix quando il percorso IO_MUX era disponibile e necessario.
L'ESP32 differisce dagli MCU con pin fissi come STM32 o AVR perché la maggior parte dei suoi segnali SPI può essere instradata a quasi tutte le GPIO. Questa flessibilità è veramente utile per il layout del PCB. Crea anche un più ampio spazio di scelte errate. Capire quali pin sono sicuri, quali comportano penalità di prestazioni e quali sono completamente vietati è il fondamento di un design SPI affidabile.
Questa pagina copre il panorama completo dei pin SPI per l'ESP32: tabelle dei pin di default per tutte le varianti principali, regole di rimappatura e i loro limiti, caratteristiche elettriche, cablaggio multi-dispositivo e un quadro decisionale per scegliere la configurazione corretta.
Come Funziona l'SPI dell'ESP32 a Livello Hardware
La GPIO Matrix e Perché i Pin SPI dell'ESP32 Non Sono Fissi
L'ESP32 fornisce due percorsi di routing interni per i segnali periferici. L'IO_MUX è una connessione diretta tra una periferica e un pad GPIO specifico. Aggiunge un ritardo minimo e supporta la piena frequenza di clock che la periferica può generare. La GPIO Matrix è uno switch crossbar che consente a qualsiasi segnale periferico di connettersi a quasi tutti i GPIO. Aggiunge circa un ciclo di clock APB di ritardo in ciascuna direzione.
Per l'SPI, quel ritardo aggiuntivo è importante a frequenze di clock elevate. La documentazione di Espressif colloca il limite pratico per l'SPI instradato tramite GPIO Matrix intorno ai 26 MHz sull'ESP32 originale. Al di sopra di questa soglia, i tempi di setup e hold si degradano. Si verificano errori di bit dipendenti dalla frequenza e spesso intermittenti — emergono sotto stress termico o quando la traccia del PCB è più lunga del previsto.
Se il tuo clock SPI supera i 26 MHz, utilizza i pin predefiniti IO_MUX. La GPIO Matrix non è abbastanza veloce al di sopra di questa soglia sulla maggior parte delle varianti ESP32.
I pin predefiniti IO_MUX per ogni controller SPI sono fissi nel silicio. Non puoi spostarli e mantenere il percorso diretto. Quando il layout della scheda ti costringe a utilizzare pin non predefiniti, la GPIO Matrix gestisce automaticamente il routing — ma il tuo soffitto di frequenza di clock si abbassa. La maggior parte dei progetti SPI flash, display e sensori rimane ben al di sotto dei 26 MHz, quindi il percorso della matrix è accettabile. I progetti ad alta velocità, in particolare quelli che pilotano grandi display TFT a piena frequenza di aggiornamento, necessitano dei pin IO_MUX.
Caratteristiche Elettriche del Bus SPI su ESP32

Tutti i pad GPIO dell'ESP32 operano a logica a 3.3 V. Il livello alto in uscita è tipicamente superiore a 2.64 V. La soglia alta di ingresso è di circa 0.75 × VDD, quindi approssimativamente 2.48 V. I dispositivi che richiedono logica SPI a 5 V necessitano di un level translator. Questa è una svista comune quando si collega l'ESP32 a vecchi sensori industriali o moduli di schede SD progettati per sistemi a 5 V.
La corrente di pilotaggio è configurabile per ogni GPIO. L'impostazione predefinita è 20 mA massimo. Per i segnali SPI che pilotano tracce lunghe o più dispositivi in parallelo, aumentare la corrente di pilotaggio all'impostazione di 40 mA riduce il tempo di salita e migliora l'integrità del segnale a frequenze di clock più elevate. D'altra parte, un'elevata corrente di pilotaggio su tracce corte aumenta le EMI. La maggior parte dei progetti su un PCB ben instradato funziona bene con l'impostazione predefinita.
Le linee CS richiedono resistori di pull-up quando l'ESP32 non le sta pilotando attivamente. Durante l'avvio e il reset, le uscite GPIO sono in uno stato di alta impedenza. Una linea CS flottante può attivarsi accidentalmente e corrompere lo stato di un dispositivo. Un pull-up da 10 kΩ a 3,3 V su ciascuna linea CS è una pratica standard. Evitare i pull-down su CS a meno che il dispositivo non richieda esplicitamente la selezione attiva alta del chip.
La frequenza massima del clock SPI varia in base alla variante e al percorso di routing. L'ESP32 originale raggiunge 80 MHz sui percorsi IO_MUX in modalità master. ESP32-S3 supporta fino a 80 MHz su SPI2 e SPI3 tramite IO_MUX. ESP32-C3 raggiunge al massimo 60 MHz sul suo singolo controller SPI per scopi generali. Questi sono limiti del silicio. I progetti pratici delle schede spesso funzionano dal 10% al 20% al di sotto del massimo per lasciare margine all'impedenza della traccia e alla capacità di carico.
Specifiche dei pin SPI ESP32 per controller e variante
Assegnazioni predefinite dei pin SPI — ESP32 (WROOM / WROVER)

L'ESP32 originale dispone di quattro controller SPI. SPI0 e SPI1 sono riservati per l'accesso alla flash interna e al PSRAM. Espressif li collega ai GPIO6 tramite GPIO11 (e GPIO16–GPIO17 su WROVER per PSRAM). Questi pin non devono mai essere riassegnati. Tentare di utilizzarli come segnali SPI per scopi generali causa fallimenti nella lettura della flash o crash di sistema, spesso a intervalli casuali difficili da riprodurre in laboratorio.
I due controller accessibili all'utente sono HSPI (SPI2) e VSPI (SPI3). Le loro assegnazioni predefinite dei pin IO_MUX sono:
| Controller | MOSI | MISO | CLK | CS0 |
|---|---|---|---|---|
| HSPI (SPI2) | GPIO13 | GPIO12 | GPIO14 | GPIO15 |
| VSPI (SPI3) | GPIO23 | GPIO19 | GPIO18 | GPIO5 |
I pin GPIO da GPIO34 a GPIO39 sono solo di input. Non dispongono di driver di output. L'assegnazione di MOSI o CLK a uno qualsiasi di questi pin non produce alcun segnale sul cavo. Questo è un errore comune quando gli ingegneri selezionano GPIO "disponibili" da un diagramma di pinout senza controllare il flag solo di input. MISO può utilizzare questi pin in sicurezza, poiché MISO è sempre un input sul lato master.
Assegnazioni pin SPI — ESP32-S3, ESP32-S2 ed ESP32-C3
ESP32-S3 WROOM-1 espone SPI2 e SPI3 come controller general-purpose. I pin IO_MUX predefiniti per SPI2 sono MOSI su GPIO11, MISO su GPIO13, CLK su GPIO12 e CS su GPIO10. Le impostazioni predefinite di SPI3 sono MOSI su GPIO35, MISO su GPIO37, CLK su GPIO36 e CS su GPIO34. ESP32-S3 riserva inoltre i GPIO da 26 a 32 per l'interfaccia flash Octal-SPI interna sui moduli WROOM-1. Questi pin non sono disponibili sul connettore edge del modulo e non devono essere assegnati ai bus SPI dell'utente.
ESP32-S2 fornisce SPI2 come controller primario accessibile dall'utente. I pin IO_MUX predefiniti sono MOSI su GPIO35, MISO su GPIO37, CLK su GPIO36 e CS su GPIO34. La numerazione dei pin differisce significativamente dall'ESP32 originale, pertanto i design delle schede non possono essere portati direttamente senza una revisione del remapping dei pin.
ESP32-C3 dispone di un singolo controller SPI general-purpose (SPI2). I pin IO_MUX predefiniti sono MOSI su GPIO7, MISO su GPIO2, CLK su GPIO6 e CS su GPIO10. Il core RISC-V del C3 e il ridotto numero di pin lo rendono una buona scelta per progetti a basso costo con un singolo periferico, ma il controller singolo limita le topologie multi-dispositivo.
Per i team che costruiscono hardware HMI di produzione, è utile vedere come queste varianti si comportano nei prodotti finiti prima di impegnarsi in una variante. Hardware HMI di produzione utilizzando periferiche ESP32 mostra come display e periferiche collegati tramite SPI si integrano tra diverse scelte di moduli ESP32.
| Variante | Controller SPI utente | Clock IO_MUX Massimo | Pin Flash Riservati |
|---|---|---|---|
| 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 |
Vincoli dei pin, pin di strapping e assegnazioni vietate
Diverse GPIO su ciascuna variante di ESP32 svolgono un duplice ruolo: trasportano segnali SPI-compatibili durante il normale funzionamento, ma controllano anche il comportamento di avvio durante il reset. Espressif chiama questi pin di strapping. Il chip li campiona all'accensione per decidere la modalità di avvio, la tensione della flash e la configurazione JTAG. Assegnare questi pin alle linee SPI CS — dove i dispositivi esterni potrebbero portarli a livello basso all'avvio — causa errori di avvio che appaiono come guasti hardware.
Sull'originale ESP32, i pin di strapping critici sono:
- GPIO0 — selezione modalità di avvio (basso = modalità download)
- GPIO2 — deve essere basso o flottante durante la modalità download
- GPIO5 — selezione temporizzazione SDIO, anche VSPI CS0 predefinito
- GPIO12 — selezione tensione flash (MTDI), anche HSPI MISO di default
- GPIO15 — segnale JTAG, anche HSPI CS0 di default
GPIO12 merita particolare attenzione sui moduli WROVER. Se GPIO12 è portato ad alto livello all'avvio, l'ESP32 si aspetta una flash da 1,8 V. La maggior parte dei moduli utilizza flash da 3,3 V. Portare GPIO12 ad alto livello tramite l'uscita di un dispositivo SPI causa un disallineamento della tensione della flash e il modulo non si avvia. Questo problema è intermittente se il dispositivo SPI pilota MISO ad alto livello solo occasionalmente all'avvio, rendendolo uno dei problemi di avvio più difficili da riprodurre in modo consistente.
Su ESP32-S3, i pin di strapping includono GPIO0, GPIO3, GPIO45 e GPIO46. Su ESP32-C3, GPIO2, GPIO8 e GPIO9 sono pin di strapping. Controllare sempre l'elenco dei pin di strapping nel manuale di riferimento tecnico pertinente prima di assegnare le linee CS.
Configurazione e cablaggio dei pin SPI di ESP32 in pratica
Riassegnazione dei pin SPI nel firmware — Come funziona l'assegnazione della matrice GPIO
Quando si inizializza un bus SPI in ESP-IDF utilizzando spi_bus_initialize(), si passa una struttura di configurazione che specifica i numeri GPIO per MOSI, MISO, CLK e opzionalmente CS. Se tali numeri corrispondono ai valori predefiniti di IO_MUX per l'host scelto, ESP-IDF instrada i segnali attraverso il percorso diretto automaticamente. Se differiscono, il driver instrada attraverso la matrice GPIO senza alcuna configurazione aggiuntiva da parte tua.
Una inizializzazione del bus di esempio è la seguente:
/* 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);
Il SPI_DMA_CH_AUTO parametro consente al driver di selezionare un canale DMA. Su ESP32, SPI2 e SPI3 condividono i canali DMA 1 e 2. L'assegnazione di entrambi i bus allo stesso canale DMA causa conflitti di trasferimento. Se si eseguono due bus SPI contemporaneamente, assegnare esplicitamente i canali o utilizzare SPI_DMA_CH_AUTO su entrambi e verificare che il driver assegni canali diversi.
La decisione tra pin IO_MUX e pin rimappati dipende dalla frequenza di clock. Al di sotto dei 26 MHz, il percorso della matrice GPIO è affidabile su tutte le varianti. Al di sopra, utilizzare i pin predefiniti IO_MUX. Per un quadro completo delle capacità GPIO oltre SPI, inclusi i registri di drive strength, i flag di sola lettura e il comportamento dei GPIO RTC, consultare il riferimento ruoli dei pin GPIO ESP32 e limiti elettrici .
Collegamento di più dispositivi SPI con linee CS separate

Un bus SPI condiviso colloca MOSI, MISO e CLK in comune a tutti i dispositivi. Ogni dispositivo ottiene la propria linea CS. Il master porta CS a livello basso per selezionare un dispositivo, completa la transazione, quindi porta CS a livello alto prima di selezionare un altro dispositivo. Questa topologia funziona bene per display, chip flash, sensori e ADC sullo stesso bus, purché le linee CS siano gestite correttamente.
La selezione del pin CS segue le stesse regole di qualsiasi altro GPIO di output: evitare pin di strapping, evitare GPIO solo in ingresso (GPIO34–GPIO39 sull'originale ESP32) ed evitare pin connessi alla flash. Oltre a questi vincoli, qualsiasi GPIO disponibile funziona. Scegliere pin fisicamente vicini ai dispositivi sul PCB per mantenere le lunghezze delle tracce CS corte e ridurre l'accoppiamento.
Nel firmware, ESP-IDF gestisce automaticamente il CS quando si registra ogni dispositivo con spi_bus_add_device() e si fornisce il numero del GPIO CS nella configurazione del dispositivo. Il driver asserisce e deasserisce il CS prima e dopo ogni trasferimento. L'oscillazione manuale del CS è necessaria solo per dispositivi con requisiti di temporizzazione non standard, ad esempio, alcuni sensori richiedono un tempo minimo di CS alto tra le transazioni che supera il periodo di deasserimento predefinito del driver.
Descrizione del cablaggio di un bus a due dispositivi: collegare MOSI, MISO e CLK dall'ESP32 a entrambi i dispositivi in parallelo. Eseguire un filo separato da due diverse uscite GPIO al pin CS di ciascun dispositivo. Aggiungere una resistenza di pull-up da 10 kΩ da ciascuna linea CS a 3,3 V. Mantenere le tracce MISO il più corte possibile; tracce MISO lunghe da più dispositivi creano un carico capacitivo che degrada i fronti del segnale a frequenze di clock più elevate.
Diagnosi dei problemi di cablaggio e segnale SPI

Un'assegnazione errata dei pin produce un fallimento totale: il dispositivo non risponde mai, il bus non mostra attività di clock o il firmware restituisce un errore al primo trasferimento. Controllare i numeri GPIO nella configurazione del bus rispetto alle connessioni effettive del PCB. Verificare quindi che nessuno dei pin assegnati rientri nelle categorie solo in ingresso o riservate alla flash.
I problemi di velocità di clock si manifestano in modo diverso. Il bus si inizializza e i primi trasferimenti hanno successo. Quindi compaiono errori casuali: byte corrotti, frame parziali o fallimenti CRC. Questi errori aumentano con la temperatura e spesso scompaiono quando si rallenta il clock della metà. Questo schema indica un pin instradato tramite la Matrice GPIO che funziona al di sopra del suo limite di frequenza affidabile. La soluzione è ridurre il clock o passare ai pin predefiniti IO_MUX.
Un analizzatore logico è lo strumento più utile per il debug SPI. Controlla questi punti in ordine:
- Polarità CLK (CPOL) e fase (CPHA) — la discrepanza causa errori in ogni byte
- Stato attivo di CS — la maggior parte dei dispositivi è active-low; CS active-high non si asserisce mai correttamente
- Stato della linea MISO quando il dispositivo non è selezionato — un MISO flottante crea rumore che corrompe la lettura successiva
- Tempistica di de-asserzione CS — alcuni dispositivi richiedono CS alto per un periodo minimo prima della transazione successiva
Un MISO flottante è un problema ricorrente su bus con più dispositivi. Quando un dispositivo viene selezionato, gli altri devono mettere in tri-state le proprie uscite MISO. I dispositivi che non attuano correttamente il tri-state pilotano il MISO anche quando il loro CS è alto, corrompendo le letture dal dispositivo selezionato. Controlla il datasheet per il comportamento MISO di ciascun dispositivo quando deselezionato. Se un dispositivo non dispone di un'uscita tri-state appropriata, necessita di uno switch bus o di una linea MISO separata.
Blocco bus — in cui il controller SPI smette di rispondere e richiede un reset — solitamente risale a un errore di configurazione DMA o a una transazione mai completata perché CS è rimasto asserito. L'aggiunta di un watchdog reset in caso di timeout SPI è una pratica standard nel firmware di produzione. Un timeout nell'intervallo di 100–500 ms copre la maggior parte dei trasferimenti lunghi legittimi, rilevando al contempo condizioni di bus bloccato prima che influiscano sull'applicazione.
Scelta della configurazione dei pin SPI corretta per il tuo progetto
Framework decisionale — Pin predefiniti vs. Riconfigurazione personalizzata vs. Selezione variante
Quattro criteri guidano la decisione di configurazione dei pin SPI per la maggior parte dei progetti ESP32.
Requisito di frequenza di clock. Se la tua periferica SPI necessita di più di 26 MHz — comune per display TFT ad alta risoluzione o ADC veloci — devi utilizzare i pin predefiniti IO_MUX. Non esiste una soluzione alternativa tramite firmware. Se il tuo clock rimane al di sotto dei 20 MHz, qualsiasi pin abilitato per GPIO funziona e il layout della scheda può guidare liberamente la scelta.
Numero di dispositivi SPI. Un singolo dispositivo su un bus dedicato è semplice. Due o più dispositivi su un bus condiviso richiedono un'attenta selezione dei pin CS e una verifica del tri-state MISO. Se il tuo progetto necessita di tre o più bus SPI indipendenti — ad esempio, un bus per display, un bus per sensori e una scheda SD — l'ESP32 o l'ESP32-S3 originali (entrambi con due controller SPI utente) gestiscono meglio questo aspetto rispetto all'ESP32-C3, che ne ha solo uno.
Capacità della variante. Scegliere ESP32-S3 quando il progetto richiede flash Octal-SPI per framebuffer di grandi dimensioni o quando sono coinvolte periferiche SPI ad alto numero di pin. L'elevato numero di GPIO e i controller SPI doppi dell'S3 lo rendono la scelta naturale per progetti HMI complessi. Scegliere ESP32-C3 quando il progetto ha una singola periferica SPI, il costo è il vincolo principale e la velocità di clock rimane comodamente al di sotto dei 40 MHz.
Flessibilità del layout della scheda. Quando i vincoli del PCB impediscono l'uso dei pin predefiniti di IO_MUX e il clock rimane al di sotto dei 26 MHz, la rimappatura della matrice GPIO è una soluzione pulita. Documentare esplicitamente la rimappatura nelle note di progettazione hardware. Gli ingegneri che in seguito eseguono il debug della scheda devono sapere quali pin trasportano i segnali SPI: la tabella dei pin predefinita nel datasheet non corrisponderà al progetto effettivo.
Se il tuo progetto pilota un display connesso tramite SPI e hai bisogno di verificare che il clock e la risoluzione scelti rientrino nella larghezza di banda del bus, calcola i requisiti di larghezza di banda del display SPI prima di finalizzare la configurazione del clock.
La selezione della corretta configurazione dei pin SPI è una scelta di progettazione che si accumula. Una decisione errata nella fase di schema — una linea CS su un pin di strapping, un clock a 40 MHz su un pin instradato dalla matrice — richiede ore per la diagnosi e talvolta la riprogettazione del PCB. I pattern che causano questi fallimenti si ripetono nei team di sviluppo di prodotti embedded. Rivedere la tabella dei vincoli dei pin, controllare i pin di strapping rispetto alle assegnazioni CS e verificare il comportamento tri-state di MISO per ogni dispositivo su un bus condiviso prima che il layout sia finalizzato.
Per i progetti destinati alla produzione, la disciplina del processo è importante quanto la correttezza tecnica. I team di ingegneri STONE HMI seguono pratiche allineate allo standard IEC 61508. Quel tipo di approccio strutturato riduce il rischio che errori di assegnazione dei pin raggiungano l'hardware prodotto, dove il costo di correzione è molto più elevato rispetto alla risoluzione del problema in fase di revisione del progetto.