I²C versus SPI voor druksensoren – Interfaceselectiegids

Technische gidsen

I²C versus SPI voor druksensoren — Kies de juiste bus of haat uw lay-out later

U heeft uw druksensor gekozen. Je kent het bereik, de nauwkeurigheid, het pakket. Dan zie je op de bestelpagina twee varianten: I²C En Spi. Dezelfde sensor. Dezelfde prijs. Verschillende vier letters. Hier leest u hoe u kunt beslissen - met reële getallen, niet met de theorie uit het leerboek.


De twee minuten durende opfriscursus

Sla dit over als je beide bussen eerder hebt aangesloten. Als je dat nog niet hebt gedaan, is hier genoeg om de rest van het artikel te volgen:

I²C
  • Draden: 2 — SDA (gegevens) + SCL (klok)
  • Signaaltype: Open drain, hoog getrokken met weerstanden
  • Adressering: 7-bits adres per apparaat
  • Richting: Half-duplex
  • Snelheid: 100 kHz / 400 kHz / 1 MHz / 3,4 MHz
  • Controle: Master-geïnitieerd; Slaven reageren alleen als ze worden aangesproken
Spi
  • Draden: 4 — MOSI, MISO, SCLK + 1× CS per apparaat
  • Signaaltype: Push-pull-CMOS
  • Adressering: Geen — CS-lijn selecteert het apparaat
  • Richting: Full-duplex
  • Snelheid: 1 MHz tot 50 MHz
  • Controle: Master bestuurt klok; geen klok die zich uitstrekt

Op dit punt zou je kunnen denken: "SPI is faster, so SPI wins, end of article." Niet helemaal: snelheid doet er bijna nooit toe voor een druksensor. Dit is waarom.


Het snelheidsargument dat er niet toe doet

Een typische MEMS-druksensor voert elke keer een meting uit 1 tot 100 milliseconden — de ADC-conversietijd domineert, niet de bussnelheid. Zelfs bij 1 ms per sample (1 kHz sampling) push je misschien 48 bits per meting. Dat is 48 kbps.

I²C bij 400 kHz draagt ​​~320 kbps over na overhead. SPI op 1 MHz draagt ​​1 Mbps over. Een van beide is dat 7× tot 20× sneller dan de datasnelheid van de sensor. Tenzij je op ultrasone frequenties samplet - wat niet het geval is, omdat de druk niet zo snel verandert - is de bussnelheid niet relevant. De sensor is de bottleneck, niet de draden.

Kortom, snelheid: maakt niet uit. De ADC van de sensor is de beperkende factor. Beslis op andere gronden.


Pintelling: het argument dat er echt toe doet op kleine borden

ScenarioI²C-pinnen gebruiktSPI-pinnen gebruikt
1 sensor2(SDA+SCL)4 (MOSI + MISO + SCLK + CS)
2 sensoren2 (gedeelde bus)5 (gedeelde bus + 2× CS)
4 sensoren2 (gedeelde bus)7 (gedeelde bus + 4× CS)

Als uw MCU een STM32 is met 80 GPIO's, wat maakt het dan uit. Maar op een ESP32-C3 met 15 bruikbare GPIO's met een display, BLE, twee knoppen en een SD-kaart - die 2 extra pinnen voor SPI-steek. I²C bespaart u pinnen, ongeacht hoeveel sensoren de bus delen.

Let op: I²C kost je twee pull-up-weerstanden. SPI kost niets. Twee 0402-weerstanden van 4,7 kΩ kosten in totaal ongeveer $ 0,002 en nemen 2 mm² aan bordruimte in beslag - niet niets, maar dichtbij.

Kort gezegd over pinnen: I²C wint als GPIO's krap zijn. Met een pin-rijke MCU verdwijnt het voordeel – beslis over andere factoren.


Ontwerpen met meerdere sensoren: waar I²C echt uitblinkt

Drie druksensoren op dezelfde printplaat: één barometrische referentie, één tankniveau, één pompuitlaat. Met I²C: wijs elke sensor een ander adres toe, SDA en SCL parallel aansluiten, klaar. Twee sporen. Drie sensoren. Geen extra MCU-pinnen. Met SPI: drie afzonderlijke CS-lijnen bovenop de gedeelde MOSI/MISO/SCLK – zes draden in totaal.

