Arduino bus SPI la comunicación de datos

Bus SPI Arduino Nano, Uno, Mega (Serial Peripheral Interface) se traduce como «interfaz periférica serie» y es un protocolo de comunicación serie. Los microcontroladores Arduino utilizan muchos protocolos para comunicarse con sensores y periféricos, uno de los más utilizados es la interfaz SPI. En este artículo veremos esta interfaz y cómo utilizarla en Arduino (cómo conectar dispositivos SPI con Arduino para comunicación de datos).

Para esta actividad necesitaremos:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • pulsadores y resistencias;
  • protoboard;
  • cables de conexion;
  • libreria SPI.h

Comunicación SPI Arduino Uno: descripción, ejemplo

¿Qué es el SPI en Arduino? El Arduino SPI (Serial Peripheral Interface) es totalmente dúplex – los datos se transmiten y reciben simultáneamente en los cables. El maestro envía datos al esclavo y el esclavo puede enviar simultáneamente datos al maestro, el microcontrolador Arduino. La interfaz periférica serie fue desarrollada por Motorola en 1970.

Comunicación SPI Arduino: descripción, ejemplo
Comunicación SPI Arduino Nano, Uno: descripción, ejemplo

Para iniciar la comunicación en bus SPI Arduino, el pin esclavo (SS) debe estar a nivel bajo, si el pin está a nivel alto, el esclavo ignorará al maestro. Esto permite conectar muchos dispositivos esclavos SPI al microcontrolador. La imagen de arriba muestra un diagrama de cableado de tres dispositivos donde las líneas SCLK, MISO, MOSI son comunes y las líneas SS de cada dispositivo están conectadas a pines separados (SS1, SS2, SS3).

Implementación del enlace SPI Arduino Mega, Uno

Implementación del bus SPI en Arduino Uno, Mega
Implementación del bus SPI en Arduino Mega, Uno
  • MISO (Master in Slave Out) es la línea para enviar datos al maestro;
  • MOSI (Master Out Slave In) es la línea para enviar datos al esclavo;
  • CLK (Serial Clock) es una línea de sincronización del dispositivo generada por el maestro;
  • SS (Slave Select) – línea para activar/desactivar dispositivos esclavos.
pins Arduino Uno Arduino Nano Arduino Mega
MISO 12 12 50
MOSI 11 11 51
SCK 13 13 52
SC 10 10 53

El Arduino Uno utiliza 4 líneas (cables) para trabajar con el protocolo SPI – (MISO, MOSI, SCLK y SS). En esta interfaz, siempre hay un dispositivo maestro (normalmente la placa Arduino) y varios esclavos (sensores, pantallas u otros microcontroladores pueden ser dispositivos esclavos). La imagen de arriba muestra cómo funciona el bus SPI Arduino.

Cómo conectar dispositivos en el bus SPI Arduino

Cómo conectar dispositivos en el bus SPI Arduino Uno
Cómo conectar dispositivos en el bus SPI Arduino Uno

El diagrama de cableado de las dos placas Arduino para crear la conexión entre ellas se muestra en la imagen. El proyecto requiere la descarga de dos programas: el primero es para el Arduino Uno R3 maestro y el segundo para el Arduino esclavo. Al pulsar el botón de la placa maestra, se enciende el LED conectado a la placa esclava. Cuando se pulsa el botón del Arduino Uno esclavo, se enciende el LED del Arduino Uno maestro.

Programa para la tarjeta maestra Arduino (master)

#include "SPI.h"
#define LED 13           
#define ipbutton 2
 
int buttonvalue;
int x;
 
void setup () {  
  pinMode(ipbutton, INPUT);
  pinMode(LED, OUTPUT);
  
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV8);
  digitalWrite(SS, HIGH);
}
 
void loop() {
  byte Mastersend, Mastereceive;          
  buttonvalue = digitalRead(ipbutton);
  if(buttonvalue == HIGH) { x = 1; }
  else { x = 0; }
  
  digitalWrite(SS, LOW); 
  Mastersend = x;                            
  Mastereceive = SPI.transfer(Mastersend);
  
  if(Mastereceive == 1) { digitalWrite(LED, HIGH); }
  else { digitalWrite(LED, LOW); }
  delay(100);
}

Programa para la tarjeta esclava Arduino (slave)

#include "SPI.h"
#define LEDpin 13
#define buttonpin 2
 
volatile boolean received;
volatile byte Slavereceived,Slavesend;
int buttonvalue;
int x;
 
void setup() { 
  pinMode(buttonpin, INPUT);
  pinMode(LEDpin, OUTPUT);
  pinMode(MISO, OUTPUT);
  SPCR |= _BV(SPE);
  received = false;
  SPI.attachInterrupt();
}
 
ISR (SPI_STC_vect) {
  Slavereceived = SPDR;
  received = true;
}
 
void loop() {
  if(received) {
    if (Slavereceived==1) { digitalWrite(LEDpin, HIGH); }
    else { digitalWrite(LEDpin, LOW); }
      
    buttonvalue = digitalRead(buttonpin);
    if (buttonvalue == HIGH) { x=1; }
    else { x=0; }
      
    Slavesend=x;                             
    SPDR = Slavesend; 
    delay(100);
  }
}

SPI.h librería de interfaz periférica serie

#include «SPI.h» – conecta el uso de la librería en el programa.

SPI.begin() – inicializa el bus SPI estableciendo los modos SCK, MOSI y SS para la salida de datos, suministrando los pines SCK y MOSI con bajo voltaje, y el pin SS con alto voltaje.

SPI.setClockDivider(divider) – establece el factor de división de la señal de reloj SPI con respecto a la frecuencia de reloj del microcontrolador Arduino. Puedes utilizar divisores de 2, 4, 8, 16, 32, 64 o 128.

SPI.attachInterrupt(handler) – activa el modo de interrupción en el dispositivo esclavo. Se produce una interrupción cada vez que el dispositivo esclavo recibe datos del dispositivo maestro.

SPI.transfer(val) – Esta función se utiliza para recibir y transferir datos entre el maestro y el esclavo simultáneamente.




Conclusión. El enlace SPI de Arduino es una de las principales interfaces de comunicación entre Arduino y los dispositivos conectados. Los protocolos SPI, IIC y UART son muy utilizados para conectar dispositivos y conocer los principios de SPI será útil para todos. En este artículo hemos cubierto brevemente la librería SPI.h, los principios básicos de la comunicación y la conexión de sensores a través de la interfaz SPI Arduino Mega.


2 Replies to “Bus SPI Arduino Mega, Uno, Nano (miso mosi pins)”

    1. Los puertos SPI de Arduino Uno y Nano no son diferentes. Los números de puerto se dan en la siguiente tabla

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *