Kadar moramo na mikrokrmilnik priključiti naprave, ki zahtevajo visok pretok podatkov – kot so barvni TFT grafični zasloni, bralniki SD kartic ali zunanji hitri pomnilniki – protokol I2C pogosto ni dovolj hiter. V takih primerih uporabimo SPI (Serial Peripheral Interface), ki velja za enega najhitrejših in najbolj zanesljivih sinhronih serijskih vmesnikov v vgrajenih sistemih.
Štiri linije SPI vodila
Protokol SPI za popolno dvosmerno (Full-Duplex) delovanje uporablja štiri namenske povezovalne linije.
| Linija | Oznaka | Opis in smer signala |
|---|---|---|
| MOSI | Master Out Slave In | Pošiljanje podatkov od mikrokrmilnika (Master) do zunanje naprave. |
| MISO | Master In Slave Out | Prejemanje podatkov od zunanje naprave nazaj v mikrokrmilnik. |
| SCK / SCLK | Serial Clock | Taktni signal, ki ga določa mikrokrmilnik za usklajevanje prenosa. |
| CS / SS | Chip Select / Slave Select | Izbirna linija za vklop posamezne naprave (aktivno nizko stanje - LOW). |
Glavne prednosti in delovanje protokola SPI
SPI se od drugih serijskih protokolov razlikuje po svoji preprostosti ter izjemni pasovni širini.
- Visoke hitrosti: Hitrosti prenosa zlahka dosežejo 10 MHz, 20 MHz ali celo več kot 50 MHz (odvisno od mikrokrmilnika).
- Polni dupleks (Full-Duplex): Oddajanje in sprejemanje podatkov potekata sočasno na ločenih linijah MOSI in MISO.
- Izbira naprave preko CS pina: Naprave nimajo programskih naslovov. Mikrokrmilnik izbere želeni modul tako, da njegov namenski CS pin postavi na nizko logično raven (LOW).
Primer uporabe SPI v Arduino kodi (Knjižnica SPI)
Spodnji primer prikazuje osnovno inicializacijo in pošiljanje ukaza zunanji SPI napravi.
#include <SPI.h>
const int chipSelectPin = 10; // Pin za izbiro naprave (CS)
void setup() {
pinMode(chipSelectPin, OUTPUT);
digitalWrite(chipSelectPin, HIGH); // Onemogoči napravo ob zagonu
SPI.begin(); // Vzpostavitev linij SCK, MOSI in MISO
}
void loop() {
digitalWrite(chipSelectPin, LOW); // Aktiviraj želeno SPI napravo
byte prejetPodatek = SPI.transfer(0xAA); // Sočasno pošlji ukaz in preberi odziv
digitalWrite(chipSelectPin, HIGH); // Deaktiviraj napravo
delay(500);
}
I2C ali SPI: Kdaj izbrati SPI?
Čeprav SPI porabi več pinov kot I2C (za vsako dodatno napravo potrebujemo nov CS pin), je nepogrešljiv za aplikacije z visoko hitrostjo prenosa podatkov, kot so zapisovanje na SD kartico, predvajanje zvoka ali osveževanje grafičnih TFT zaslonov.