3.21. SPI-basisbeginselen

SPI (Serial Peripheral Interface) is een synchrone seriële bus die is ontworpen voor verbindingen op korte afstand en met hoge snelheid tussen één controller en één of meer randapparaten op dezelfde print. Het is de standaardinterface voor SD-kaarten, displays, flashgeheugen, ADC’s en DAC’s, en een breed scala aan sensors.

Waar UART geen gedeelde klok had en de timing herstelde vanuit de datalijn zelf, laat SPI een kloklijn naast de datalijnen lopen. De controller stuurt de klok aan met de snelheid die hij wenst, en elk ander apparaat op de bus bemonstert de data synchroon met die klok. Er is geen giswerk over de baudrate en geen framing-overhead – alleen klokflanken en bits.

3.21.1. De vier draden

Een full-duplex SPI-bus heeft vier draden:

  • SCK (seriële klok). Aangestuurd door de controller. Elke bit wordt in- of uitgeklokt op een flank van dit signaal.

  • MOSI (controller out, peripheral in). De uitgangslijn van de controller; het randapparaat bemonstert daar de bits van af.

  • MISO (controller in, peripheral out). De uitgangslijn van het randapparaat; de controller bemonstert daar de bits van af.

  • CS (chip select), soms SS (peripheral select) genoemd. Een aparte lijn per randapparaat. De controller trekt CS laag om een transactie te starten en weer hoog om deze te beëindigen; elk randapparaat waarvan de CS niet geactiveerd is, negeert de bus volledig en stopt met het aansturen van zijn MISO-uitgang.

Vier signaalsporen op elkaar gestapeld: CS bovenaan, SCK eronder, dan MOSI en MISO. CS begint hoog (inactief), zakt naar laag om de transactie te beginnen, waarna SCK acht pulsen uitklokt terwijl MOSI en MISO elk één byte data dragen, waarna CS weer hoog wordt.

Eén SPI-byte: CS gaat laag om het randapparaat te selecteren, SCK klokt acht bits, en MOSI en MISO dragen elk één byte over in tegengestelde richting.

Elke klokflank verplaatst tegelijkertijd één bit in elke richting. Eén enkele SCK-puls verstuurt gelijktijdig één bit op MOSI en ontvangt één bit op MISO – SPI is full-duplex op draadniveau. Software hoeft niet beide richtingen te gebruiken: alleen-schrijven- en alleen-lezen-transacties komen veel voor, waarbij de ongebruikte lijn ofwel genegeerd wordt ofwel hoog gehouden wordt.

3.21.2. Klokpolariteit en -fase

Twee configuratiebits bepalen precies welke klokflank de data verplaatst:

  • Klokpolariteit (polarity, soms CPOL) – de inactieve toestand van SCK. 0 betekent dat de klok laag inactief is en hoog pulseert; 1 betekent dat de klok hoog inactief is en laag pulseert.

  • Klokfase (phase, soms CPHA) – welke flank de data bemonstert. 0 bemonstert op de eerste flank van elke klokpuls (voorste flank); 1 bemonstert op de tweede flank (achterste flank).

Samen geven deze vier modi, conventioneel Mode 0 tot en met Mode 3 genoemd. Mode 0 (polarity=0, phase=0) is de meest voorkomende en een veilige standaardwaarde voor onbekende apparaten.

De cruciale regel is dat beide kanten het eens moeten zijn over de modus. Niet-overeenkomende modi geven onzindata, ook al zijn de klok- en datalijnen correct bedraad; als een apparaat onzin teruggeeft bij de eerste transactie, is de modus het eerste wat je moet controleren.

3.21.3. Meerdere randapparaten

Meerdere randapparaten kunnen dezelfde SCK-, MOSI- en MISO-lijnen delen, zolang elk randapparaat zijn eigen CS-lijn heeft die door de controller wordt aangestuurd:

  • Alle randapparaten zien dezelfde klok en data, maar elk apparaat let op zijn eigen CS. Wanneer CS niet geactiveerd is (hoog), negeert een randapparaat SCK en MOSI volledig en laat het MISO in een hoogimpedante toestand, zodat het niet met andere apparaten om de lijn vecht.

  • De controller activeert precies één CS tegelijk, voert de transactie uit en deactiveert CS om de bus vrij te geven.

Een microcontroller met een enkel hardware-SPI-blok kan met zoveel randapparaten communiceren als er vrije GPIO-pinnen beschikbaar zijn voor CS-lijnen – er is geen adressering op de bus zelf.

3.21.4. Sterke en zwakke punten

De sterke en zwakke punten van SPI vloeien beide voort uit het ontwerp:

  • Snel. Tientallen megahertz is haalbaar op korte sporen met eenvoudige niveauconversie. SD-kaartlezers en SPI-displays gebruiken dit.

  • Eenvoudig op draadniveau. Geen adressering, geen bevestigingen, geen speciale start-/stopcondities – alleen bits op de draden, gesynchroniseerd met een klok.

  • Pin-vergend. Drie gedeelde lijnen plus één CS per randapparaat. Een print met vijf SPI-apparaten gebruikt acht pinnen (drie + vijf).

  • Korte afstand. SPI gaat uit van schone, snelle flanken, wat korte sporen op dezelfde print betekent. Voor langere verbindingen is I2C of een van de geframede bussen een betere keuze.