Înapoi la biblioteca de lecții
Protocoale de Comunicare de Mare Viteză

Protocolul SPI: Viteza Maximă în Electronică

Autostrada de mare viteză pentru date. Află cum funcționează comunicarea Full-Duplex pe 4 fire și când să o folosești în locul I2C.

1Ce este SPI? (Definiția pe înțelesul tuturor)

Definiție tehnică:

„SPI (Serial Peripheral Interface) este un protocol de comunicare serială, sincronă, de tip Full-Duplex, dezvoltat de Motorola la mijlocul anilor ’80. Este folosit pentru transmisii de date la distanțe scurte între un microcontroler și unul sau mai multe periferice.”

Pe scurt: Dacă I2C este ca un drum cu două benzi unde mașinile trebuie să aștepte să treacă pe rând (mai lent, dar cu doar 2 fire), SPI este o autostradă cu 4 benzi dedicate. Pe SPI, microcontrolerul poate trimite și primi date simultan (full-duplex), la viteze mari. Este o alegere bună pentru volume mari de date, cum ar fi imaginile afișate pe un ecran TFT sau citirea fișierelor de pe un card SD.

2Anatomia celor 4 fire SPI

O magistrală SPI standard folosește 4 linii de semnal:

MOSI (Master Out Slave In)

Linia pe care microcontrolerul (master) trimite comenzi și date către un senzor sau un ecran.

MISO (Master In Slave Out)

Linia pe care senzorul sau perifericul trimite date înapoi către microcontroler.

SCLK / SCK (Serial Clock)

Semnalul de ceas generat de microcontroler, care sincronizează transferul de date.

CS / SS (Chip / Slave Select)

Linia de selecție. Când este trasă la LOW (0 V), îi indică perifericului selectat: „Acum vorbesc cu tine!”

📍 Unde găsești pinii SPI pe placa ta?

  • • Arduino Uno: MOSI = Pin 11 | MISO = Pin 12 | SCK = Pin 13 | CS = Pin 10 (implicit)
  • • ESP32: MOSI = GPIO 23 | MISO = GPIO 19 | SCK = GPIO 18 | CS = GPIO 5

3Comparație între protocoale: SPI vs I2C

CriteriuProtocol SPIProtocol I2C
Viteză de TransferFoarte mare (10–80+ MHz)Medie (100 kHz–3,4 MHz)
Număr de Fire Necesare4 fire + câte 1 fir extra per cip (CS)Doar 2 fire (SDA, SCL)
Mod de comunicareFull-duplex (trimite și primește simultan)Half-duplex (un singur sens odată)
Aplicații TipiceEcrane TFT/LCD color, carduri SD, RFIDSenzori de mediu, ecrane OLED mici, RTC

4Când ar trebui să folosești SPI?

  • Ecrane grafice TFT color (ST7789, ILI9341)
  • Cititoare de carduri MicroSD
  • Cititoare RFID (RC522) sau module radio NRF24L01

5Cod de Bază: Inițializarea Magistralei SPI

Iată structura minimală C++ pentru a inițializa biblioteca hardware SPI.h și pentru a trimite/primi un octet de date:

spi_basic.ino
#include <SPI.h>

// Definim pinul Chip Select (CS)
const int chipSelectPin = 10;

void setup() {
  Serial.begin(115200);
  
  // Configuram pinul CS ca fiind iesire
  pinMode(chipSelectPin, OUTPUT);
  digitalWrite(chipSelectPin, HIGH); // Inactiv (HIGH)

  // Initializam magistrala SPI
  SPI.begin();
  
  Serial.println("Magistrala SPI a fost initializata cu succes!");
}

void loop() {
  // Selectam cipul tinta (tragem CS la LOW)
  digitalWrite(chipSelectPin, LOW);

  // Trimitem un octet de date si primim raspunsul simultan
  byte raspuns = SPI.transfer(0x42); 

  // Deselectam cipul (tragem CS inapoi la HIGH)
  digitalWrite(chipSelectPin, HIGH);

  Serial.print("Date trimise: 0x42 | Raspuns primit: 0x");
  Serial.println(raspuns, HEX);

  delay(2000);
}