En este tutorial vamos a ver cómo usar el protocolo SPI junto a una Raspberry Pi para comunicarnos con dispositivos externos de alta velocidad.
El SPI (Serial Peripheral Interface) es un protocolo de comunicación serial síncrono ampliamente utilizado para la comunicación entre un microcontrolador y dispositivos periféricos, como sensores, pantallas o memorias flash.
SPI es conocido por su alta velocidad y simplicidad, lo que lo convierte en una opción popular en proyectos de hardware (por contra, requiere más cables que I2C, por ejemplo)
Si quieres aprender más sobre el bus SPI consulta,
¿Qué es SPI?
SPI es un protocolo de comunicación full-duplex, lo que significa que los datos pueden enviarse y recibirse simultáneamente. Utiliza cuatro líneas principales para la comunicación:
- SCLK (Serial Clock): Señal de reloj generada por el maestro para sincronizar la comunicación.
- MOSI (Leader Out Follower In): Línea de datos desde el maestro hacia el follower.
- MISO (Leader In Follower Out): Línea de datos desde el follower hacia el maestro.
- SS/CS (Follower Select/Chip Select): Línea utilizada para seleccionar el dispositivo follower con el que se desea comunicar.
Cada dispositivo follower tiene su propia línea de selección, lo que permite al maestro comunicarse con un solo follower a la vez.
Conexión dispositivos SPI
La Raspberry Pi tiene dos puertos SPI disponibles: SPI0 y SPI1. El puerto SPI0 es el más comúnmente utilizado y está disponible en los siguientes pines GPIO:
- GPIO 8 (CE0): Chip Select 0
- GPIO 7 (CE1): Chip Select 1
- GPIO 11 (MOSI): Leader Out Follower In
- GPIO 9 (MISO): Leader In Follower Out
- GPIO 10 (SCLK): Serial Clock
Si tienes múltiples dispositivos followers conectados al bus SPI, debes utilizar las líneas de selección (CS) para seleccionar el dispositivo con el que deseas comunicarte.
Configuración de SPI en Raspberry Pi
La Raspberry Pi tiene soporte nativo para SPI a través de su GPIO (General Purpose Input/Output). Para utilizar SPI, primero debemos habilitarlo en la configuración del sistema.
Habilitar SPI en Raspberry Pi
Abrimos la terminal en tu Raspberry Pi.
Ejecutamos el siguiente comando para abrir la configuración de Raspberry Pi:
sudo raspi-config
Vamos a Interfacing Options > SPI y seleccinamos Yes para habilitar I2C.
Reinicia la Raspberry Pi para aplicar los cambios:
sudo reboot
Después de reiniciar, puedes verificar si SPI está habilitado ejecutando el siguiente comando en la terminal:
lsmod | grep spi
Si SPI está habilitado, deberías ver algo como spi_bcm2835
en la salida.
Programación de SPI en Python
Para interactuar con dispositivos SPI en Raspberry Pi, podemos utilizar la biblioteca spidev
, que proporciona una interfaz sencilla para trabajar con SPI en Python.
Primero, instala la biblioteca spidev
ejecutando el siguiente comando en la terminal:
sudo apt-get install python3-spidev
Vamos con un ejemplo sencillo de cómo enviar y recibir datos a través de SPI utilizando Python:
import spidev
# Crear una instancia de SPI
spi = spidev.SpiDev()
# Abrir el bus SPI (bus 0, dispositivo 0)
spi.open(0, 0)
# Configurar la velocidad del reloj (en Hz)
spi.max_speed_hz = 1000000 # 1 MHz
# Enviar datos al dispositivo SPI
datos_enviados = [0x01, 0x02, 0x03] # Datos a enviar
datos_recibidos = spi.xfer(datos_enviados) # Enviar y recibir datos
# Imprimir los datos recibidos
print("Datos recibidos:", datos_recibidos)
# Cerrar la conexión SPI
spi.close()
En este ejemplo,
- Abrimos el bus SPI0 y configuramos la velocidad del reloj a 1 MHz.
- Luego, enviamos una lista de bytes (
[0x01, 0x02, 0x03]
) al dispositivo SPI y recibimos la respuesta.
Ejemplos prácticos
Comunicación con un sensor SPI
Supongamos que tenemos un sensor SPI que mide la temperatura y devuelve un valor de 2 bytes. Aquí te muestro cómo podríamos leer la temperatura utilizando SPI:
import spidev
# Crear una instancia de SPI
spi = spidev.SpiDev()
# Abrir el bus SPI (bus 0, dispositivo 0)
spi.open(0, 0)
# Configurar la velocidad del reloj (en Hz)
spi.max_speed_hz = 1000000 # 1 MHz
# Enviar comando para leer la temperatura
comando = [0x01] # Comando para leer la temperatura
respuesta = spi.xfer(comando) # Enviar comando y recibir respuesta
# Convertir la respuesta a temperatura
temperatura = (respuesta[0] << 8) | respuesta[1] # Combinar los 2 bytes
temperatura = temperatura / 10.0 # Convertir a grados Celsius
# Imprimir la temperatura
print(f"Temperatura: {temperatura} °C")
# Cerrar la conexión SPI
spi.close()
En este ejemplo,
- Enviamos un comando al sensor para leer la temperatura y recibimos una respuesta de 2 bytes.
- Luego, combinamos los bytes y convertimos el valor a grados Celsius.