Lektorált tananyag, ami a BKF Digitális és Kollaboratív Művészet (DIKOM) pályázatnak keretén belül valósult meg.
Szerző: Harsányi Réka, Társszerző: Juhász Márton András, Lektor: Fernezelyi Márton
Az SPI (Serial Peripherial Interface) egy szinkron soros protokoll. Alapvető különbség az I2C-hez képest, hogy külön adatvonalat tart fenn a mestertől a szolga felé és az ellenkező irányú kommunikáció céljára, továbbá nem használ címzést, az egyetlen mester az eszközöket egyenként külön vonalakon engedélyezi. Mindezek együttesen egy gyorsabb soros adatátvitelt tesznek lehetővé a mikrokontroller és perifériái között. A közös adatvonalak a MISO (Master In Slave Out), amin keresztül a mester fogad adatokat, a MOSI (Master Out Slave In), amin a szolgák fogadnak adatokat és az SCK (Serial Clock) órajel a szinkronizáláshoz. Az eszközönként specifikus vonal az engedélyezéshez az SS (Slave Select). Amikor egy szolga SS vonala logikai alacsony szintre kerül, létrejön a kapcsolata a mesterrel, ha magas szinten tartjuk, akkor teljesen kimarad a buszon való kommunikációból, így nem zavarhatja a többi perifériát.
SPI busz funkcionális rajza több szolgaeszköz esetén
A nyílt fejlesztésű rendszernek és a közösségben együttműködő programozóknak köszönhetően az Arduinoval számtalan SPI alkatrész került implementálásra, és a könyvtár ebből a rutinból fakadóan rendelkezik olyan függvényekkel, amik megkönnyítik az új eszközök használatát. Mindazonáltal az SPI protokoll meglehetősen szabadon értelmezett az eszközgyártók körében, ezért, ha egy új alkatrészhez szeretnénk programot írni, akkor nézzük meg alaposan az adatlapját.
Eltérések a következő paraméterekben lehetnek:
- MSB (Most Significant Bit): legnagyobb helyi értékű bitet küldi a szolga először.
- LSB: (Less Significant Bit): legkisebb helyi értékű bitet küldi a szolga először.
A két változat között az SPI.setBitOrder() függvény biztosítja az átjárást.
- Órajel frekvenciája: Az órajel sebességét az SPI.setClockDivider()-rel adhatjuk meg.
- Órajel fázisa (CPHA): Az adatok az órajel negatív vagy pozitív élével vannak szinkronban.
- Órajel polaritása (CPOL): A várakozás logikailag magas vagy alacsony szint.
Erről az SPI.setDataMode() függvény segítségével dönthetünk:
Mód
|
CPOL | CPHA |
SPI_MODE0 |
0 |
0 |
SPI_MODE1 |
0 |
1 |
SPI_MODE2 |
1 |
0 |
SPI_MODE3 |
1 |
1 |
táblázat: setDataMode függvény állapotai
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
Mivel ezen a csatlakozón keresztül tölthetjük fel az Arduino alapprogramját, a bootloadert is, ezért megtalálható minden típusú alaplapon ugyanebben a formában. Mint azt láttuk, a kivezetések sokszor több különböző funkciót is el tudnak látni, így nem meglepő, hogy az ICSP vonalait az eddig tárgyalt csatlakozók valamelyikén is megtaláljuk:
Típus |
MOSI | MISO | SCK |
SS (szolga) |
SS (mester) |
UNO |
13 |
11 |
12 |
10 |
- |
Mega |
51 |
50 |
52 |
53 |
- |
Leonardo |
ICSP4 |
ICSP1 |
ICSP3 |
- |
- |
DUE |
ICSP4 |
ICSP1 |
ICSP3 |
- |
4, 10, 52 |
SPI csatornák kivezetései a különböző típusú Arduino alaplapokon
Az eltérések nem kizárólag az alapvető kommunikációban mutatkoznak meg, minden alkatrész rendelkezik saját utasításkészlettel és regiszterekkel.
Az SD kártyák is SPI buszon kommunikálnak, amiket viszonylag könnyen és nagyon sokféleképpen hasznosíthatunk arduinos projektjeinkben (háttértár, hangfelvétel, lejátszás, adatrögzítés, GPS). Példánkban a Libelium által gyártott microSD panelt fogjuk alkalmazni, aminek kialakításakor figyelembe vették mind a kétféle csatlakoztatási módot.
Arduino Libelium microSD modullal
Az SD kártyák csatlakoztatása a modul megvásárlása nélkül is igen egyszerű, mindössze pár ellenállásra van szükség, amikkel az Arduino 5 V-os rendszerű SPI buszának vonalait a memóriakártyák által elfogadható 3,3 V-os szintűvé alakítjuk. Tulajdonképpen a bemutatásra kerülő modul sem tesz ennél többet. A kártya eléréséhez az SPI könyvtár egy módosított változatát fogjuk használni, ami képes FAT partíción fájlstruktúrák kezelésére.
Amire szükségünk lesz:
- Arduino,
- Libelium microSD modul, vagy
- 5 V – 3,3 V szintillesztő.
Arduino kód: 63SDkartya
- - - - - - - - - -
forrás: http://arduino.cc/en/Reference/SD, http://arduino.cc/en/Tutorial/HomePage