SPI-väylän nimitys tulee englannin kielen sanoista Serial Peripheral Interface tai löysästi suomennettuna sarjamuotoinen oheislaiteväylä ja se on Motorolan nimeämä tiedonsiirtostandardi.
SPI-väylä on synkronoitu sarjaväylä, missä tieto liikkuu bitteinä kahden tai useamman laitteen välillä. Synkronoitu väylä tarkoittaa tässä tapauksessa sitä, että bittien ajoitukset on synkronoituja, eli väylän toimintaan liittyy olennaisesti kellosignaali, joka "tikittää" lähettävän laitteen tahdissa. SPI-väylä on synkronisuuden lisäksi kaksisuuntainen (engl. full duplex) eli lähettävä laite yhtäaikaa lukee ja kirjoittaa tietoa väylälle.
Tälle sivulle olen koonnut lyhyesti tärkeimmät tiedot, joita väylän toiminnan ymmärtämiseksi tarvitaan. Sivu saattaa päivittyä ja lisää tietoa aiheesta voi ilmestyä ilman erillistä ilmoitusta.
SPI-väylän signaalit
Edellä mainitusta voi päätellä, että SPI-väylän käyttämiseen tarvitaan siis vähintään kolme signaalia, jotka ovat: kellopulssi ja luku- että kirjoitussignaalit. Näiden kolmen signaalin lisäksi kuitenkin käytetään vielä kommunikoitavan piirin valintaan yhtä signaalia, joka on "orjan valinta" -signaali.
Signaaleita tarvitaan siis neljä kappaletta ja joissain yhteyksissä voi huomata mainittavan termejä "four-wire serial bus" tai SSI (Synchronous Serial Interface). Nämä kuitenkin tarkoittavat yhtä ja samaa asiaa ja signaalit on myös näin ollen samoja.
Virallisemmat nimitykset luetelluista signaaleista on kirjoitettu alle:
SPI-väylän signaalit (suluissa vaihtoehtoiset ei-standardit nimeämistavat):
- SCLK (SCK,CLK) = Serial Clock = Väylän kellosignaali
- MOSI (SDI,DI,SI)= Master Output, Slave Input = Isäntälaitteen datalinja ulos ja orjalaitteen vastaanottolinja sisään.
- MISO (SDO,DO,SO)= Master Input, Slave Output = Isäntälaitteen lukulinja sisään ja orjalaitteen lähetyslinja ulos.
- SS (nCS,CS,nSS,STE,CE) = Slave Select = 0-aktiivinen orjalaitteen valintasignaali (yksilöllinen kullekin laitteelle).
Isäntä- ja Orjalaite
SPI-väylän yhteydessä käytetään laitteiden rooleista termejä "isäntä" (engl. Master) ja "orja" (engl. Slave). Isäntälaite alustaa väylän ja tuottaa väylälle kellosignaalin, minkä mukaan kommunikointi tapahtuu ja tieto siirtyy laitteesta toiselle.
Väylällä voi kommunikoida vain yksi isäntälaite kerrallaan, mutta tietoa voidaan välittää samalla kertaa yhdelle tai useammalle orjalaitteelle. Isäntälaite lisäksi määrittelee, mille laitteelle ja millä nopeudella se minäkin ajanhetkenä kommunikoi (orjalaitteen valintaan käytetään SS-signaalia). Mikäli väylällä on vain yksi orjalaite, voidaan SS-signaali kytkeä kiinteästi laitteiston maahan, jolloin orjalaitteen luku- ja kirjoitusrekisterit ovat koko ajan aktiivisia. Tämä ei kuitenkaan ole pakollista.
Tiedonsiirto SPI-väylällä
Kuten aiemmin mainittu, niin tiedonsiirto SPI-väylällä perustuu kellopulssiin (SCLK). Kellon nopeus on tyypillisesti luokkaa 1-100 megahertsiä, mutta maksiminopeus riippuu aina käytetyistä laitteista ja sen tulee olla pienempi kuin hitaimman lisälaitteen maksimi väylänopeus (tämä kerrotaan laitteen datalehdessä).
Ennen kellopulssien lähettämistä ja datan siirtämistä/lukemista täytyy orjalaitteen SS tai CS -signaali asettaa "0" -tilaan, jolloin piirin databufferit aktivoituvat. Tämän jälkeen SCLK-signaalia kellotetaan kunnes kaikki haluttu tieto on siirretty.
Jokaisen kellopulssin aikana lähetetään (MOSI) ja vastaanotetaan (MISO) yksi bitti. Kellopulssien määrä riippuu lähetettävän tai luettavan tiedon määrästä, kuitenkin sen ollessa aina vähintään 8-bittiä eli yksi tavu. Useimmat laitteet odottavat saavansa vähintään 8:lla jaollisen määrän kellopulsseja ja voivat tästä syystä jäädä jumiin, mikäli SCLK-signaalia ei kelloteta tarpeeksi. Tätä ei aina mainita edes laitteen datalehdessä, mutta se on hyvä tietää.
SPI-väyläinen laite voi vaatia, että tietoa siirretään kerralla esimerkiksi 16-bittiä tai enemmänkin, mutta yhtä hyvin siirrettävien bittien määrä voi olla esimerkiksi 5 tai 12. Jos kyseessä on luku, joka ei ole jaollinen 8:lla, niin yleensä laite siirtää ns. stuff eli täytebittejä (usein "0"-bittejä ) datan mukana. Tämä tehdään sen vuoksi, että 8:lla jaollista määrää kellopulsseja voidaan käyttää. Useimmiten mikrokontrollerit ja muut SPI-väyläohjaimet lähettävät ja lukevat tietoa vähintään 8 bitin lohkoina.
Tiedonsiirron lopuksi CS/SS -signaali asetetaan takaisin "1"-tilaan, mikä on merkkinä orjalaitteelle, että isäntälaite on nyt valmis ja sen ei tarvitse sitä enää kuunnella.
Kellosignaalin polariteetti ja vaihe sekä väylän toimintatilat
SPI-väylän kellosignaalilla voi olla kaksi eri polariteettia ja kaksi eri vaihetta. Polariteetilla (engl. polarity) tarkoitetaan sitä, onko kellosignaali "0"- vai "1" -tilassa kun tietoa ei siirretä. Vaiheella (engl. phase) tarkoitetaan puolestaan sitä, millä reunalla tieto luetaan rekistereihin (nouseva tai laskeva kello).
Alla olevassa kuvassa nähdään kaikki mahdolliset vaiheet ja polariteetit, jotka väylällä voivat olla. Eri polariteetteja ja vaiheita sanotaan myös moodeiksi tai tiloiksi ja näin ollen SPI-väylällä voi olla neljä (4) eri toimintatilaa/moodia.
Kuvan lähde wikipedia.
SPI-väylän toimintatilat on selostettu alle (käytä kuvaa apuna tulkinnassa):
Toimintatila | CPOL: | CPHA: | SPI-väylän tulkinta |
1. (0) | 0 | 0 | Data luetaan rekisteriin kellosignaalin nousevalla reunalla (punainen viiva) ja data muuttuu kellosignaalin laskevalla reunalla (sininen viiva). Kellosignaali on lepotilassa 0. |
2. (1) | 0 | 1 | Data luetaan rekisteriin kellosignaalin laskevalla reunalla (sininen viiva) ja data muuttuu kellosignaalin nousevalla reunalla (punainen viiva). Kellosignaali on lepotilassa 0. |
3. (2) | 1 | 0 | Data luetaan rekisteriin kellosignaalin laskevalla reunalla (punainen viiva) ja data muuttuu kellosignaalin nousevalla reunalla (sininen viiva). Kellosignaali on lepotilassa 1. |
4. (3) | 1 | 1 | Data luetaan rekisteriin kellosignaalin nousevalla reunalla (sininen viiva) ja data muuttuu kellosignaalin laskevalla reunalla (punainen viiva). Kellosignaali on lepotilassa 1. |
Suluissa oleva toimintatilan numero kertoo toimintatilan binäärisenä (koska 00 = 0, 01 = 1 jne) ja ensimmäinen numero on vain rivin järjestysnumero (huomaa piste numeron perässä).
Erilaisia SPI-väyläisiä laitteita
SPI-väylä on nykyisissä sulautetuissa laitteissa hyvinkin yleinen tiedonsiirtoväylä todennäköisesti johtuen sen nopeudesta ja yksinkertaisuudesta. Erilaisia SPI-väyläisiä laitteita löytyy lähes mistä tahansa kategoriasta, joista alla esimerkiksi muutama jotka käyttävät SPI-väylää tai vastaavaa tiedonsiirtoväylää:
- AD-muuntimet
- Kosketusnäytön tai jonkun muun elementin ohjaimet
- LCD-näytön ohjainpiirit
- MMC ja SD kortit sekä muut muistikortit
- SIM-kortit
- Erilaiset anturit (lämpötila, paine, valoisuus yms. fyysiset suureet)
- RTC:t eli reaaliaikakellot (Real-Time Clock)
- Kommunikointirajapintojen yhdyslaitteet (USB,CAN,USART,Ethernet)
- Langattomat laitteet (Wlan, Bluetooth, Zigbee yms 2,4 GHz:n yhteydet)
Lista jatkuisi vaikka kuinka pitkälle, mutta pointtina tässä oli kuitenkin se, että laitteita löytyy hyvinkin paljon ja useita erilaisia.
Useamman orjalaitteen kytkeminen isäntälaitteeseen
Kuvan lähde wikipedia.
Joskus on tarvetta kommunikoida useamman kuin yhden laitteen kanssa joko yhtä aikaa tai erillisinä ajankohtina. Tällöin isäntälaitteeseen voidaan liittää useita orjalaitteita kytkemällä MOSI,MISO ja SCLK signaalit keskenään yhteen. SS/CS-signaalit kytketään kuitenkin erillisinä isäntälaitteen IO-nastoihin ja SPI-väylän isäntälaite päättää mille laitteelle kommunikoidaan milloinkin.
Kommunikointi voi tapahtua myös yhtä aikaa, mutta usein tämä tapahtuu vain silloin, kun isäntälaite kirjoittaa esimerkiksi AD-muuntimille SPI-väylän avulla käskyn "aloita muunnos". Jokaisen laitteen tulos luonnollisesti luetaan erikseen. Tämä siis jos kaikki laitteet ovat keskenään samanlaisia.
SPI-väylän liittäminen tietokoneeseen
Vaikka SPI-väylä on enemmän sulautettujen laitteiden ja mikrokontrollereiden sekä sulautettujen lisälaitteiden välinen kommunikointiväylä, niin tietokoneeseenkin voidaan liittää SPI-väyläisiä laitteita.
Kun tietokoneeseen (PC) halutaan liittää SPI-väylä, niin käytetään SPI-muunninta. Käytännössä muunnin on useimmiten USB:hen/sarjaporttiin liitettävä "mokkula", joka hoitaa kommunikoinnin PC:n ja SPI-väylän välillä.
SPI-muuntimia löytyy verkkokaupoista internetistä ja esimerkiksi Microchipin MCP2210 Breakout Module on yksi näistä. Suomalainen kauppa, mistä SPI-muuntimia saa on robomaa.com ja muunnin on nimeltään USB-ISS, jollaisen itse omistan (tästä kuva alla).
Muunnin kytketään tietokoneeseen kaapelin (USB) avulla ja esimerkiksi USB-ISS:n tapauksessa demo-ohjelmalla voidaan lähettää tietoa SPI-väylälle sekä tietysti vastaanottaa sitä. (Tälle olen tekemässä ohjelmaa, joka olisi parempi käyttää kuin valmistajan sivuilla esitelty, mutta se on vielä kesken pahasti.)
SPI-väylän debuggaus eli virheiden etsintä
SPI-väylää on myös hyvä päästä tutkimaan ihan laite- ja signaalitasolla. Tätä varten tarvitaan kuitenkin vähintään digitaalinen oskilloskooppi tai signaalianalysaattori, jolla "nuuskitaan" mitä väylällä tapahtuu.
Signaalianalysaattori osaa muuntaa väylällä olevat bitit suoraan heksadesimaaliseen tai binääriseen esitysmuotoon jolloin viat ja bugit voidaan nopeasti ja helposti havaita (no, ei nyt aina välttämättä kovin nopeasti).
Oskilloskoopilla voidaan lisäksi tarkastaa jännitetasot ja bittikuviot, mutta kuten mainittu, oskilloskoopin tulisi olla digitaalinen että kuvan saa myös jäämään näytölle.
Lähteitä ja linkkejä:
http://dbindner.freeshell.org/msp430/lcd_spi.html
http://www.cceskb.sju.edu.tw/xms/read_attach.php?id=16595
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
http://mspsci.blogspot.fi/2012/09/tutorial-19b-usi-spi.html
http://mitchtech.net/raspberry-pi-msp430-spi/
http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf
http://www.mct.net/faq/spi.html