Let op: I²C-apparaten hebben unieke adressen nodig. De meeste druksensoren bieden precies twee adressen (een speld die hoog of laag is vastgemaakt). Dat betekent dat je twee sensoren op de bus krijgt voordat je een I²C-multiplexer zoals de TCA9548A nodig hebt – wat ongeveer $ 0,50 en een paar mm² toevoegt. SPI kent een dergelijke limiet niet; voeg gewoon een CS-lijn per sensor toe.

Kort gezegd over multi-sensoren: I²C wint wat betreft de eenvoud van bedrading tot twee identieke sensoren. Gebruik daarnaast SPI of een I²C-mux. Geen van beide is duidelijk beter, het is een kwestie van lay-out.


Geluidsimmuniteit: degene waar SPI voorop loopt

Druksensoren met hoge resolutie meten veranderingen zo klein als 0,03 hPa – ongeveer het gewicht van een mug die op uw bureau landt, vertaald in een elektrisch signaal. Bij die resolutie is ruis van belang.

I²C-ruiskarakteristieken

Open drain-lijnen met pull-up-weerstanden produceren RC-hellingsranden, geen schone CMOS-overgangen. Pull-up-waarden zijn een compromis: te sterk verspilt kracht; te zwak maakt de stijgtijd traag en opent een venster voor ruiskoppeling. In een luidruchtige omgeving – naast een motordriver, schakelende regelaar of iets anders met PWM – kan I²C haperen. Het protocol heeft geen ingebouwde foutdetectie buiten de ACK-bit (sommige sensoren voegen een CRC-byte toe aan de payload, wat helpt).

SPI-ruiskarakteristieken

Push-pull CMOS-stuurprogramma's sturen actief zowel hoge als lage toestanden aan. Randen zijn scherp. De CS-lijn geeft precies aan wanneer de slaaf moet luisteren en negeert de rest van de tijd alles in de bus. Inherent betere SNR.

In de praktijk zal een strakke PCB-lay-out met korte sporen, een aardvlak en bypass-kappen ervoor zorgen dat I²C bij de meeste ontwerpen tevreden is. Maar als uw sensor zich op een kabel op een meter afstand van de MCU bevindt, of een behuizing deelt met iets dat stroomsterktes schakelt, is de ruisimmuniteit van SPI een echt voordeel.

Kort gezegd over ruis: SPI is de veiligere keuze in elektrisch vijandige omgevingen. Op dezelfde printplaat, een paar centimeter van de MCU, is I²C prima.


Firmware-complexiteit: de tiebreaker waar niemand over praat

I²C-firmware

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.

SPI-firmware

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.

Pijn debuggen: Als SPI niet werkt, onderzoek je vier lijnen met een logische analysator en zie je precies wat er gebeurt. Als I²C niet werkt, staar je naar een scherm vol NAK's en vraag je je af of het de pull-up-waarden, het adres, de timing of de buscapaciteit zijn. Een logica-analyzer van $ 8 lost beide op, maar I²C zal meer tijd verspillen.

Kort gezegd over firmware: SPI is minder irritant bare-metal. Met een HAL of bibliotheek is het grofweg een wasbeurt. Het duurt langer om I²C te debuggen als het kapot gaat.


Stroomverbruik: beide zijn afrondingsfouten

Een 400 kHz I²C-bus met 4,7 kΩ pull-ups brandt rond 00,7 mA terwijl actief. SPI verbrandt in wezen niets op busniveau - puur CMOS-schakelstroom bij deze snelheden (microampère).

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.

Kort gezegd over vermogen: kies niet voor I²C of SPI op basis van vermogen. Het verschil is te klein om er iets toe te doen. Beslis in plaats daarvan over pinnen, ruis of firmware-gezondheid.


Beslissingsstroom: vier vragen, geen matrix

1Hoeveel identieke sensoren op één bus?

Eén → Beide werken

Geen enkel voordeel trouwens. Ga naar vraag 2.

Twee → I²C wint waarschijnlijk

Twee adressen, twee draden. Tenzij de sensoren ver uit elkaar staan ​​– dan SPI.

Drie of meer → SPI

Tenzij u graag datasheets van I²C-multiplexers leest.

2Hoe ver is de sensor verwijderd van de MCU?

Zelfde printplaat, <100 mm → Ofwel

I²C is prima op bordniveau met een strakke lay-out.

Kabel >200 mm → SPI

Of I²C met een differentiële buffer (PCA9615). I²C is nooit ontworpen voor kabels.

>1 meter → Geen van beide

