3.21. SPI-grunder¶
SPI (Serial Peripheral Interface) är en synkron seriell buss utformad för korta, snabba förbindelser mellan en styrenhet och en eller flera kringutrustningsenheter på samma kort. Det är standardgränssnittet för SD-kort, displayer, flashminne, ADC:er och DAC:er samt en mängd olika sensorer.
Där UART saknade en gemensam klocka och återskapade tidsstyrningen från själva dataledningen, har SPI en klockledning vid sidan av dataledningarna. Styrenheten driver klockan i vilken takt den vill, och alla övriga enheter på bussen avläser data synkront med den klockan. Det finns ingen gissning av baudhastighet och inget ramöverhuvud – bara klockflanker och bitar.
3.21.1. De fyra ledningarna¶
En full-duplex SPI-buss har fyra ledningar:
SCK (seriell klocka). Drivs av styrenheten. Varje bit klockas in eller ut på en flank av denna signal.
MOSI (styrenhet ut, kringutrustning in). Styrenhetens utgångsledning; kringutrustningen avläser bitar från den.
MISO (styrenhet in, kringutrustning ut). Kringutrustningens utgångsledning; styrenheten avläser bitar från den.
CS (chip select), ibland kallad SS (peripheral select). En separat ledning per kringutrustning. Styrenheten drar CS låg för att starta en transaktion och hög igen för att avsluta den; varje kringutrustning vars CS är inaktiverad ignorerar bussen helt och slutar driva sin MISO-utgång.
En SPI-byte: CS går låg för att välja kringutrustningen, SCK klockar åtta bitar, och MOSI och MISO överför en byte var i motsatta riktningar.¶
Varje klockflank flyttar en bit i varje riktning samtidigt. En enda SCK-puls skickar samtidigt en bit på MOSI och tar emot en bit på MISO – SPI är full-duplex på ledningsnivå. Programvaran behöver inte använda båda riktningarna: transaktioner med enbart skrivning och enbart läsning är vanliga, där den oanvända ledningen antingen ignoreras eller hålls hög.
3.21.2. Klockpolaritet och fas¶
Två konfigurationsbitar avgör exakt vilken klockflank som flyttar data:
Klockpolaritet (
polarity, iblandCPOL) – vilotillståndet för SCK.0betyder att klockan vilar låg och pulsar hög;1betyder att klockan vilar hög och pulsar låg.Klockfas (
phase, iblandCPHA) – vilken flank som avläser data.0avläser på den första flanken av varje klockpuls (ledande flank);1avläser på den andra flanken (efterföljande flank).
Tillsammans ger dessa fyra lägen, konventionellt kallade Mode 0 till Mode 3. Mode 0 (polarity=0, phase=0) är det vanligaste och ett säkert standardval för okända enheter.
Den avgörande regeln är att båda ändarna måste vara överens om läget. Felmatchade lägen ger skräpdata även om klock- och dataledningarna är korrekt kopplade; om en enhet returnerar nonsens vid den första transaktionen är läget det första man bör kontrollera.
3.21.3. Flera kringutrustningar¶
Flera kringutrustningar kan dela samma SCK-, MOSI- och MISO-ledningar så länge var och en har sin egen CS-ledning som drivs av styrenheten:
Alla kringutrustningar ser samma klocka och data, men var och en bevakar sin egen CS. Med CS inaktiverad (hög) ignorerar en kringutrustning SCK och MOSI helt och lämnar MISO i ett högimpedanstillstånd så att den inte slåss med andra enheter om ledningen.
Styrenheten aktiverar exakt en CS i taget, utför transaktionen och inaktiverar CS för att frigöra bussen.
En mikrokontroller med ett enda SPI-hårdvaroblock kan kommunicera med så många kringutrustningar som den har lediga GPIO-stift att avvara för CS-ledningar – det finns ingen adressering på själva bussen.
3.21.4. Styrkor och svagheter¶
SPI:s styrkor och svagheter följer båda av dess utformning:
Snabb. Tiotals megahertz är möjligt på korta spår med enkel nivåöversättning. SD-kortläsare och SPI-displayer utnyttjar detta.
Enkel på ledningsnivå. Ingen adressering, inga bekräftelser, inga särskilda start-/stoppvillkor – bara bitar på ledningarna synkroniserade mot en klocka.
Stiftkrävande. Tre delade ledningar plus en CS per kringutrustning. Ett kort med fem SPI-enheter använder åtta stift (tre + fem).
Kort räckvidd. SPI förutsätter rena, snabba flanker, vilket innebär korta spår på samma kort. För längre förbindelser passar I2C eller någon av de ramade bussarna bättre.