Interfaz periférica en serie en Arduino

Interfaz periférica en serie en Arduino

Arduino es una placa de desarrollo electrónico que se ejecuta con un microcontrolador. Procesa instrucciones y genera la salida deseada. La comunicación juega un papel importante mientras procesa el código Arduino. Para hacerlo, Arduino tiene múltiples protocolos de comunicación como USART, I2C y SPI. Para leer más sobre los protocolos de comunicación en detalle, haga clic aquí. Hoy discutiremos cómo se usa SPI (interfaz periférica en serie) en Arduino.

Interfaz periférica en serie (SPI)

La interfaz periférica en serie (SPI) es un protocolo de datos en serie sincrónicos utilizado por los microcontroladores Arduino para fines de comunicación con uno o más dispositivos periféricos rápidamente a distancias cortas. También se puede utilizar para la comunicación entre dos microcontroladores.

SPI es una comunicación dúplex completa, lo que significa que puede enviar y leer datos al mismo tiempo. Entre los tres protocolos de comunicación (USART, SPI e I2C) en Arduino SPI es el más rápido. SPI tiene aplicaciones donde se requiere una alta velocidad de datos, como mostrar texto en pantallas o escribir datos en la tarjeta SD.

SPI funciona usando cuatro líneas:

  • SCK: Señal de reloj que sincronizan la transferencia de datos entre dispositivos maestros y esclavos.
  • MISO: (Maestro en esclavo) o miso es una línea de datos para esclavo que puede devolver los datos al maestro.
  • Mosi: (Dominar esclavo) o MOSI es una línea de datos para que el maestro envíe datos a dispositivos de esclavos y periféricos.
  • SS: (Selección de esclavos) Es la línea utilizada por el maestro para seleccionar un dispositivo esclavo específico. Informa el dispositivo esclavo al que los datos se enviarán o se recibirán.

Actualizar: Según la documentación oficial de Arduino, SPI en Arduino ya no respalda estas terminologías. La tabla a continuación muestra las nuevas terminologías:

Maestro/esclavo (viejo) Controlador/periférico (nuevo)
Maestro en esclavo (miso) Controlador en, periférico (cipo)
Dominar esclavo en (Mosi) Controlador fuera periférico en (COPI)
Pin de selección de esclavos (SS) Pin de selección de chip (CS)

SPI Pinout en Arduino Uno

El protocolo SPI está respaldado por múltiples tableros Arduino aquí, discutimos el apoyo de Arduino Uno para SPI. Los siguientes son los pines utilizados por Arduino Uno para la comunicación periférica en serie.

Línea SPI GPIO Pin de encabezado ICSP
Sck 13 3
MISO 12 1
Mosi 11 4
Ss 10 -

SPI en la configuración de esclavos maestros

Conectar un dispositivo maestro a un solo esclavo es simple, solo tenemos que conectarlos con el mismo pin. Una vez que tanto el dispositivo maestro como el esclavo están conectados como se muestra en la imagen a continuación. Primero, tenemos que establecer el SS (Línea de selección de esclavos) en el dispositivo maestro para que sea bajo. Permanecerá bajo durante la transmisión de datos. Línea SS baja preparar esclavo para enviar o recibir datos. Una vez que el SS es bajo maestro, el dispositivo puede enviar datos utilizando la línea MOSI y puede producir señales de reloj para la comunicación sincrónica utilizando el pin SCLK.

SPI en una sola configuración de esclavos múltiples maestros

SPI también admite múltiples dispositivos de esclavos, se usa una línea SS (Slave Select) separada para cada esclavo. A diferencia de un solo esclavo aquí, el maestro necesita una línea SS separada para cada esclavo. El funcionamiento de la configuración de dispositivos esclavos individuales y múltiples es de alguna manera similar. Dispositivo maestro Tire de la línea SS de esclavo particular a Low que informa el dispositivo de esclavos que el maestro va a enviar o recibir datos de ese esclavo.

La siguiente imagen ilustra la configuración de un dispositivo esclavo múltiple de maestro único.

La configuración de la cadena de Daisy es otra forma de conectar múltiples dispositivos de esclavos. Donde el maestro no necesita múltiples línea SS para cada esclavo, de hecho, una sola línea SS está conectada al primer dispositivo esclavo. Una vez que el dispositivo maestro extrae la línea SS a baja, envía señales a todos los dispositivos de esclavos para estar listo para la comunicación en MOSI PIN. Luego, el dispositivo maestro envíe datos al pin MOSI del primer dispositivo esclavo.

Al mismo tiempo, el maestro envía una señal de reloj al pin SCK. Los datos se envían de un esclavo a otro y el pin SS se establece tan bajo durante esta duración. El maestro debe enviar suficiente señal de reloj para alcanzarla hasta el último dispositivo esclavo. Los datos recibidos de un dispositivo esclavo particular serán recibidos por Master en su PIN de miso.

