Minden, ami elektronika

Elektronikával hobbi szinten foglalkozó oldal

SPI kommunikáció

2019. február 01. 08:00 - raptor13

Bevezetés


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 maximá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.

Ajánlott olvasmány a bejegyzésben foglaltak megértéséhez

Ha nem ismeri az alábbi témák egyikét, akkor érdemes elolvasnia azokat, mielőtt elolvassa ezt a bejegyzést:

 

Mi a probléma a soros porttal?


Az általánosan használt soros portot, a TX és az RX vonalakkal ellátott fajtát „aszinkron” -nak (nem szinkronnak) nevezik, mert nincs irányítás az adatok küldésére és nincs garancia arra sem, hogy az adó és a vevő is pontosan azonos sebességgel kommunikál. Mivel a számítógépek általában mindent szinkronizálnak egyetlen „órával” (a fő kvarc, amely órajelét használja minden eszköz), ez problémát jelenthet, ha két, kissé eltérő órajellel rendelkező rendszer próbál kommunikálni egymással.

A probléma kiküszöbölésére az aszinkron soros kommunikácónál extra start és stop biteket adnak minden egyes bájthoz. Mindkét félnek előre meg kell állapodnia az átviteli sebességről (például 9600 bit másodpercenként). Az átviteli sebesség enyhe különbségei nem jelentenek problémát, mert a vevő minden egyes bájt elején újra szinkronizál.

Asynchronous serial waveform

 

(Egyébként,  a „11001010” nem egyenlő a fenti ábrán 0x53 értékkel, mert a soros kommunikáció esetén általában a 2x 4 bitet fordítva küldik el (az "LSB" megy először), így a képen látható csomag valójában 0011 = 0x3, és 0101 = 0x5. értékkel rendelkezik)

Az aszinkron soros kommunikáció jól működik, de az, hogy minden bájthoz küldeni kell 1-1 start illetve stop bitet, sok felesleges adatot jelent, valamint a hardveres és a szoftveres feldolgozást is bonyolítja. Amint valószínűleg észrevetted a saját projektjeidben, ha két oldal nem azonos sebességre van beállítva, a fogadott adatok mennek a kukába. Ez azért van, mert a vevő nagyon specifikus időpontokban veszi a biteket (a fenti ábrán látható nyilak mutatják). Ha a vevő rossz időben kap adatot, akkor értelmetlen csomagot fog kapni.

Szinkron megoldás


Az SPI kissé eltérő módon működik. Van egy adatbusz, amin az adatátvitel történik és van egy busz az órajelnek, ami biztosítja az adó és a vevő közötti tökéletes szinkront. Az ójel egy négyszögjel, ami pontosan megmondja a vevőnek, hogy mikor kell mintát vennie. Használhatjuk a négyszögjel alacsony vagy magas értékét, valamint a fel és a lefutó éleket is - mindig adatlapban van meghatározva, hogy mit használunk. Amikor a vevő észleli, hogy a négyszögjel megfelelő részénél van, akkor mindig kiolvassa a következő bitet, a sebesség meghatározása nem fontos, csak ne lépjük túl a vevő maximális kommunikációs sebességét.  

alt text

Az egyik oka annak, hogy az SPI annyira népszerű, hogy a fogadó hardver egy egyszerű shift regiszter is  lehet. Ez így sokkal egyszerűbb (és olcsóbb!) , mint a teljes UART kiépítése.

Adatok fogadása


Megnéztük, hogy mi kell az egyirányú kommunikációhoz, de hogyan küldhetsz vissza adatokat az ellenkező irányba? Ez picit bonyolultabb.

Az SPI-nél mindig van egy master (ami szinte mindig a mikrovezérlő) és egy vagy több slave eszköz. Az órajel (általában CLK vagy SCK a Serial ClocK) előállítása a master feladata. A kétirányu kommunkációhoz még egy adatvonalat szolgálatba kellett állítani, innentől kezdve nem lehet mind a kettőt data névvel ellátni, mert akkor nem tudnánk, hogy melyik vonal melyik. Ezért a következő jelöléseket vezették be: A CLK (órajel) vezetéken kívűl van a 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 slae küld adatot a masternek. 

alt text

Megfigyelhetjük, hogy a fenti ábrán „előzetesen megrendelt” adatot küld a slave eszköz.. Mivel a mester mindig generálja az órajelet, előzetesen tudnia kell, hogy egy slave-nek vissza kell adnia az adatokat, és hogy mennyi adatot küld vissza. Ez nagyon más, mint az aszinkron soros kommunikáció, ahol a véletlenszerű adatmennyiségek bármelyik irányban bármikor elküldhetők. A gyakorlatban ez nem jelent problémát, mivel az SPI-t általában arra használják, hogy beszéljen olyan érzékelőkkel, amelyek nagyon specifikus parancsszerkezettel rendelkeznek. Például, ha elküldi azt a  parancsot egy eszközre, hogy "adatok olvasása", akkor tudja, hogy a slave eszköztől 2 bájt várható válasznak. (Abban az esetben, ha esetleg egy változó adatmennyiséget szeretne visszaküldeni, mindig egy vagy két bájtot küldhet vissza az adatok hosszának megadásával, majd a mester visszakeresheti a teljes adatot.)

