3.21. Fundamentos de SPI#
SPI (Serial Peripheral Interface) es un bus serie síncrono diseñado para enlaces de corta distancia y alta velocidad entre un controlador y uno o varios dispositivos periféricos en la misma placa. Es la interfaz estándar para tarjetas SD, pantallas, memoria flash, ADC y DAC, y una amplia variedad de sensores.
Mientras que UART no tenía un reloj compartido y recuperaba la sincronización a partir de la propia línea de datos, SPI lleva un cable de reloj junto a los cables de datos. El controlador genera el reloj a la velocidad que desee, y cualquier otro dispositivo del bus muestrea los datos en sincronía con ese reloj. No hay que adivinar la velocidad en baudios ni existe sobrecarga de tramas: solo flancos de reloj y bits.
3.21.1. Los cuatro cables#
Un bus SPI full-duplex tiene cuatro cables:
SCK (reloj serie). Lo genera el controlador. Cada bit se introduce o se extrae en un flanco de esta señal.
MOSI (salida del controlador, entrada del periférico). La línea de salida del controlador; el periférico muestrea los bits de ella.
MISO (entrada del controlador, salida del periférico). La línea de salida del periférico; el controlador muestrea los bits de ella.
CS (selección de chip), a veces llamada SS (selección de periférico). Una línea independiente por periférico. El controlador pone CS a nivel bajo para iniciar una transacción y a nivel alto de nuevo para finalizarla; cualquier periférico con su CS desactivado ignora por completo el bus y deja de controlar su salida MISO.
Un byte SPI: CS pasa a nivel bajo para seleccionar el periférico, SCK genera ocho bits, y MOSI y MISO transfieren un byte cada uno en direcciones opuestas.#
Cada flanco de reloj mueve un bit en cada dirección al mismo tiempo. Un único pulso de SCK envía simultáneamente un bit por MOSI y recibe un bit por MISO: SPI es full-duplex a nivel de cable. El software no tiene por qué usar ambas direcciones: las transacciones de solo escritura y de solo lectura son habituales, y la línea no utilizada se ignora o se mantiene en alto.
3.21.2. Polaridad y fase del reloj#
Dos bits de configuración deciden exactamente qué flanco de reloj mueve los datos:
Polaridad del reloj (
polarity, a vecesCPOL): el estado de reposo de SCK.0significa que el reloj reposa en bajo y pulsa en alto;1significa que el reloj reposa en alto y pulsa en bajo.Fase del reloj (
phase, a vecesCPHA): qué flanco muestrea los datos.0muestrea en el primer flanco de cada pulso de reloj (flanco anterior);1muestrea en el segundo flanco (flanco posterior).
Juntos dan lugar a cuatro modos, denominados convencionalmente del Modo 0 al Modo 3. El Modo 0 (polarity=0, phase=0) es el más común y un valor predeterminado seguro para dispositivos desconocidos.
La regla fundamental es que ambos extremos deben coincidir en el modo. Modos no coincidentes producen datos basura aunque las líneas de reloj y datos estén conectadas correctamente; si un dispositivo devuelve un resultado sin sentido en la primera transacción, el modo es lo primero que hay que comprobar.
3.21.3. Varios periféricos#
Varios periféricos pueden compartir las mismas líneas SCK, MOSI y MISO siempre que cada uno tenga su propia línea CS controlada por el controlador:
Todos los periféricos ven el mismo reloj y los mismos datos, pero cada uno vigila su propio CS. Con CS desactivado (alto), un periférico ignora por completo SCK y MOSI y deja MISO en estado de alta impedancia para no competir con otros dispositivos por la línea.
El controlador activa exactamente un CS a la vez, ejecuta la transacción y desactiva CS para liberar el bus.
Un microcontrolador con un único bloque hardware de SPI puede comunicarse con tantos periféricos como pines GPIO libres tenga disponibles para las líneas CS: no hay direccionamiento en el propio bus.
3.21.4. Puntos fuertes y débiles#
Tanto los puntos fuertes como los débiles de SPI se derivan de su diseño:
Rápido. En trazas cortas con una traducción de niveles sencilla se pueden alcanzar decenas de megahercios. Los lectores de tarjetas SD y las pantallas SPI aprovechan esto.
Sencillo a nivel de cable. Sin direccionamiento, sin confirmaciones, sin condiciones especiales de inicio/parada: solo bits en los cables sincronizados con un reloj.
Consume muchos pines. Tres líneas compartidas más un CS por periférico. Una placa con cinco dispositivos SPI usa ocho pines (tres + cinco).
Corta distancia. SPI presupone flancos limpios y rápidos, lo que implica trazas cortas en la misma placa. Para enlaces más largos, I2C o alguno de los buses con tramas encaja mejor.