El bus SPI
EL BUS SPI, UNA SOLUCIÓN SÍNCRONA
El SPI es un protocolo de comunicación síncrona de 4 hilos, entre dispositivos electrónicos presentado por Motorola en 1982, que ha ganado bastante aceptación en la industria como sistema de comunicación de muy corta distancia, normalmente dentro la placa de circuito impreso.
Es un protocolo de transmisión que permite alcanzar velocidades muy altas y que se diseñó pensando en comunicar un micro controlador con distintos periféricos y que funciona a full dúplex (Una forma retorcida de decir que puede enviar y recibir datos al mismo tiempo).
SPI utiliza una solución síncrona, porque utiliza unas líneas diferentes para los datos y el Clock. El Clock es una señal que indica al que escucha exactamente cuándo leer las líneas de datos, con lo que el problema de perdida de sincronía se elimina de raíz.
Por eso mismo, no se necesita pactar la velocidad de transmisión, ya que será el Clock quien fije la velocidad y puede ser variable a lo largo de la comunicación sin que sea un problema (Aunque por supuesto según el dispositivo habrá un límite de velocidad).
Uno de los motivos por los que SPI es tan popular es que el hardware de recepción puede ser un sencillo Shift register como los que vimos en la sesión N, Lo que es una solución mucho más simple (Y barata) que una UART (Universal Asíncronous Receiver Transmitter o sistema universal asíncrono de recepción y transmisión serie) de comunicación serie.
CÓMO SE RECIBEN LOS DATOS
En un bus SPI una de las partes genera el Clock al que llamamos master, y el resto son los esclavos, pudiendo haber uno o varios en el bus. A la señal de reloj se le suele llamar CLK por Clock o SCK por Serial Clock.
Cuando el master envía información, lo hace por una línea de datos que normalmente de nombre MOSI (Master Out Slave In) y si el esclavo responde lo hace a través de una línea llamada MISO (Master In Slave Out) siguiendo una de esas tradiciones de imaginación desbordante en los nombres tecnológicos.
Como es el master quien genera el Clock, necesita saber de antemano, si un esclavo va a devolver una respuesta y de que longitud, para mantener el Clock hasta que la transferencia esté completa.
Esto no es normalmente un problema porque cuando el master pide a, digamos un sensor, que le envié una lectura, normalmente sabemos que van ser 2 bytes.
SELECCIÓN DE ESCLAVO SLAVE SELECT SS
Hay una última línea de control, llamada Slave Select o SS, que indica a un esclavo que el mensaje que viene es para él, o bien que se reclama que envié una respuesta a una petición del master.
La línea SS normalmente se mantiene HIGH y se activa con LOW, lo que despierta al esclavo seleccionado. Cuando se termina la transferencia la línea se levanta a HIGH y el esclavo se desactiva.
BUS CON MÚLTIPLES ESCLAVOS
Hay dos maneras de conectar múltiples esclavos a un bus SPI. Con una línea SS por cada esclavo o en cascada:
En general cada esclavo requiere su propia línea SS para ser activado, y así evitar que dos hablen a la vez, porque el resultado sería ruido inútil. Basta con activar la línea correspondiente y el esclavo esta listo para recibir sus órdenes
Es un sistema cómodo, siempre y cuando no sean muchos esclavos porque podemos necesitar muchas líneas.
Cuando el número de esclavos crece suele ser más frecuente conectarlos en cascada, con el MISO de uno (Salida), conectado al MOSI (Entrada) del siguiente. En este caso solo usamos una única línea SS, que se comparte entre todos los esclavos.
Esta configuración es típica de una situación en la que le master envía datos pero no recibe nada de vuelta, como en el caso de una cadena de múltiples display LEDs ( Matrices de 8×8) , en los que se envía información para ser mostrada pero, no hay datos de vuelta. En este caso incluso podemos desconectar la línea MISO
Por último y para cerrar esta sesión, comentar que naturalmente vuestro Arduino soporta de serie el bus SPI, con una librería estándar que sorprendentemente se llama SPI y que podéis instalar tranquilamente, que gestiona todas las complicaciones y el arbitraje del protocolo.
COMPARACIÓN CON I2C Y CON PUERTO SERIE NORMAL
Ventajas del Bus SPI
- Comunicación Full Dúplex. Envía y recibe a la vez lo que aumenta la velocidad.
- Más rápido que el I2C y que el puerto Serie asíncrono normal
- El tamaño de los mensajes puede ser arbitrariamente grande
- Se requiere un hardware sencillo (Léase barato)
- Requiere un menor consumo y menor electrónica de conexión que el I2C
- Como el Clock lo proporciona el master, los esclavos no necesitan osciladores ( O sea, otra vez más barato)
Y como en la vida no hay nada gratis, las desventajas son:
- Necesita más pines que el I2C o el Puerto serie normal.
- Las comunicaciones tiene que estar perfectamente establecidas de antemano. No puedes enviar mensajes de diferentes longitudes cuando te convenga.
- No hay señal de conforme del esclavo, se espera que obedezca y punto.
- Master único y casi sin posibilidad de master múltiple
- Funciona solo en distancias muy cortas
- Normalmente necesita un pin adicional por cada esclavo y si el número de esta creces puede acabar siendo un problema.
PINES SPI EN ARDUINO
Aunque últimamente han aparecido algunas librerías que nos permiten mover de sitio los pines de control del SPI en nuestros Arduino, tradicionalmente estos, estaban fijados a unos ciertos pines.
Eso significa, que para controlar el bus SPI es necesario usar esos pines inexcusablemente, aunque podemos elegir entre dos juegos de ellos, entre ciertos pines digitales, según el modelo y la tabla que especificamos abajo, y usando los equivalentes en el bus ICSP.
Esos pines son:
MODELO ARDUINO |
MOSI |
MISO |
SCK |
SS SLAVE |
SS MASTER |
UNO |
11, ICSP-4 |
12, ICSP-1 |
13, ICSP-3 |
10 |
Z |
MEGA |
51, ICSP-4 |
50, ICSP-1 |
52, ICSP-3 |
53 |
Z |
Leonardo |
ICSP-4 |
ICSP-1 |
ICSP-3 |
Z |
z |
DUE |
ICSP-4 |
ICSP-1 |
ICSP-3 |
z |
4,10,52 |
Fíjate que aunque los pines del bus SPI cambian según el modelo de Arduino que usemos, siempre son los mismos en el ICSP.
Eso permite diseñar shields coherentes con todos los modelos de Arduino.
Los pines ICSP son esos que están a la derecha centrados cuando leemos los rótulos en la placa:
Obra publicada con Licencia Creative Commons Reconocimiento No comercial Compartir igual 4.0