Ne feledje, hogy az SPI „full duplex” (különálló elküldési és fogadási vonalak), és így bizonyos helyzetekben egyidejűleg adatokat is továbbíthat és fogadhat (például új érzékelőolvasás kérése az adatok lekérése közben az, az előző példában hozott eszköznél maradva). 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 jelezzük a slave eszköznek, hogy keljen fel, vele szeretnénk beszélgetni.

alt text

Az SS-vonal értéke általában logikai magas (1), ami hatására lekapcsolódik a slave eszköz az SPI-buszról. (Ez az un. "aktív alacsony" logika, amit gyakran használunk kiválasztó és resetelő lábaknál.) Közvetlenül az adatoknak a slave felé történő elküldése előtt a vonal alacsony lesz, ami aktiválja a slave-t. Amikor a slave végzett az adatok visszaküldésével, a vonal ismét magas értéket vesz fel.

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


Kétféleképpen csatlakoztatható több slave egy SPI buszhoz:

Á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. Sok slave eszköz sok SS-vonalat igényel; Ha kevés a kimenetek száma, akkor olyan megoldást kell keresni (pl. I2C portbővítő), amivel több felhasználható kimenetet tudunk nyerni.


alt text

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. Miután az összes adatot elküldték, az SS-vonal magasra vált, ami az összes IC-t egyszerre aktiválja.


alt text

Ne feledje, hogy ennél az elrendezésnél az egyik slave eszköz a másikra van kötve, a működés közben az adott slave eszköz a számára kijelölt adatmenyiséget levágja, majd a többit továbbítja csak a MISO lábon. Ebből adódóan, ahhoz, hogy minden eszközhöz el tudjon jutni az üzenetünk, 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 vissza kell adni a masternek, akkor ezt a daisy-lánc hurok lezárásával végezheti el (kék vezeték a fenti ábrán). Ne feledje, hogy ha ezt megteszi, az 1-es slave visszatérési adatainak át kell mennie az összes slave eszközön, mielőtt visszatérnek a masterhez, ezért győződjön meg róla, hogy elegendő mennyiségű parancsot küld a szükséges adatokhoz.

Az SPI busz használata programozásra

 
Számos mikrokontroller rendelkezik beépített SPI perifériával, amely az adatok küldését és fogadását kezelik, mindezt nagy sebességgel képesek elvégezni. Az SPI protokoll is elég egyszerű ahhoz, hogy Ön is írjon saját rutinokat az adatátvitelhez. Ehhez a wikipedia is hasznos segítséget tud nyújtani.

Ha Arduino-t használ, kétféleképpen kommunikálhat az SPI-eszközökkel:

Használhatja a shiftIn() és a shiftOut() parancsokat. Ezek olyan szoftveralapú parancsok, amelyek bármilyen IO lábakon fognak működni, de kissé lassúak lesznek.

Vagy használhatja 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 bizonyos lábaknál fog működni. Ennek használatához pár dolgot be kell állítani:

  • A beépített SPI először képes a legjelentősebb bit (MSB) első, vagy a legkevésbé jelentős bit (LSB) adatainak küldésére. Az Arduino SPI könyvtárában ezt a setBitOrder() függvény határozza meg.
  • A slave az adatokat az órajel felfutó vagy lefutó élén, vagy alacsony, vagy magas állapotban fogja beolvasni. Az Arduino SPI könyvtárában ezt az opciót a setDataMode() függvény vezérli.
  • 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 ilyen eszközök befogadásához beállíthatja az adatátviteli sebességet. Az Arduino SPI könyvtárban a sebességet a setClockDivider() függvény határozza meg, amely a master órajelét (16MHz a legtöbb Arduinonál) 8MHz (/ 2) és 125kHz (/ 128) közötti frekvenciára osztja.
  • Ha az SPI könyvtárat használja, akkor az előre meghatározott SCK, MOSI és MISO lábakat kell használnia, mivel a mikrovezérlő belsejében az SPI kommunikációért felelős rész ide van kivezetékezve. Van még egy dedikált SS-láb is, de muszáj ezt (vagy csak ezt) használni, helyette bármelyik másik IO lábat használhatjuk.
  • Régebbi Arduinonál a programozónak kell kapcsolgatni az SS-lábakat, az újabb alaplapoknál (pl.: Arduino DUE) ezt képes a program automatikusan elvégezni. További információkért tekintse meg a DUE SPI dokumentáció oldalát.

További hasznos információk


Tippek és trükkök:
A nagy sebességű jelek miatt az SPI-t csak rövid távolságra (legfeljebb néhány deciméter) lehet használni. Ha ennél messzebb van a 2 eszköz egymástól, akkor csökkenteni kell az órajel sebességét, vagy fspeciális cél IC- kell használni.

Ha a dolgok nem működnek úgy, ahogyan azt szeretnénk, akkor egy logikai analizátor nagyon hasznos eszköz lesz a számunkra. Az olyan intelligens elemzők, mint a Saleae USB Logic Analyzer, akár dekódolhatják is a csomagok adatait.

alt text

Az eredeti oldal megtekinthető itt.

Szólj hozzá!

A bejegyzés trackback címe:

https://electro.blog.hu/api/trackback/id/tr7014600004

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.