Blog o spletnem programiranju in elektroniki
💬 👤
back Nazaj na blog
Arduino & Elektronika

Kako deluje SPI komunikacijski protokol in zakaj je izjemno hiter

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.

  1. Visoke hitrosti: Hitrosti prenosa zlahka dosežejo 10 MHz, 20 MHz ali celo več kot 50 MHz (odvisno od mikrokrmilnika).
  2. Polni dupleks (Full-Duplex): Oddajanje in sprejemanje podatkov potekata sočasno na ločenih linijah MOSI in MISO.
  3. 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.

back Nazaj na blog