Comunicación síncrona de alta velocidad con periféricos externos
Comenzar arrow_downwardSerial Peripheral Interface: comunicación síncrona de corta distancia a alta velocidad.
SPI es ideal cuando necesitas velocidad y simplicidad. A diferencia de I2C, no hay direccionamiento por software - cada esclavo tiene su propia línea de selección.
Múltiples esclavos en el mismo bus, cada uno con línea CS dedicada.
SCLK, MOSI y MISO son compartidos por todos los esclavos. Solo el seleccionado responde.
Cada esclavo tiene su propia línea CS. Necesitas N pines GPIO para N esclavos.
MOSI y MISO permiten enviar y recibir datos simultáneamente en cada ciclo de reloj.
Diagrama de tiempos durante una transferencia de datos.
Por defecto, SPI transmite el bit más significativo (MSB) primero:
Recorre paso a paso una transferencia SPI completa. Observa cómo MOSI y MISO transmiten datos simultáneamente (full-duplex).
0xA5 por MOSI mientras el Slave responde 0x3C por MISO, simultáneamente.
CPOL y CPHA definen cuándo se muestrean y cambian los datos.
¿Cuándo usar cada protocolo?
| Característica | SPI | I2C |
|---|---|---|
| Velocidad máxima | 10+ MHz | 400 kHz (FM) / 3.4 MHz (HS) |
| Número de hilos | 4 (+ 1 CS por esclavo) | 2 (SDA + SCL) |
| Direccionamiento | Por línea CS (hardware) | 7/10 bits (software) |
| Comunicación | Full-duplex | Half-duplex |
| Acknowledgment | No | Sí (ACK/NACK) |
| Multi-master | Complejo | Soportado |
| Distancia máxima | Corta (~cm) | Corta (~m con buffers) |
| Uso típico | Flash, displays, ADCs rápidos | Sensores, EEPROMs, RTCs |
El nRF52840 ofrece tres variantes del periférico SPI.
Periférico SPI básico con CPU polling o interrupciones.
SPI Master con EasyDMA para transferencias eficientes.
SPI Slave para cuando el nRF actúa como periférico.
SPIM (con EasyDMA) en Zephyr. La API de Zephyr lo configura automáticamente con compatible = "nordic,nrf-spim".
Configuración y estructuras básicas para comunicación SPI.
SPI_WORD_SET(8) - 8 bits por palabraSPI_TRANSFER_MSB - MSB primeroSPI_OP_MODE_MASTER - Modo master
Funciones principales para operaciones de lectura, escritura y transferencia.
spi_transceive_dt es la funcion mas versatil - permite enviar y recibir datos en una sola llamada.
Configuración del hardware SPI mediante overlays.
reg del esclavo.cs-gpios y más nodos hijos con diferentes valores de reg.
Configuracion inicial y funcion de lectura de registros SPI.
bme280 definido en el overlay del devicetree.
Implementacion de lectura de registros via SPI.
Uso de la funcion read_register para leer el ID del chip.
len en el buffer RX. El BME280 auto-incrementa la direccion.
*** Booting Zephyr OS ***[00:00:00.001,000] <inf> spi_demo: BME280 ID: 0x60
Conceptos clave sobre el protocolo SPI en sistemas embebidos NRF.
SCLK (reloj), MOSI (master to slave), MISO (slave to master), CS (chip select activo bajo).
CPOL define polaridad del reloj, CPHA define flanco de muestreo. Modo 0 (CPOL=0, CPHA=0) es el más común.
SPI_DT_SPEC_GET para config, spi_is_ready_dt para validar, spi_transceive_dt para comunicación full-duplex.
"SPI es el bus preferido cuando la velocidad importa y los pines no son un recurso escaso."
Memorias Flash, displays, ADCs de alta velocidad, y cualquier periférico que requiera transferencias rápidas de datos se beneficia de SPI.
Arquitectura de drivers y cómo extender el sistema operativo.