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.

Cuatro trazas de señal apiladas: CS arriba, SCK debajo, y luego MOSI y MISO. CS empieza en alto (reposo), baja a nivel bajo para iniciar la transacción, y entonces SCK genera ocho pulsos mientras MOSI y MISO transportan un byte de datos cada uno; después CS vuelve a nivel alto.

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 veces CPOL): el estado de reposo de SCK. 0 significa que el reloj reposa en bajo y pulsa en alto; 1 significa que el reloj reposa en alto y pulsa en bajo.

  • Fase del reloj (phase, a veces CPHA): qué flanco muestrea los datos. 0 muestrea en el primer flanco de cada pulso de reloj (flanco anterior); 1 muestrea 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.