3.21. SPI:n perusteet¶
SPI (Serial Peripheral Interface) on synkroninen sarjaväylä, joka on suunniteltu lyhyen kantaman, suurinopeuksisiin yhteyksiin yhden ohjaimen ja yhden tai useamman saman piirilevyn oheislaitteen välillä. Se on vakioliitäntä SD-korteille, näytöille, flash-muistille, AD- ja DA-muuntimille sekä laajalle valikoimalle sensoreita.
Siinä missä UART:lla ei ollut jaettua kelloa ja se palautti ajoituksen itse datalinjasta, SPI vetää kellojohdon datajohtojen rinnalle. Ohjain ohjaa kelloa haluamallaan nopeudella, ja jokainen muu väylän laite näytteistää datan tahdissa tämän kellon kanssa. Siirtonopeutta ei tarvitse arvailla eikä kehystämisestä synny lisäkuormaa – pelkkiä kellon reunoja ja bittejä.
3.21.1. Neljä johtoa¶
Täysdupleksisessa SPI-väylässä on neljä johtoa:
SCK (sarjakello). Ohjaimen ohjaama. Jokainen bitti kellotetaan sisään tai ulos tämän signaalin reunalla.
MOSI (ohjaimelta ulos, oheislaitteelle sisään). Ohjaimen lähtölinja; oheislaite näytteistää bitit siitä.
MISO (ohjaimelle sisään, oheislaitteelta ulos). Oheislaitteen lähtölinja; ohjain näytteistää bitit siitä.
CS (sirun valinta), jota kutsutaan joskus nimellä SS (oheislaitteen valinta). Erillinen linja kullekin oheislaitteelle. Ohjain vetää CS:n alas aloittaakseen tapahtuman ja takaisin ylös lopettaakseen sen; jokainen oheislaite, jonka CS ei ole aktiivinen, jättää väylän kokonaan huomiotta ja lakkaa ohjaamasta MISO-lähtöään.
Yksi SPI-tavu: CS menee alas valitakseen oheislaitteen, SCK kellottaa kahdeksan bittiä, ja MOSI ja MISO siirtävät kumpikin yhden tavun vastakkaisiin suuntiin.¶
Jokainen kellon reuna siirtää yhden bitin kumpaankin suuntaan samanaikaisesti. Yksi SCK-pulssi lähettää yhtä aikaa yhden bitin MOSI:lla ja vastaanottaa yhden bitin MISO:lla – SPI on johtotasolla täysdupleksinen. Ohjelmiston ei tarvitse käyttää kumpaakin suuntaa: vain kirjoittavat ja vain lukevat tapahtumat ovat yleisiä, jolloin käyttämätön linja joko jätetään huomiotta tai pidetään korkeana.
3.21.2. Kellon polariteetti ja vaihe¶
Kaksi asetusbittiä ratkaisevat tarkalleen, mikä kellon reuna siirtää dataa:
Kellon polariteetti (
polarity, joskusCPOL) – SCK:n lepotila.0tarkoittaa, että kello lepää alhaalla ja pulssaa korkealle;1tarkoittaa, että kello lepää korkealla ja pulssaa alas.Kellon vaihe (
phase, joskusCPHA) – mikä reuna näytteistää datan.0näytteistää kunkin kellopulssin ensimmäisellä reunalla (nouseva reuna);1näytteistää toisella reunalla (laskeva reuna).
Yhdessä nämä tuottavat neljä tilaa, joita kutsutaan yleisesti nimillä Mode 0 … Mode 3. Mode 0 (polarity=0, phase=0) on yleisin ja turvallinen oletus tuntemattomille laitteille.
Ratkaiseva sääntö on, että molempien päiden on oltava samaa mieltä tilasta. Yhteensopimattomat tilat tuottavat roskadataa, vaikka kello- ja datalinjat olisi kytketty oikein; jos laite palauttaa hölynpölyä ensimmäisessä tapahtumassa, tila on ensimmäinen tarkistettava asia.
3.21.3. Useita oheislaitteita¶
Useat oheislaitteet voivat jakaa samat SCK-, MOSI- ja MISO-linjat, kunhan kullakin on oma ohjaimen ohjaama CS-linja:
Kaikki oheislaitteet näkevät saman kellon ja datan, mutta jokainen tarkkailee omaa CS:ää. Kun CS ei ole aktiivinen (korkea), oheislaite jättää SCK:n ja MOSI:n kokonaan huomiotta ja jättää MISO:n korkeaimpedanssiseen tilaan, jottei se kiistele muiden laitteiden kanssa linjasta.
Ohjain aktivoi tarkalleen yhden CS:n kerrallaan, suorittaa tapahtuman ja deaktivoi CS:n vapauttaakseen väylän.
Mikro-ohjain, jossa on yksi laitteistopohjainen SPI-lohko, voi keskustella niin monen oheislaitteen kanssa kuin sillä on vapaita GPIO-nastoja varattavaksi CS-linjoille – itse väylällä ei ole osoitteistusta.
3.21.4. Vahvuudet ja heikkoudet¶
SPI:n vahvuudet ja heikkoudet kumpuavat molemmat sen rakenteesta:
Nopea. Lyhyillä jäljillä ja yksinkertaisella tasonmuunnoksella voidaan saavuttaa kymmeniä megahertsejä. SD-kortinlukijat ja SPI-näytöt hyödyntävät tätä.
Yksinkertainen johtotasolla. Ei osoitteistusta, ei kuittauksia, ei erityisiä aloitus-/lopetusehtoja – pelkkiä bittejä johdoissa synkronoituna kelloon.
Nastoja kuluttava. Kolme jaettua linjaa plus yksi CS kutakin oheislaitetta kohti. Levy, jossa on viisi SPI-laitetta, käyttää kahdeksan nastaa (kolme + viisi).
Lyhyen kantaman. SPI olettaa puhtaat, nopeat reunat, mikä tarkoittaa lyhyitä jälkiä samalla levyllä. Pidemmille yhteyksille I2C tai jokin kehystetyistä väylistä sopii paremmin.