La siguiente imagen ilustra la configuración de la cadena de Daisy.

Cómo programar Arduino para la comunicación SPI

Ahora tomaremos dos tableros Arduino y pasaremos una cuerda de un tablero de Arduino que es maestro de segundo Arduino que está actuando como esclavo. Recuerde abrir dos ventanas separadas de Arduino IDE antes de cargar el código de lo contrario, de lo contrario hay una alta probabilidad de cargar el mismo código en ambos Arduino.

Antes de cargar código, seleccione el puerto COM en el que Arduino está conectado. Ambos Arduino deben estar conectados en puertos COM separados.

Circuito

Conecte dos tableros Arduino como se muestra en el circuito a continuación. Asegúrese de conectar ambas placas a GND y conecte todos los cuatro pines SPI del pin 10 a 13 de ambos Arduino.

Hardware

A continuación se muestra la imagen de hardware de dos tableros Arduino conectados a la PC usando el cable USB.

codigo maestro

/*Código Master Arduino*/
#include /*biblioteca SPI incluida* /
setup () void
De serie.comenzar (115200); /*Tasa de baudios definida para la comunicación en serie*/
DigitalWrite (SS, High); /*(Ss) esclavo seleccionar línea deshabilitado*/
SPI.comenzar(); /*Comienza la comunicación SPI*/
SPI.setClockDivider (SPI_CLOCK_DIV8); /*Reloj dividido por 8*/

bucle void ()
char char_str; /*Variable definida para enviar datos*/
DigitalWrite (SS, Low); /*(SS) Slave Seleccione habilitado*/
para (const char * p = "linuxhint.Com \ r "; char_str =*p; p ++) /*cadena de prueba enviada* /
SPI.transferir (char_str); /*Transferencia SPI Begin*/
De serie.print (char_str); /*La cadena está impresa*/

DigitalWrite (SS, High);
retraso (2000);

Aquí en el código anterior primero incluimos la biblioteca SPI para la comunicación. A continuación, comenzamos definiendo la tasa de baudios para ver la salida en la línea de selección de esclavos del monitor serial está deshabilitado utilizando la escritura digital. Para comenzar la comunicación SPI SPI.comenzar() se usa.

En el bucle, parte del código, se define una variable Char para almacenar la cadena que vamos a enviar esclavo Arduino. Siguiente una cadena "Linuxhint.Com " se define que se transfiere a esclavo arduino usando el spi.transferir(). Para ver la cadena de entrada en el monitor en serie De serie.imprimir() se utiliza la función.

Código de esclavos

/*Código de esclavo Arduino*/
#include /*biblioteca SPI incluida* /
buffer de char [50]; /*Búfer definido para almacenar una cadena recibida del maestro*/
Índice de bytes volátil; /*Guardar datos de cadena*/
proceso booleano volátil;
setup () void
De serie.comenzar (115200);
PinMode (miso, salida); /*Miso establecido como salida para enviar datos al maestro*/
Spcr | = _bv (spe); /*SPI en modo esclavo activo*/
índice = 0; /*Búfer vacío*/
proceso = falso;
SPI.adjuntarinterrupt (); /*encender la interrupción*/

ISR (SPI_STC_VECT) /*Rutina de interrupción SPI* /
byte char_str = spdr; /*Lea el byte del registro de datos SPI*/
if (índice < sizeof buffer)
buffer [index ++] = char_str; /*Datos guardados en el índice de la matriz*/
if (char_str == '\ r') /*Verifique la cadena para finalizar* /
proceso = true;


bucle void ()
if (proceso)
proceso = falso; /*Restablecimiento del proceso*/
De serie.println (búfer); /*Recibió una matriz impresa en el monitor serial*/
índice = 0; /*Botón de reinicio a cero*/

El código de arriba se carga a Slave Arduino, donde comenzamos definiendo tres variables búfer, índice y proceso. La variable de búfer almacenará la cadena de entrada del maestro arduino mientras el índice buscará el índice de elementos dentro de la cadena y una vez que se imprima toda la cadena, el proceso detendrá el programa y se restablecerá a cero. Después de lo cual, Slave comenzará a recibir datos del Maestro Arduino y se imprimirá en Serial Monitor.

Producción

La salida se puede ver en dos ventanas diferentes del IDE Arduino. La salida de Master y Slave Arduino se imprime en Serial Monitor.

Conclusión

La interfaz periférica en serie es un importante protocolo de comunicación utilizado en la programación de Arduino que ayuda a los usuarios a controlar múltiples dispositivos utilizando una sola placa Arduino. SPI es más rápido que el protocolo USART e I2C. Se puede implementar en dos configuraciones diferentes, maestro único con esclavos individuales o esclavos múltiples. Este artículo ofrece una idea de cómo se puede conectar Arduino para la comunicación SPI.