Encuentra informaci贸n referente a la programaci贸n, electr贸nica y mucho m谩s, la p谩gina est谩 pensada para compartir contenido educativo relevante coadyuvando a su aprendizaje diario.
Comunicaci贸n con el bus SPI en Arduino

La comunicaci贸n con el bus SPI con Arduino es muy usada para enviar y recibir datos entre dos o m谩s perif茅ricos, esta comunicaci贸n es serial, s铆ncrona y Full-Duplex, est谩 pensada para la transferencia de informaci贸n de alta velocidad en distancia cortas.

Esta comunicaci贸n SPI con Arduino est谩 dise帽ada para trabajar siempre con un maestro y uno o varios esclavos (Maestro-Esclavo), el maestro es aquel que gestiona e inicia la comunicaci贸n mediante se帽ales de reloj.

驴C贸mo funciona la comunicaci贸n con el bus SPI en Arduino?

La comunicaci贸n con el bus SPI en Arduino no establece un tama帽o fijo de bits para los paquetes de datos, generalmente se usan paquetes de datos de 8 bits enviando y recibiendo datos de bit a bit, que es sincronizada con los pulsos de reloj en los registros del Maestro y esclavo, con esto la polaridad nos muestra si se inici贸 en flanco de bajada o de subida y la fase actualizara los datos, 聽esta comunicaci贸n puede ser entre Maestro-esclavo o esclavo-Maestro por esta raz贸n se dice que es una comunicaci贸n full-duplex.

Lineas de comunicaci贸n de Arduino para el bus SPI

Para realizar alguna comunicaci贸n con este protocolo de comunicaci贸n necesitamos 4 l铆neas que se帽al.

MISO (Master In Slave Out). – Esta se帽al es usada para enviar datos desde el esclavo hacia el maestro.

MOSI (Master Out Slave In).- Al contrario de la anterior l铆nea esta es usada para enviar datos del maestro al esclavo.

SCK (Serial Clock).- Esta l铆nea es sumamente importante para realizar la sincronizaci贸n de los datos que transmitimos, esta se configura en el maestro.

SS (Slave Select).- Con esta l铆nea podemos habilitar o deshabilitar desde el maestro los perif茅ricos que conectemos al maestro, cuando el pin SS est谩 en bajo se comunica con el maestro y cuando est谩 en alto lo que hace es ignorar al maestro.

Tipos de conexi贸n para el bus SPI en Arduino

Existe dos tipos de conexi贸n para la comunicaci贸n con el bus SPI en Arduino una de forma paralela y otra en cascada.

Conexi贸n paralela a varios dispositivos con el bus SPI

Comunicaci贸n con el bus SPI

Conexi贸n en cascada a varios dispositivos con el bus SPI

Comunicaci贸n con el bus SPI en Arduino en serie

Modos funcionamiento del bus SPI en Arduino

Estos modos de funcionamiento est谩n determinadas en las hojas de datos de nuestro microcontrolador y son b谩sicamente la combinaci贸n entre la polaridad (CPOL) del reloj y la fase (CPHA), en total existen 4 modos y para config煤ralo hacemos uso de los bits de control que es una condici贸n para ser usada, a continuaci贸n se muestra una imagen extra铆da de la hoja de datos de un ATmega328P para poder saber las posibles combinaciones para seleccionar el modo que usemos.

Configuraci贸n de la librer铆a SPI para Arduino

Esta librer铆a es oficial de proyecto de Arduino y esta preinstalada en el IDE de Arduino, solo debemos incluirlo escribiendo la instrucci贸n #include <SPI.h> en nuestro c贸digo fuente, como cualquier librer铆a tiene sus propias funciones que a continuaci贸n se detalla. 

SPISettings()

Este objeto se usa para la configuraci贸n del puerto SPI, donde presenta tres par谩metros, el primero es la velocidad m谩xima de frecuencia del reloj, en el segundo par谩metro se coloca el orden de datos, es decir, debemos se帽alar que bit ser谩 el primero en desplazarse en el registro, si deseamos que sea el bit m谩s significativo (MSB) usaremos la palabra reservada MSBFIRST y si deseamos que inicie con el bit menos significativo (LSB) usamos LSBFIRST, y el tercer par谩metro declaramos el modo de funcionamiento del bus SPI de Arduino que pueden ser SPI_MODE0, SPI_MODE1, SPI_MODE2 o SPI_MODE3, este objeto debe estar dentro la funci贸n SPI.beginTransaction() como par谩metro.

