Guide di ingegneria
I²C vs SPI per sensori di pressione: scegli il bus giusto o odi il tuo layout più tardi
Hai scelto il tuo sensore di pressione. Conosci la portata, la precisione, il pacchetto. Quindi vedrai due varianti nella pagina dell'ordine: I²c E Sp. Stesso sensore. Stesso prezzo. Quattro lettere diverse. Ecco come decidere: con numeri reali, non con la teoria dei libri di testo.
L'aggiornamento di due minuti
Salta questo se hai già collegato entrambi i bus in precedenza. Se non l'hai fatto, ecco abbastanza per seguire il resto dell'articolo:
- Fili: 2 — SDA (dati) + SCL (orologio)
- Tipo di segnale: Drain aperto, tirato in alto con resistori
- Indirizzamento: Indirizzo a 7 bit per dispositivo
- Direzione: Half-duplex
- Velocità: 100 kHz / 400 kHz / 1 MHz / 3,4 MHz
- Controllare: Iniziato dal Maestro; gli schiavi rispondono solo quando vengono indirizzati
- Fili: 4 — MOSI, MISO, SCLK + 1× CS per device
- Tipo di segnale: CMOS push-pull
- Indirizzamento: Nessuno: la linea CS seleziona il dispositivo
- Direzione: Full duplex
- Velocità: Da 1 MHz a 50 MHz
- Controllare: Il master controlla l'orologio; nessun allungamento dell'orologio
A questo punto potresti pensare: "SPI is faster, so SPI wins, end of article." Non proprio: la velocità non è quasi mai importante per un sensore di pressione. Ecco perché.
L'argomento della velocità che non conta
Un tipico sensore di pressione MEMS effettua una lettura ogni Da 1 a 100 millisecondi — prevale il tempo di conversione dell'ADC, non la velocità del bus. Anche a 1 ms per campione (campionamento da 1 kHz), stai spingendo forse 48 bit per lettura. Questo è 48 kbps.
I²C a 400 kHz trasferisce ~320 kbps dopo l'overhead. SPI a 1 MHz trasferisce 1 Mbps. Uno dei due lo è Da 7× a 20× più veloce rispetto alla velocità dati del sensore. A meno che non si stia campionando a frequenze ultrasoniche – cosa che non è, perché la pressione non cambia così velocemente – la velocità del bus è irrilevante. Il sensore è il collo di bottiglia, non i fili.
In conclusione sulla velocità: non importa. L'ADC del sensore è il fattore limitante. Decidi per altri motivi.
Conteggio dei pin: l'argomento che conta davvero sulle piccole schede
| Scenario | Pin I²C utilizzati | Pin SPI utilizzati |
|---|---|---|
| 1 sensore | 2(SDA+SCL) | 4 (MOSI + MISO + SCLK + CS) |
| 2 sensori | 2 (autobus condiviso) | 5 (autobus condiviso + 2× CS) |
| 4 sensori | 2 (autobus condiviso) | 7 (autobus condiviso + 4× CS) |
Se il tuo MCU è un STM32 con 80 GPIO, chi se ne frega. Ma su un ESP32-C3 con 15 GPIO utilizzabili che esegue un display, BLE, due pulsanti e una scheda SD: quei 2 pin extra per la funzione SPI. I²C ti fa risparmiare pin indipendentemente dal numero di sensori che condividono il bus.
Nota: I²C ti costa due resistenze di pull-up. Lo SPI non costa nulla. Due resistori 0402 da 4,7 kΩ costano circa 0,002 dollari in totale e occupano 2 mm² di spazio sulla scheda: non niente, ma quasi.
In conclusione sui pin: I²C vince quando i GPIO sono stretti. Con un MCU ricco di pin, il vantaggio scompare: decidi su altri fattori.
Progetti multi-sensore: dove l'I²C brilla davvero
Tre sensori di pressione sullo stesso PCB: un riferimento barometrico, un livello del serbatoio, un'uscita della pompa. Con I²C: assegnare a ciascun sensore un indirizzo diverso, collegare SDA e SCL in parallelo, fatto. Due tracce. Tre sensori. Zero pin MCU aggiuntivi. Con SPI: tre linee CS separate sopra il MOSI/MISO/SCLK condiviso: sei fili in totale.
Attento: I dispositivi I²C necessitano di indirizzi univoci. La maggior parte dei sensori di pressione offre esattamente due indirizzi (uno spillo legato in alto o in basso). Ciò significa che avrai due sensori sul bus prima di aver bisogno di un multiplexer I²C come il TCA9548A, che aggiunge ~$ 0,50 e qualche mm². Lo SPI non ha tale limite; basta aggiungere una linea CS per sensore.
In conclusione sul multisensore: I²C vince per la semplicità di cablaggio fino a due sensori identici. Oltre a ciò, usa SPI o un mux I²C: nessuno dei due è chiaramente migliore, è una chiamata di layout.
Immunità al rumore: quella in cui SPI avanza
I sensori di pressione ad alta risoluzione misurano variazioni fino a 0,03 hPa, più o meno il peso di una zanzara che atterra sulla tua scrivania, tradotto in un segnale elettrico. A quella risoluzione, il rumore conta.
Caratteristiche del rumore I²C
Le linee open-drain con resistori pull-up producono bordi di rampa RC, non transizioni CMOS pulite. I valori di pull-up sono un compromesso: troppo forte spreca potenza; troppo debole rallenta il tempo di salita e apre una finestra per l'accoppiamento del rumore. In un ambiente rumoroso, accanto a un driver del motore, un regolatore di commutazione o qualsiasi cosa con PWM, l'I²C può presentare problemi. Il protocollo non prevede il rilevamento degli errori integrato oltre al bit ACK (alcuni sensori aggiungono un byte CRC al carico utile, il che aiuta).
Caratteristiche del rumore SPI
I driver CMOS push-pull guidano attivamente sia gli stati alti che quelli bassi. I bordi sono taglienti. La linea CS entra esattamente nel momento in cui lo schiavo dovrebbe ascoltare, ignorando tutto il resto del tempo sul bus. SNR intrinsecamente migliore.
In pratica, un layout PCB pulito con tracce brevi, un piano di terra e condensatori di bypass soddisferà l'I²C nella maggior parte dei progetti. Ma se il tuo sensore si trova su un cavo a un metro di distanza dall'MCU o condivide un involucro con qualsiasi cosa che commuta gli amplificatori di corrente, l'immunità al rumore di SPI è un vero vantaggio.
In conclusione sul rumore: SPI è la scelta più sicura in ambienti elettricamente ostili. Sullo stesso PCB a pochi centimetri dall'MCU, I²C va bene.
Complessità del firmware: il fattore decisivo di cui nessuno parla
Firmware I²C
A state machine. Start condition → send address + R/W bit → wait for ACK → read/write register pointer → read/write data → stop condition. Every step has a timeout, a retry path, and a "what if the sensor holds SDA low because it's still converting" case. Most MCU vendors provide a HAL. Most of those HALs have edge-case bugs you'll discover at 11 PM.
Firmware SPI
Assert CS → shift bytes → de-assert CS. That's it. The sensor doesn't get to say "I'm not ready" by clock-stretching or NAKing. The master controls the clock; the slave responds or stays silent.
Dolore di debug: Quando SPI non funziona, si sondano quattro linee con un analizzatore logico e si vede esattamente cosa sta succedendo. Quando I²C non funziona, guardi uno schermo pieno di NAK e ti chiedi se sono i valori di pull-up, l'indirizzo, i tempi o la capacità del bus. Un analizzatore logico da $ 8 risolve entrambi i problemi, ma l'I²C ti farà bruciare più tempo.
In conclusione sul firmware: SPI è meno fastidioso del bare metal. Con un HAL o una libreria, è più o meno un lavaggio. I²C impiega più tempo per eseguire il debug quando si rompe.
Consumo energetico: entrambi sono errori di arrotondamento
Un bus I²C da 400 kHz con pull-up da 4,7 kΩ brucia 00,7 mA mentre è attivo. SPI non brucia praticamente nulla a livello di bus: pura corrente di commutazione CMOS a queste velocità (microampere).
Context: the pressure sensor element and ADC draw ~5 µA at 1 Hz sampling and 0.3 µA in standby. Whether the bus burns 0.5 mA or 0.05 mA for the 2 ms it takes to read a sample — the energy difference is picowatt-hours. Your BLE radio burns more power sending one "hello" packet than the bus choice will save across the sensor's entire operating lifetime.
Conclusione sulla potenza: non scegliere I²C o SPI in base alla potenza. La differenza è troppo piccola per avere importanza. Decidi invece i pin, il rumore o la sanità del firmware.
Flusso decisionale: quattro domande, nessuna matrice
1Quanti sensori identici su un autobus?
Nessun vantaggio in ogni caso. Passare alla domanda 2.
Due indirizzi, due fili. A meno che i sensori non siano distanti, allora SPI.
A meno che non ti piaccia leggere le schede tecniche del multiplexer I²C.
2Quanto dista il sensore dall'MCU?
I²C va bene a livello di scheda con un layout pulito.
Oppure I²C con buffer differenziale (PCA9615). I²C non è mai stato progettato per i cavi.
Utilizzare 4–20 mA o RS-485. Sei nel territorio dei trasmettitori industriali.
3Cos'è l'ambiente EMI?
Il layout pulito con tappi di bypass mantiene felice I²C.
I driver push-pull e il gate CS impediranno letture fantasma.
4Sei tu che scrivi il driver?
L’astrazione rende la differenza trascurabile. Usa quello che usa il resto del tabellone.
Meno stati, nessun allungamento dell'orologio, nessun conflitto di indirizzi.
La maggior parte delle librerie di sensori hobbisti hanno come impostazione predefinita I²C. Controlla prima la biblioteca.
The "Why Not Both" Card
Doppia interfacciaAlcuni sensori vengono forniti con sia I²C che SPI sullo stesso die, selezionabile tramite cinturino a spillo o punta di registro. Questo è veramente utile in due scenari:
Flessibilità nella prototipazione
Inizia con I²C su un Arduino o una scheda breakout perché è più semplice da cablare. Quando giri il tuo PCB, passa a SPI se il tuo layout ne trae vantaggio. Stesso sensore, stessa logica firmware, solo una chiamata HAL diversa.
Flessibilità della produzione SKU
Un design PCB, SKU diversi. Uno SKU utilizza I²C perché condivide il bus con un sensore di temperatura/umidità. Un altro necessita dell'SPI per corse di traccia più lunghe verso una scheda sensore remota. Non riprogettare nulla: modificare una riga della distinta base e un cinturino del resistore.
Se il tuo candidato sensore non supporta entrambi i bus, non è un problema. Ma avere questa opzione è una di quelle cose che non apprezzi finché non fai girare nuovamente la tavola alle 2 del mattino.
Riepilogo affiancato
| Fattore | I²c | Sp | Vincitore |
|---|---|---|---|
| Conteggio dei fili | 2 | 4+1 per sensore | I²c |
| Velocità | Fino a 3,4 MHz | Fino a 50 MHz | Cravatta: il sensore ADC è il collo di bottiglia |
| Multisensore (stesso tipo) | Max 2 senza mux | Illimitato (un CS per sensore) | SPI oltre 2 sensori |
| Immunità al rumore | Drain aperto, bordi RC | CMOS push-pull, spigoli vivi | Sp |
| Complessità del firmware | Macchina a stati, ACK/NAK, timeout | Asserisci CS, sposta byte, fatto | SPI (metallo nudo); Pareggio (con HAL) |
| Difficoltà di debug | Più difficile: caccia al NAK | Più semplice: segnali diretti | Sp |
| Consumo energetico | ~0,7 mA (pull-up attivi) | ~0 mA (nessun pull-up) | Pareggio: il delta corrisponde ai picowattora |
| Corse di cavi | Non raccomandato >200 mm | Tollera tracce più lunghe | Sp |
| Componenti esterni | 2× resistenze pull-up | Nessuno | Cravatta: 2 resistori 0402 ≈ $ 0,002 |
TL;DR
Non sai se hai bisogno di un sensore di pressione assoluta, relativa o differenziale? Leggi la guida in inglese semplice →
Non sei sicuro di quale interfaccia si adatti al tuo design? Raccontaci il tuo MCU, i vincoli della tua scheda e il tuo ambiente: ti indicheremo la parte giusta, di solito entro un'ora.
Mettiti in contatto →