Gebruik 4–20 mA of RS-485. Je bevindt je in industrieel zendergebied.

3Wat is de EMI-omgeving?

Stille printplaat, geen motoren → Ook niet

Een strakke lay-out met bypass-doppen zorgt ervoor dat I²C tevreden is.

BLDC, GSM, buck-converter in de buurt → SPI

Push-pull-drivers en CS-poorten voorkomen fantoommetingen.

4Ben jij degene die de chauffeur schrijft?

HAL / bibliotheek bestaat → Ofwel

De abstractie maakt het verschil verwaarloosbaar. Gebruik wat de rest van het bord gebruikt.

Vanaf nul schrijven → SPI

Minder toestanden, geen oprekken van de klok, geen adresconflicten.

Een Arduino-bibliotheek porten → I²C

De meeste sensorbibliotheken voor hobbyisten zijn standaard ingesteld op I²C. Kijk eerst eens in de bibliotheek.


The "Why Not Both" Card

Dubbele interface

Sommige sensoren worden meegeleverd zowel I²C als SPI op dezelfde dobbelsteen, selecteerbaar via een pinriem of registerbit. Dit is echt nuttig in twee scenario's:

Flexibiliteit bij het prototypen

Begin met I²C op een Arduino- of breakout-bord, omdat dit gemakkelijker te bedraden is. Wanneer u uw eigen printplaat draait, schakel dan over naar SPI als uw lay-out daar baat bij heeft. Dezelfde sensor, dezelfde firmwarelogica, alleen een andere HAL-oproep.

Flexibiliteit van productie-SKU's

Eén PCB-ontwerp, verschillende SKU's. Eén SKU gebruikt I²C omdat deze de bus deelt met een temperatuur-/vochtigheidssensor. Een ander heeft SPI nodig voor langere trace-runs naar een sensorbord op afstand. U hoeft niets opnieuw te ontwerpen - verander een BOM-lijn en een weerstandsband.

Als uw sensorkandidaat niet beide bussen ondersteunt, is dit geen dealbreaker. Maar het hebben van de optie is een van die dingen die je pas op prijs stelt als je om 02.00 uur een bord opnieuw draait.


Samenvatting naast elkaar

FactorI²CSpiWinnaar
Aantal draden24 + 1 per sensorI²C
SnelheidTot 3,4 MHzTot 50 MHzGelijkspel - sensor ADC is het knelpunt
Multisensor (zelfde type)Max 2 zonder muxOnbeperkt (één CS per sensor)SPI voorbij 2 sensoren
Immuniteit voor lawaaiOpen afvoer, RC-randenPush-pull CMOS, scherpe randenSpi
Firmware-complexiteitToestandsmachine, ACK/NAK, time-outsCS bevestigen, bytes verschuiven, klaarSPI (blank metaal); Stropdas (met HAL)
Moeilijkheidsgraad voor het opsporen van foutenMoeilijker - NAK-jachtGemakkelijker – duidelijke signalenSpi
Stroomverbruik~0,7 mA (pull-ups actief)~0 mA (geen pull-ups)Gelijkspel — delta is picowattuur
Kabel looptNiet aanbevolen >200 mmVerdraagt ​​langere sporenSpi
Externe componenten2× pull-up-weerstandenGeenGelijkspel — 2× 0402-weerstanden ≈ $ 0,002

TL; DR

Aantal pinnen I²C gebruikt minder draden. Doorslaggevend wanneer GPIO's krap zijn.
Snelheid Maakt niet uit. De ADC van de sensor is altijd het knelpunt.
Multi-sensor I²C is schoner voor ≤2 identieke sensoren. SPI schaalt verder beter.
Lawaai SPI wint. Doorslaggevend in de buurt van motoren, switchers of GSM-modules.
Firmware SPI is eenvoudiger bare-metal. Met een HAL is het een wassen neus. Het duurt langer om I²C te debuggen als het kapot gaat.
Stroom Kies niet op basis van macht. Het verschil is picowattuur.
Dubbele interface Het beste van twee werelden: één ontwerp, naar believen te wisselen. Gebruik het als een functie, niet als bijzaak.

Weet u niet zeker welke interface bij uw ontwerp past? Vertel ons uw MCU, uw boardbeperkingen en uw omgeving. Wij wijzen u meestal binnen een uur naar het juiste onderdeel.

Neem contact op →
Scroll naar boven

Neem contact met ons op