Mejora tu programación con Arduino: comunicación SPI

Entre los protocolos de comunicación más populares para conectar perifericos a un microcontrolador está el protocolo SPI. Se trata de un protocolo serial mediante el cual puedes transferir información entre un dispositivo maestro y uno esclavo de forma rápida y eficaz.

Resumen: En este tutorial aprenderás a comunicar un Arduino Uno con un registro de corrimiento de 8 bits mediante comunicación SPI, para mostrar los datos en 8 LEDs.

Ejemplo de aplicación de dos dispositivos SPI

SPI significa Serial Peripherial Interface o Interfaz de Perifericos Seriales, este tipo de protocolo permite establecer una comunicación de alta velocidad entre uno o varios dispositivos. La transmisión de datos se realiza de manera sincrona, es decir, los datos se envían cada pulso de una señal de reloj. Este tipo de comunicación permite enviar y recibir datos de manera simultánea, aunque solo permite que un dispositivo sea el maestro.

Para hacer funcionar este protocolo tenemos 4 lineas principales: CLK , MISO, MOSI y CS. CLK es la señal de reloj que administra los datos, MOSI es la salida del maestro hacia el esclavo y MISO es la entrada del maestro desde el esclavo para recibir los datos. CS es la salida del maestro que permite seleccionar el dispositivo esclavo al que mandará los datos. La desventaja de este protocolo es que se requiere una salida por cada dispositivo a manejar.

La comunicación lleva el siguiente proceso:

  • El maestro manda la salida CS a 0 para indicarle al esclavo que se va a realizar la comunicación.
  • Se habilita la salida de reloj CLK que generará una señal de pulsos que sincroniza los datos enviados/recibidos
  • Tanto el maestro como el esclavo leen el primer bit con el flanco de subida de la señal de reloj para transferir los bits, cuando se da el flanco de bajada se prepara el siguiente bit a enviar.
  • Una vez transferida la información, CS se vuelve 1, lo que finaliza la transferencia de datos.

Veamos el código en Arduino para ver la implementación. Para usar el protocolo es necesario incluir la libreria SPI.h y en este caso declaramos un pin de selección de esclavo, el pin 2. Lo configuramos como salida, establecemos la comunicación y dentro del loop mandamos los datos al registro SPI.

#include <SPI.h>

int slaveSelect = 2;    //Este pin selecciona el esclavo a manejar

int delayTime = 250;     //Pausa entre cada transferencia de datos

void setup() {
  pinMode(slaveSelect, OUTPUT);   //configuramos el selector como salida
  SPI.begin();                    //iniciamos la comunicación
  SPI.setBitOrder(LSBFIRST);      //el orden de transferencia manda primero 
                                  //el bit de menor valor
}                                 //MSBFIRST manda el de mayor peso primero

void loop() {
  for (int i; i < 256; i++)        
  {
    digitalWrite(slaveSelect, LOW);      
    SPI.transfer(i);                     
    digitalWrite(slaveSelect, HIGH);     
    delay(delayTime);                    
  }
}

Este es un diagrama del cableado que tenemos que realizar. Usaremos el shift register 74HC595. Como se puede observar los pines SCK y MOSI para el Arduino UNO siempre serán los pines 13 y 11, respectivamente. Dado que no recibimos datos del dispositivo esclavo no usamos MISO, pero ese corresponde al pin 12 del Arduino UNO.

Si todo salió en orden deberías poder observar los LEDs encendiéndose y apagándose de manera incremental, acorde a un conteo binario. En este caso el LED rojo es el de menor peso, por lo que debería parpadear más rápido. Si cambias el formato por MSBFIRST el primer LED verde será ahora el de mejor peso.

Busca aquí el código que acabamos de utilizar: Repositorio

Y con esto concluimos el tutorial, este ejemplo sirvió para entender de forma rápida el protocolo de comunicación e implementar una aplicación rápida, pero puede utilizar cualquier dispositivo SPI, basta con seguir la misma secuencia de pasos.

Referencias:

Arduino Workshop – Chapter 5 – Using SPI

Arduino Reference – SPI

Comentarios