SPI kommunikáció

A soros perifériás interfész (SPI) egy olyan kommunikációs rendszer, amelyet gyakran használnak a mikrovezérlők és a kisebb perifériák, például a shift regiszterek, érzékelők, SD-kártyák közötti adatok küldésére. Külön órajelet és adatvonalat használ, valamint minimálisan annyi digitális kimenetet ahány eszközt csatlakoztatunk, amely segítségével ki tudjuk választani, hogy kivel szeretnénk éppen beszélgetni.

Miért lassú soros port?

Az általánosan használt soros portot „aszinkron”-nak nevezik, mert nincs órajel az adatok küldéséhez és így nincs garancia arra hogy a vevő akkor olvassa a jelvezetéken található információt, amikor az adó éppen beállította a megfelelő értéket.
A probléma kiküszöbölésére az aszinkron soros kommunikációnál start és stop biteket adnak minden egyes byte-hoz, és a vevő minden egyes bájt elején újra szinkronizál, de ez lassítja a kommunikációt.

Szinkron megoldás

Az SPI kissé eltérő módon működik. Van egy jelvezeték, amin az adatátvitel történik és van egy jelvezeték az órajelnek, ami biztosítja az adó és a vevő közötti tökéletes szinkront. Az órajel egy négyszögjel, ami pontosan megmondja a vevőnek, hogy mikor kell mintát vennie az adatvezetékből:

Az SPI busz kommunikációja

Az SPI-nél mindig van egy master (ami szinte mindig a mikrovezérlő) és egy vagy több slave eszköz. Az órajel előállítása a master feladata. A kétirányú kommunikációhoz még egy jelvezetékre szükség van, így ezeket meg kell különböztetni. Ezért a következő jelöléseket vezették be: A CLK (órajel), MOSI (Master Out Slave In – Master Kimenet Slave Bemenet) és a MISO (Master In Slave Out – Master Bemenet Slave Kimenet). A MOSI vezetéken megy az adat a mastertől a slave felé, a MISO vonalon pedig a slave küld adatot a masternek. 

Mivel mindig a master generálja az órajelet, előzetesen tudnia kell, hogy egy slave-nek kell-e visszaküldenie adatokat, és azt is, hogy mennyi adatot küld vissza. De ez nem probléma hiszen általában előre specifikált adatszerkezettel történik a kommunikáció.
Mivel különálló küldő és fogadó jelvezetékek állnak rendelkezésre, egyidejűleg lehet küldeni és fogadni. Az eszköz adatlapjában mindig megtalálható, hogy erre képes-e?!

Slave Select (SS)

Van még egy vezeték, amiről eddig nem esett szó, ez az SS, Slave Select, azaz slave eszköz választó. Ezen keresztül jelezi a master a slave eszköznek, hogy vele szeretne beszélgetni.

Az SS-vonal értéke alaphelyzetben logikai magas (1) érték. Közvetlenül az adatoknak a slave felé történő elküldése előtt a vonalat a mester logikai alacsony (0) értékre állítja. Amikor a kommunikációnak vége az SS ismét magasra vált.

Több slave eszköz kapcsolása egy masterre

Általában minden slave eszköznek külön SS-vonalra lesz szüksége. Egy adott slave-vel való beszélgetéshez az adott slave SS-vonalát alacsonyra kell állítani, és a többit magasan tartani.

Vannak olyan, címezhető, SPI buszos alkatrészek, ahol a kommunikációt un. daisy-lánccal oldják meg, tipikusan ilyen a címezhető LED-szalag. A MISO (kimenet) mindig a következő IC MOSI (bemenet) lábára van kötve. Ebben az esetben egy SS-vonal van, ami minden slave-re rá van kötve.

Ennél az elrendezésnél az egyik slave eszköz a másikra van kötve, működés közben az adott slave eszköz a számára kijelölt adatmenyiséget “kivágja”, és csak a maradékot továbbítja a MISO lábon. Ebből adódóan, ahhoz, hogy minden eszközhöz el tudjon jutni a számára szükséges adat, gondoskodni kell arról, hogy megfelelő számú csomagot küldjünk ki. 
Az ilyen típusú elrendezést általában csak olyan helyen használják, mint például a LED-ek vezérlése, ahol nem kell számítani visszatérő adatokra. Ezekben az esetekben elhagyhatjuk a mester MISO vonalat. Ha azonban az adatokat is kell visszaadni a masternek, akkor ezt a hurok lezárásával lehet elvégezni (kék vezeték a fenti ábrán).

Az SPI busz használata programozásra
 
Arduino használata esetén kétféleképpen kommunikálhatunk az SPI-eszközökkel:
Használhatjuk a shiftIn() és a ShiftOut() parancsokat. Ezek olyan program függvények, melyek bármilyen I/O lában működhetnek, de szoftveres megoldás révén kicsit lassabban működnek. Használatukról az arduino.cc weboldalon találunk leírásokat.

Használhatjuk az SPI könyvtárat, amely kihasználja a mikrokontrollerbe beépített SPI hardvert. Ez lényegesen gyorsabb, mint a fenti parancsok, de csak az előre meghatározott SCK, MOSI és MISO lábaknál fog működni.

SPI könyvtár használata esetén pár dolgot be kell állítani:
Az Arduino SPI könyvtárában ezt a setBitOrder() függvény határozza meg, hogy az átvitel melyik bittel kezdődik (MSB vagy LSB). A setDateMode() függvény vezérli, hogy az adatokat az órajel felfutó, vagy lefutó élén olvassa be.
Az SPI rendkívül nagy sebességgel működhet (másodpercenként több millió bájt), ami bizonyos eszközöknél túl gyors lehet. Az Arduino SPI könyvtárban a sebességet a setClockDivider() függvény határozza meg, amely a master órajelét leosztja kisebb frekvenciára. Részletes leírások szintén az arduino.cc weboldalon.
Az SPI kivezetéseit megtalálhatjuk az Arduino alaplapján egy külön csatlakozón is, amit ICSP-nek (In Circuit Serial Programming) hívunk.

 ICSP csatlakozó kiosztása

Mennyire volt hasznos amit olvastál?

Kattints egy csillagra az értékeléshez!

Sajnálom, hogy amit olvastál nem volt hasznos számodra!

Szeretném ha elégedett lennél!

Írd le kérlek, hogy mi nem tetszett!?