Al ser un objeto podemos crearlo con un nombre propio y hacerla m谩s din谩mica cambiando los par谩metros en el tiempo de ejecuci贸n. 

SPI.begin()

Esta funcion pone MOSI, SCK en bajo y SS en alto, esta funci贸n no tiene par谩metros y no devuelve ning煤n valor, pero es necesario para iniciar la libreria.

SPI.end()

Con esta funci贸n b谩sicamente lo que hacemos es terminar o inhabilitar nuestra comunicaci贸n en el bus SPI.

SPI.beginTransaction()

Esta funci贸n tambi茅n permite inicializar nuestra comunicaci贸n en el bus SPI pero realizando algunos ajustes con el objeto SPISettings, su sintaxis seria "SPI.beginTransaction(SPISettings(velocidad max, orden de bits, Modo))".

SPI.endTransaction()

Nos permite terminar el bus SPI.

SPI.setBitOrder()

Anteriormente se usaba para determinar el orden de los datos de los bit de desplazamiento, tiene un par谩metro que puede ser LSBFIRST o MSBFIRST, si bien se la puede usar, se recomienda usar SPISettings para determinar el orden de datos.

SPI.setClockDivider()

Con esta funci贸n podemos dividir la frecuencia del reloj con los divisores 2, 4, 8, 16, 32, 64 y 128, esta funci贸n tiene un par谩metro que pueden ser:

  • SPI_CLOCK_DIV2
  • SPI_CLOCK_DIV4
  • SPI_CLOCK_DIV8
  • SPI_CLOCK_DIV16
  • SPI_CLOCK_DIV32
  • SPI_CLOCK_DIV64
  • SPI_CLOCK_DIV128

SPI.transfer(), SPI.transfer16()

Esta funci贸n est谩 encargada del env铆o y recepci贸n de datos de 8 y 16 bits, si es de 8 bits usaremos SPI.transfer() y si es de 16 bits SPI.transfer16(), esta funci贸n pude trabajar con uno o dos par谩metros, si solo usamos un par谩metro estaremos declarando el valor del dato que deseemos hacer el envi贸 o recepci贸n de la misma, pero existe una alternativa para trabajar con el buffer y su sintaxis es sencilla SPI.transfer(buffer, tama帽o).

SPI.usingInterrupt()

Esta funci贸n es muy 煤til cuando estamos trabajando con interrupciones para enviar y recibir datos en bus SPI con Arduino, esta funcion nos protege en posibles conflictos de programaci贸n, esta funci贸n tiene un par谩metro en la cual debemos detallar el n煤mero de interrupci贸n que estemos usando.

Pines habilitados para trabajar con el bus SPI en Arduino

Pines habilitados en las placas de Arduino para trabajar con el bus SPi

Ejemplo de comunicaci贸n con el bus SPI en Arduino

El ejemplo consiste en conectar dos Arduino, uno ser谩 el maestro y el otro esclavo, mediante el Monitor serie del IDE de Arduino en el maestro enviamos el mensaje 鈥渙n鈥 para encender un led聽 y 鈥渙ff鈥 para apagarlo, el led debe estar conectado en el Arduino esclavo.

Materiales para nuestro ejemplo con SPI en Arduino

  • 2 Arduino Uno
  • 1 led
  • 1 resistencia de 330 o 220 ohmios
  • Cables varios para hacer las conexiones

Conexi贸n de entre los Arduinos

 comunicaci贸n SPI con Arduino

C贸digo fuente del ejemplo de comunicaci贸n del bus SPI en Arduino

Arduino maestro

/* AUTOR: CREATIVIDAD CODIFICADA
 *  www.creatividadcodificada.com
 *  NOMBRE DEL PROYECTO: Comunicaci贸n entre dos Arduinos Uno 
 *  con el bus SPI 
 *  
 *  ******* [ARDUINO MAESTRO] *******
*/  
#include <SPI.h>

