Saltar al contenido
GEEKnodes

Electrónica

I2C, SPI y UART: diferencias y cuál usar en Arduino, ESP32 y Raspberry Pi

Qué son I2C, SPI y UART, cómo se conectan, sus velocidades y qué pines usar en Arduino Uno, ESP32 y Raspberry Pi. Con los errores más habituales.

Casi todos los sensores, pantallas y módulos que conectas a un Arduino, un ESP32 o una Raspberry Pi hablan uno de estos tres idiomas: I2C, SPI o UART. Saber cómo funciona cada uno te ahorra horas de depuración y te ayuda a elegir módulos que no te den problemas al combinarlos.

Resumen

I2CSPIUART
Cables de señal2 (SDA, SCL)4 (MOSI, MISO, SCK, CS) + 1 CS por dispositivo2 (TX, RX)
Dispositivos por busMuchos (hasta 127 direcciones de 7 bits)Varios, cada uno con su línea CS2 (punto a punto)
Velocidad típica100 kHz, 400 kHz (1 MHz en Fast-mode Plus)De 1 a decenas de MHz9600–115200 baudios habituales (hasta Mb/s)
RelojCompartido (lo genera el maestro)Compartido (lo genera el maestro)Ninguno: ambos acuerdan la velocidad
DúplexSemidúplexDúplex completoDúplex completo
Ideal paraSensores, pantallas pequeñas, RTC, expansoresPantallas TFT, tarjetas SD, ADC rápidos, memoriasGPS, módulos Bluetooth/LoRa, consola de depuración

I2C: dos cables para muchos dispositivos

I2C (Inter-Integrated Circuit) usa dos líneas compartidas por todos los dispositivos:

  • SDA: datos.
  • SCL: reloj.
Maestro y tres periféricos comparten las líneas SDA y SCL con resistencias pull-up y direcciones distintas.
I2C conecta varios dispositivos en las mismas dos líneas; cada uno responde a su dirección.

Cada dispositivo tiene una dirección (por ejemplo, 0x27 o 0x3F en los adaptadores de LCD, 0x76 en el sensor BME280). El maestro llama a una dirección y solo responde ese dispositivo.

Las dos líneas necesitan resistencias pull-up a la tensión del bus (normalmente entre 4,7 kΩ y 10 kΩ). La mayoría de módulos ya las llevan; si conectas muchos módulos con pull-up, el valor total baja y puede dar problemas.

Ventajas: muy pocos cables, fácil añadir dispositivos. Inconvenientes: lento comparado con SPI, sensible a cables largos y a direcciones repetidas (dos módulos iguales con la misma dirección no pueden ir en el mismo bus sin cambiarla).

Un ejemplo práctico lo tienes en configurar un display LCD con I2C y un sensor de temperatura.

SPI: rápido y sencillo

SPI (Serial Peripheral Interface) usa cuatro líneas:

  • SCK: reloj, generado por el maestro.
  • MOSI (o COPI): datos del maestro al periférico.
  • MISO (o CIPO): datos del periférico al maestro.
  • CS (o SS): selección de chip, una por dispositivo.
Maestro SPI comparte SCK, MOSI y MISO con dos periféricos y selecciona cada uno con su línea CS.
SPI comparte tres líneas de señal y usa una línea CS independiente por periférico.

Las líneas SCK, MOSI y MISO se comparten; el maestro activa la línea CS del dispositivo con el que quiere hablar. No hay direcciones.

Ventajas: mucha velocidad (ideal para pantallas y tarjetas SD), protocolo simple. Inconvenientes: más cables y un pin extra por cada dispositivo. Hay que configurar el modo SPI (0–3) correcto para cada chip.

UART: el puerto serie de toda la vida

UART (Universal Asynchronous Receiver-Transmitter) conecta dos dispositivos con dos líneas cruzadas:

  • TX de uno → RX del otro.
  • RX de uno ← TX del otro.
  • GND común.
Dos placas UART conectan TX con RX y RX con TX, además de compartir GND.
En UART, las líneas TX y RX se cruzan y ambos dispositivos comparten tierra.

No hay reloj: los dos lados tienen que usar la misma velocidad (baudios), por ejemplo 9600 o 115200, y el mismo formato (habitualmente 8N1: 8 bits, sin paridad, 1 bit de parada).

Ventajas: universal, ideal para depurar (el Monitor Serie de Arduino va por UART) y para módulos como GPS o Bluetooth. Inconvenientes: solo dos dispositivos por puerto y, si las velocidades no coinciden, solo recibes basura.

Pines en las placas más comunes

PlacaI2C (SDA / SCL)SPI (MOSI / MISO / SCK)UART (TX / RX)
Arduino Uno / Nano (ATmega328P)A4 / A5D11 / D12 / D13D1 / D0 (compartido con el USB)
ESP32 (DevKit)GPIO 21 / 22 por defecto, configurablesGPIO 23 / 19 / 18 (VSPI) por defectoUART0 en GPIO 1 / 3 (USB); UART2 en GPIO 17 / 16
Raspberry Pi (40 pines)GPIO 2 / 3 (pines 3 y 5)GPIO 10 / 9 / 11 (pines 19, 21, 23)GPIO 14 / 15 (pines 8 y 10)

En la Raspberry Pi, I2C, SPI y el puerto serie vienen desactivados. Se activan con sudo raspi-config → Interface Options.

Niveles de tensión: el error que quema placas

  • Arduino Uno trabaja a 5 V.
  • ESP32 y Raspberry Pi trabajan a 3,3 V y no toleran 5 V en sus pines.

Si conectas un módulo de 5 V a un ESP32 o una Raspberry Pi, usa un convertidor de niveles lógicos (en I2C, uno bidireccional) o un módulo que admita 3,3 V.

Problemas habituales

  • I2C: el dispositivo no responde. Ejecuta un escáner I2C para ver qué direcciones hay en el bus: en Arduino, el sketch i2c_scanner; en Raspberry Pi, i2cdetect -y 1. Si no aparece nada, revisa SDA/SCL (¿están cruzados?), la alimentación y las pull-up.
  • I2C: dos módulos con la misma dirección. Muchos módulos permiten cambiarla con puentes de soldadura (A0, A1, A2). Si no, usa un multiplexor I2C como el TCA9548A.
  • SPI: la pantalla se queda en blanco. Revisa la línea CS y el pin DC/RS (las pantallas TFT tienen uno extra), y el modo SPI.
  • UART: caracteres raros. Velocidad distinta en cada lado o TX/RX sin cruzar. Y no olvides el GND común.
  • Arduino Uno: no puedo subir el sketch. Si tienes algo conectado a D0/D1, interfiere con el USB. Desconéctalo al programar o usa SoftwareSerial en otros pines.

Relacionados

Preferencias de accesibilidad

Perfiles rápidos

Texto y lectura

Tamaño del texto
Por defecto
Altura de línea
Por defecto
Espaciado entre letras
Por defecto
Espaciado entre palabras
Por defecto

Color

Movimiento y orientación

Cursor