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:
Linia pe care microcontrolerul (Master) trimite comenzi și date către senzor sau ecran.
Linia pe care senzorul/perifericul trimite datele înapoi către microcontroler.
Impulsul de ceas generat de microcontroler care menține sincronizarea perfectă a datelor.
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
| Criteriu | Protocol SPI | Protocol I2C |
|---|---|---|
| Viteză de Transfer | Extrem de 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 Comunicare | Full-Duplex (Trimite & Primeste simultan) | Half-Duplex (Un singur sens la un moment dat) |
| 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
- 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:
#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);
}