El protocolo SPI (Serial Peripheral Interface) es la otra gran interfaz de comunicación serial, junto con I2C. Es más rápido pero usa más cables. Entender cuándo usar SPI en lugar de I2C es clave para diseñar circuitos eficientes con Arduino.
Los 4 Cables SPI
| Señal | Dirección | Función |
|---|---|---|
| MOSI | Master → Slave | Datos del Arduino al dispositivo |
| MISO | Slave → Master | Datos del dispositivo al Arduino |
| SCK | Master → Slave | Señal de reloj sincronización |
| CS / SS | Master → Slave | Chip Select: activa un dispositivo |
Pines SPI en Arduino Uno
- MOSI: Pin 11
- MISO: Pin 12
- SCK: Pin 13
- SS/CS: Cualquier pin digital (Pin 10 por convención)
SPI vs I2C: ¿Cuándo Usar Cada Uno?
| Criterio | SPI | I2C |
|---|---|---|
| Velocidad | Hasta 80 MHz | 100 kHz / 400 kHz |
| Cables | 4 + 1 CS por dispositivo | 2 (todos comparten) |
| Dispositivos max. | Ilimitado (1 CS cada uno) | 127 |
| Full-duplex | Sí (MOSI y MISO simultáneos) | No |
| Uso típico | SD card, TFT, NRF24L01, ADC rápidos | Sensores, RTC, LCD, OLED |
Ejemplo: Leer SD Card por SPI
#include <SPI.h>
#include <SD.h>
const int PIN_CS = 10;
void setup() {
Serial.begin(9600);
if (!SD.begin(PIN_CS)) {
Serial.println("SD no encontrada");
return;
}
File f = SD.open("datos.txt", FILE_WRITE);
if (f) {
f.println("Temperatura,Hora");
f.println("25.3,12:00");
f.close();
Serial.println("Datos guardados");
}
}
Múltiples Dispositivos SPI
Cada dispositivo SPI necesita su propio pin CS. Los pines MOSI, MISO y SCK se comparten. Para activar un dispositivo: poner su CS en LOW, enviar datos, luego CS en HIGH. Solo un dispositivo puede estar activo (CS=LOW) a la vez.