SPI (ingl Serial Peripheral Interface) siin on sünkroonse järjestiksuhtluse liidese standard, mida kasutatakse enamasti lühidistantsiliseks suhtluseks ning mis leiab sageli kasutust manussüsteemides. Standardi töötas välja Motorola[1]. SPI võimaldab seadmete vahel täisdupleks režiimis ülem-alluv mudeliga suhtlust[2]. Sageli küündivad SPI suhtluskiirused kümnetesse megahertsidesse[1].
SPI-d võib kutsuda neljajuhtmeliseks järjestiksiiniks. Seejuures tuleb SPI-d eristada SSI protokollist, mis on samuti neljajuhtmeline järjestiksiin, kuid rakendab diferentsiaalset signaaliedastust simpleks režiimis.
SPI liidese standard näeb ette signaale[2]:
Eelpool nimetatud signaalide nimetused on kõige populaarsemad, kuid levinud on ka teistsugused samatähenduslikud signaalide nimetused:
SPI ülem-alluv suhtlusmudelis võib alluvseadmeid olla mitu – ülemseade (sageli mikrokontroller) saab SS signaalidega valida, millise alluvaga suhtlust toimub. Juhul kui kasutusel on vaid üks alluvseade, võib SS signaali jäädavalt madalaks tõmmata, kui alluvseade seda lubab – mõnel seadmel algatab SS signaali frondimuutus mingeid tegevusi. Ülema ja alluva vahelise SPI suhtluse toimimiseks, peab nende seadmete SPI konfiguratsioon olema vastastikku sobituv.[3]
Alluvseadmel on spetsifitseeritud, mis polaarsusega taktsignaali kasutatakse – kas signaal on vaikeolekus, kui taktsignaal on loogiline kõrge või madal. Lisaks on tarvis spetsifitseerida faas – kas andmeid loetakse taktsignaali esimesel või teisel frondil. Levinud tähised nendele sätetele on CPOL ja CPHA.[2]
CPOL (ingl Clock Polarity) määrab taktsignaali polaarsuse[2]:
SPI taktsignaali polaarsust saab vajadusel vahetada inverteriga.
CPHA (ingl Clock Phase) määrab taktsignaali faasi ehk konfigureerib MISO ja MOSI signaalide andmebittide ajastuse SCK signaali suhtes[2]:
Enamasti hoitakse MISO ja MOSI signaale stabiilsena kogu taktsignaali pooltsükli aja (kuni järgmise taktsignaali frondini) – see annab seadmetele suurema ajaakna andmete lugemiseks.[2]
SPI režiimideks nimetatakse polaarsuse ja faasi erinevaid kombinatsioone. CPOL ja CHPA vaadeldakse kui binaararvu bitte – CPOL määrab režiimi numbri kõrgema biti ja CHPA madalama biti.[4]
Mode | CPOL | CPHA |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
2 | 1 | 0 |
3 | 1 | 1 |
Režiimide nimetamiseks kasutatakse ka ennikuid (CPOL, CHPA). Näiteks ennik (0, 1) tähendab CPOL = 0 ja CHPA = 1.[4]
Lisaks polaarsuse ja faasi seadistamisele tuleb ülemseadmes valida alluvseadmele sobiv taktsignaali sagedus (SPI puhul sageli kuni mitu MHz). Suhtluse algatamiseks tõmbab ülemseade SS signaali loogiliseks madalaks. Mõni seade võib pärast SS langevat fronti vajada teatud ooteaega.[3]
SPI andmevahetus aluseks on tüüpiliselt kaks 8-bitist (või rohkemabitilist) nihkeregistrit – üks ülem- teine alluvseadmes. Nihkeregistrid on ühendatud ringipidi – ülemseadme nihkeregistri väljund on ühendatud MOSI signaaliga alluvseadme registri sisendisse ning alluvseadme nihkeregistri väljund MISO signaaliga ülema nihkeregistri sisendisse.[2]
SPI täisdupleks suhtlus väljendub selles, et iga taktiga nihutatakse üks bit ülemalt alluvale ja vastupidi – tavaliselt välja saadetav bitt on nihkeregistri kõrgeim bitt ning loetud bitt pannakse nihkeregistri madalaimaks bitiks. Sama kehtib ka juhul, kui soovitakse saata andmeid ühes suunas – siis võib vastu võtta sooviv seade teisele tavaliselt nullbitte saata.[2]
Andmeid vahetatakse tavaliselt baidi kaupa seejuures järjestikku võidakse vahetada palju baite. Andmevahetuse lõppedes peatab ülemseade taktsignaali ning tavaliselt vabastab SS signaali tõstes selle loogiliseks kõrgeks. Levinud andmevahetuse andmeühik on ka 16-bitti puuteekraanide kontrollerite puhul ja 12-bitti ADC-de puhul.[3]
SPI sõltumatute alluvatega suhtluseks on ülemseadmel iga alluvseadme jaoks oma SS signaal. Kui alluvseade ei ole parajasti aktiivne (vastav SS signaal on kõrge), peab selle alluvseadme MISO signaal olema kõrgeimpedantsilises olekus, sest kõigi alluvseadmete MISO signaalid on kokku ühendatud.[3]
Mõned SPI seadmed võimaldavad pärgvõrk (ingl daisy chain) ühendamist. Sel puhul on esimese seadme MISO ühendatud teise MOSI jne. Seadmetes paiknevaid nihkeregistreid mööda saab ülem alluvatele andmed saata ning nihkeregistrite ahelat mööda jõuavad alluvate andmed ka ülemale. Pärgvõrk konfiguratsiooni eeliseks on ülemseadme SS signaalide kokkuhoid.[3]
Kuigi paljudes seadmetes (mikrokontrollerites ja süsteemikiipides) on riistvaraline SPI tugi, võib SPI suhtluse implementeerida ka programmiliselt bitthaaval (ingl bit-banging) andmeid vahetades[5]. Allpool on C keeles kirjutatud näide SPI koodist ülemseadmes, mille puhul SPI konfiguratsioon on CPOL = 0 ja CPHA = 0 ning andmeid vahetatakse baidi kaupa.
CPOL = 0 puhul peab SCK olema madal, enne SS signaali aktiveerimist. SS signaaliga tuleb aktiveerida alluvseade (tavaliselt madalaks tõmmata) ja suhtluse lõppedes vabastada (kõrgeks tõsta). Enamasti lubavad SPI seadmed vahetada SS signaali aktiveeritud oleku ajal minu baiti, seega antud funktsiooni võib välja kutsuda mitu korda.
/*
* SPI bitthaaval baidi saatmine ja lugemine.
*
* CHPA = 0 ja CPOL = 0:
* - sisenevad bitid loetakse tõusval SCK frondil.
* - väljuvad bitid kirjutatakse langeval SCK frondil.
*
* Tagastab loetud baidi.
*/
uint8_t SPI_transfer_byte(uint8_t byte_out)
{
uint8_t byte_in = 0;
uint8_t bit;
for (bit = 0x80; bit; bit >>= 1) {
/* Kirjuta MOSI liinile bit */
write_MOSI((byte_out & bit) ? HIGH : LOW);
/* Viivitus - SCK madal */
delay(SPI_SCLK_LOW_TIME);
/* Tõsta SCK signaal kõrgeks */
write_SCLK(HIGH);
/* Loe ja jäädvusta MISO liinilt bit */
if (read_MISO() == HIGH)
byte_in |= bit;
/* Viivitus - SCK kõrge */
delay(SPI_SCLK_HIGH_TIME);
/* Tõmba SCK madalaks */
write_SCLK(LOW);
}
return byte_in;
}
SPI leiab laialdast kasutust manussüsteemides. Paljudes mikrokontrollerites on sisse ehitatud SPI välisseade, mis tavaliselt võimaldab konfigureerimist nii ülem- kui ka alluvseadmeks. SPI suhtlust kasutavad näiteks paljud ADC-d, andurid, puuteekraanid, LCD-kuvar, välkmälud, EEPORM-id ja SD-mälukaardid.[3]
SPI liides on de facto standard, milles ei spetsifitseerita suhtlusprotokolli. Formaalse standardi puudumise tõttu leidub SPI seadmeid, mis on mõeldud vaid ühes suunas andmeid saatma ja seadmeid, mis kasutavad täiendavaid signaale lisaks eelnimetatud neljale. Kasutatakse erinevaid andmeühiku suurus.[3]
Mõned SPI-ga sarnased või sellel põhinevad liidesed: