SPI: El Protocolo de Comunicación Rápida para IoT
🚀 ¿Qué es SPI?
SPI (Serial Peripheral Interface) es un protocolo de comunicación síncrona desarrollado por Motorola que permite la comunicación de alta velocidad entre microcontroladores y periféricos. A diferencia de I2C o UART, SPI está diseñado para velocidad y es ideal para sensores, pantallas, memorias y módulos RF en proyectos IoT.
📌 Características principales
- Comunicación full-duplex (datos simultáneos en ambas direcciones)
- Velocidades muy altas (hasta varios MHz)
- Protocolo maestro-esclavo con un dispositivo maestro controlando múltiples esclavos
- 4 líneas de comunicación (MOSI, MISO, SCK, CS/SS)
🔌 Pines y conexiones
SPI utiliza 4 líneas principales:
- MOSI (Master Out Slave In): Datos del maestro al esclavo
- MISO (Master In Slave Out): Datos del esclavo al maestro
- SCK (Serial Clock): Señal de reloj generada por el maestro
- CS/SS (Chip Select/Slave Select): Selección de dispositivo esclavo
Maestro (ESP32) → Esclavo (Sensor)
MOSI (Pin 23) → MOSI/DIN
MISO (Pin 19) ← MISO/DOUT
SCK (Pin 18) → SCK/CLK
CS (Pin 5) → CS/SS
⚡ Ventajas de SPI en IoT
- Alta velocidad: Ideal para pantallas, cámaras y sensores de alta frecuencia
- Full-duplex: Envío y recepción simultánea de datos
- Simple implementación: Sin direccionamiento complejo como I2C
- Bajo overhead: Sin bits de start/stop como UART
🛠️ Dispositivos comunes que usan SPI
- Pantallas: TFT, OLED, E-Paper
- Memorias: EEPROM, Flash, tarjetas SD
- Sensores: Acelerómetros, giroscopios, barómetros
- Módulos RF: NRF24L01, LoRa SX1278
- Convertidores: ADC/DAC externos
💻 Ejemplo práctico: ESP32 + Sensor MPU6050
#include <SPI.h>
#define CS_PIN 5
void setup() {
Serial.begin(115200);
SPI.begin();
pinMode(CS_PIN, OUTPUT);
digitalWrite(CS_PIN, HIGH); // CS inactivo por defecto
}
void loop() {
// Seleccionar dispositivo
digitalWrite(CS_PIN, LOW);
// Enviar comando para leer WHO_AM_I (0x75)
SPI.transfer(0x75 | 0x80); // Bit 7 = 1 para lectura
uint8_t whoami = SPI.transfer(0x00); // Leer respuesta
// Deseleccionar dispositivo
digitalWrite(CS_PIN, HIGH);
Serial.print("WHO_AM_I: 0x");
Serial.println(whoami, HEX);
delay(1000);
}
🔄 Modos de SPI
SPI tiene 4 modos definidos por la polaridad (CPOL) y fase (CPHA) del reloj:
Modo | CPOL | CPHA | Descripción |
---|---|---|---|
0 | 0 | 0 | Reloj bajo en reposo, datos en flanco ascendente |
1 | 0 | 1 | Reloj bajo en reposo, datos en flanco descendente |
2 | 1 | 0 | Reloj alto en reposo, datos en flanco descendente |
3 | 1 | 1 | Reloj alto en reposo, datos en flanco ascendente |
📊 SPI vs otros protocolos
Protocolo | Velocidad | Pines | Dispositivos | Complejidad |
---|---|---|---|---|
SPI | Muy alta | 4+n | Múltiples | Baja |
I2C | Media | 2 | Múltiples | Media |
UART | Baja | 2 | 1 a 1 | Muy baja |
🎯 Consejos para usar SPI en IoT
- Cables cortos: SPI es sensible al ruido a altas velocidades
- Alimentación estable: Usa condensadores de desacoplo
- Pull-ups en CS: Evita estados flotantes
- Documentación: Siempre revisa el datasheet del sensor
- Nivel lógico: Verifica compatibilidad 3.3V/5V
🔧 Configuración avanzada en ESP32
SPISettings settingsA(1000000, MSBFIRST, SPI_MODE0);
void readSensor() {
SPI.beginTransaction(settingsA);
digitalWrite(CS_PIN, LOW);
// Tu código aquí
digitalWrite(CS_PIN, HIGH);
SPI.endTransaction();
}
🚨 Problemas comunes
- CS mal conectado: Verifica las conexiones de Chip Select
- Modo SPI incorrecto: Consulta el datasheet del dispositivo
- Velocidad muy alta: Reduce la frecuencia del reloj
- Cables largos: Mantén las conexiones cortas y blindadas
SPI es fundamental en IoT para aplicaciones que requieren alta velocidad y bajo latency. Su simplicidad y rendimiento lo convierten en la opción ideal para sensores críticos, pantallas y almacenamiento en proyectos IoT profesionales.