Î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.”

Traducerea simplă: Dacă I2C este ca un drum cu două benzi unde mașinile trebuie să își aștepte rândul să treacă (comunicare 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 uriașe. Este protocolul preferat atunci când ai de transferat volume mari de date: imagini pe ecrane color TFT sau citiri de fișiere 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 senzor sau ecran.

MISO (Master In Slave Out)

Linia pe care senzorul/perifericul trimite datele înapoi către microcontroler.

SCLK / SCK (Serial Clock)

Impulsul de ceas generat de microcontroler care menține sincronizarea perfectă a datelor.

CS / SS (Chip / Slave Select)

Firul de selecție. Când este tras la LOW (0V), îi spune acelui senzor specific: „Acum vorbesc cu tine!”

📍 Unde găsești pinii SPI pe plăcile tale?

  • 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

3Bătălia Protocoalelor: SPI vs I2C

CriteriuProtocol SPIProtocol I2C
Viteză de TransferExtrem de 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 ComunicareFull-Duplex (Trimite & Primeste simultan)Half-Duplex (Un singur sens la un moment dat)
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
  • Senzori RFID (RC522) sau NRF24L01 (Radio)

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);
}