# Serial Peripheral Interface

Serial Peripheral Interface (SPI) is een synchrone seriële datalink tussen ten minste twee mediums. Er is in eerste instantie sprake van één master en één slave. De communicatie tussen de master en de slave gebeurt te allen tijde in full-duplex. De start van de communicatie gebeurt door de masterchip. Het is mogelijk om meerdere slaves te hebben, maar ze moeten dan ieder een aparte chipselect hebben. Er zijn altijd vier verbindingen voor communicatie nodig. Daarom spreken we van een four-wire serial bus.

## Benaming

* SCLK: Seriële clock: wordt geleverd door de master.
* MOSI: Master output slave input: op deze lijn wordt de data verzonden die de output van de master en de input van de slave is.
* MISO: Master input slave output: de data van de slave wordt hierover naar de master gestuurd.
* SS: Slave select: Deze lijn wordt actief laag aangestuurd. De lijn voor de geselecteerde slave zal laag zijn. Wanneer de communicatie met de slave gedaan is, zal de lijn een logische 1 krijgen.
Soms zijn er nog additionele signalen, zoals een write-strobe (latch) WS of command/data select C/D.

## Configuratie

Meestal heeft iedere slave een eigen slave select-lijn, maar in sommige gevallen kunnen verschillende slaves in een keten (daisy-chain) zijn opgenomen, waarbij de MISO-poort van iedere slave is verbonden met de MOSI-poort van de eerstvolgende slave in de keten. De MISO-poort van de laatste slave in de keten is verbonden met de MISO-poort van de master. Alle slave select-poorten in de keten zijn met elkaar verbonden. Deze configuratie maakt individuele adressering overbodig, maar gaat ten koste van de datasnelheid. Daisy-chaining werkt alleen als alle slaves expliciet geschikt zijn voor daisy-chaining; een slave moet werken met een vaste frame-size en data langer dan de frame-size zelf negeren en onveranderd doorsturen naar de volgende slave. Lang niet alle SPI devices voldoen hieraan.

## Start communicatie

De communicatie start met het selecteren van een juiste kloksnelheid. Deze snelheid kan behoorlijk variëren van 1 MHz tot 100 MHz. De snelheid moet binnen het bereik van de master en de slave liggen. Het is mogelijk dat de master tegen grotere snelheid kan werken dan de slave maar het omgekeerde kan ook.
Vervolgens zal op de juiste slave select-lijn een logische 0 gestuurd worden. Als er maar 1 chip (slave) is kan men deze lijn permanent op 0 houden. Het is mogelijk dat de chip pas werkt wanneer hij een edge (van hoog naar laag) detecteert. In dit geval mogen we de lijn niet op een logische 0 houden. Deze slave select hangt zeer nauw samen met het sturen van de klokpulsen. Sommige chips hebben een wachtperiode nodig vooraleer je de klokpulsen naar de slave mag sturen zoals een DAC of ADC. Vervolgens zal er per klokcyclus een full-duplex signaal doorgestuurd worden. Namelijk zowel de master als de slave zullen een bit doorsturen. De master zal over de MOSI lijn sturen en de slave zal van deze lijn aflezen. Het omgekeerde zal op de MISO lijn gebeuren. De slave zal data sturen en de master zal van deze lijn aflezen. In vele gevallen wordt er gebruikgemaakt van schuifregisters. Meestal is de registergrootte 8 bits en wordt het minst significante bit eerst gestuurd maar dit is niet altijd het geval. Bij de MS5607-02BA01 Micro Altimeter Module, met LCP cap wordt een register van 24 bits gebruikt en het meest significante bit wordt als eerste gestuurd. Wanneer het complete register is doorgestuurd wordt de data verwerkt. Dit kan inhouden dat de data weggeschreven wordt naar het geheugen. Wanneer er meer data verstuurd moet worden zal de data ingeladen worden en start de communicatie weer vanaf het begin.

## Voordelen

* Full-duplex
* Snellere communicatie dan bijvoorbeeld de I²C-bus
* Geen limiet aan woordgrootte
* Eenvoudige hardware
* Adressering niet nodig
* Geen aparte oscillator voor slave
* Laag energieverbruik
* Geen transceivers nodig
* Slechts vier pinnen nodig
* Eén pin per slave extra boven 1
* Kan zeer hoge kloksnelheden aan

## Nadelen

* Meer pinnen nodig dan bij I²C
* Geen controle door de slave (master kan de klok vertragen, slave niet)
* Geen controle of er iets verbonden is
* Maximaal één master
* Geen foutcontrole
* Gevoelig voor ruis