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:
Linia pe care microcontrolerul (master) trimite comenzi și date către un senzor sau un ecran.
Linia pe care senzorul sau perifericul trimite date înapoi către microcontroler.
Semnalul de ceas generat de microcontroler, care sincronizează transferul de date.
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
| Criteriu | Protocol SPI | Protocol I2C |
|---|---|---|
| Viteză de Transfer | Foarte mare (10–80+ MHz) | Medie (100 kHz–3,4 MHz) |
| Număr de Fire Necesare | 4 fire + câte 1 fir extra per cip (CS) | Doar 2 fire (SDA, SCL) |
| Mod de comunicare | Full-duplex (trimite și primește simultan) | Half-duplex (un singur sens odată) |
| Aplicații Tipice | Ecrane TFT/LCD color, carduri SD, RFID | Senzori 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:
#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);
}