boolean control = false;
String datosLeidos = "";
char datos;
void setup()
{
  Serial.begin (115200); 
  
  // Desactivamos la conexion al esclavo
  digitalWrite(SS, HIGH);  

  // Iniciamos el bus SPI
  SPI.begin();
}

void loop()
{
  // Configuramos el bus SPI con una frecuencia de 2Mhz,
  // la lectura se hace desde el bit mas sisgnificativo
  //  y el modo 0 
  SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
  
  // Activamos el Arduino esclavo
  digitalWrite(SS, LOW);

 // Controlamos si existe algo para leer en el 
 // monitor serie del Arduino maestro y comparamos para 
 // encender o apagar el led en el Arduino esclavo
  if(control) {
    if(datosLeidos == "on\n"){
      for (const char *mensaje = "on\n" ; datos = *mensaje; mensaje++)
        SPI.transfer(datos);
      Serial.print("Arduino Esclavo -> Led encendido\n");
    }
    else if(datosLeidos == "off\n"){
      for (const char *mensaje = "off\n" ; datos = *mensaje; mensaje++)
        SPI.transfer(datos);
      Serial.print("Arduino Esclavo -> Led apagado\n");
    }
    else { 
      Serial.println("Dato no valido!!!");
    }
  datosLeidos = "";
  control = false;
  }

  // Deshabilita el esclavo
  digitalWrite(SS, HIGH);

  // Cerramos la conexion con el bus SPI
  SPI.endTransaction();
  SPI.end();
   
}

// funcion para controlar si existe algo para leer en el 
// monitor Serie del Arduino Maestro 
void serialEvent() { 
  while (Serial.available()) {
    char c = (char)Serial.read();
    datosLeidos += c;
    if (c == '\n') {
      control = true;
    }
  }
}

Arduino esclavo

/* AUTOR: CREATIVIDAD CODIFICADA
 *  www.creatividadcodificada.com
 *  NOMBRE DEL PROYECTO: Comunicaci贸n entre dos Arduinos Uno 
 *  con el bus SPI 
 *  
 *  ******* [ARDUINO ESCLAVO] *******
*/  
#include <SPI.h>

volatile byte posicion;
volatile boolean control;
int led = 2;
char mensaje [40];

void setup ()
{
  // Configuramos como salida el pin para el LED
  pinMode(led,OUTPUT);

  // Configura el pin MISO 
  pinMode (MISO, OUTPUT);
  
  // Configuramos el Arduino Uno como esclavo
  SPCR |= bit (SPE);
 
  //Colocamos en la posicion '0' de nuestro registro  
  posicion = 0;
 
  // Variable para controlar si recibimos el mensaje
  control = false;
 
  // Activamos la interrupcion para usar la funcion ISR
  SPI.attachInterrupt();
 
}
 
// Rutina de interrupcion
ISR (SPI_STC_vect)
{
  // Guardamos el byte recibido en una variable auxiliar
  byte aux = SPDR;
 
  // Controlamos el que no sobrepase la dimesion del mensaje 
  if (posicion < sizeof mensaje)
  {
    mensaje[posicion++] = aux;
 
    // controla el ultimo caracter
    if (aux == '\n')
      control = true;
  }
}
 
void loop ()
{
  if(control)
  {
    mensaje[posicion] = 0;
    String mensajeRecibido = mensaje;
    posicion = 0;
    control = false;
    if(mensajeRecibido == "on\n"){
      // Encendemos el led en el Arduino esclavo
      digitalWrite(2,HIGH);
      }
     if(mensajeRecibido == "off\n"){
      // Apagamos el led en el Arduino esclavo
      digitalWrite(2,LOW);
      }
  }
}
comunicacion con el bus SPI en Arduino creatividad codificada

1 comentario sobre: “Comunicaci贸n con el bus SPI en Arduino

驴Que te parecio el art铆culo?

Su direcci贸n de email no sera publicado. Los campos obligatorios est谩n marcados con *.

驴Qu茅 hacemos con tus datos?

Creatividad Codificada como responsable tratar谩 tus datos con la finalidad de gestionar tu participaci贸n en nuestro blog informativo. Puedes acceder, rectificar y suprimir tus datos, as铆 como ejercer otros derechos consultando la informaci贸n adicional y detallada sobre protecci贸n de datos en nuestra Pol铆tica de Privacidad