Ir al contenido

Serial Peripheral Interface (SPI) es un protocolo de comunicación síncrono de alta velocidad muy utilizado, diseñado para el intercambio de datos a corta distancia, normalmente entre un microcontrolador y periféricos como sensores, chips de memoria o módulos de pantalla. Una de las características clave de SPI es su comunicación full-duplex, que permite transmitir y recibir datos simultáneamente. SPI funciona con una configuración maestro-esclavo, en la que el dispositivo maestro controla la señal de reloj y coordina el intercambio de datos con varios dispositivos.

En el contexto de los controladores lógicos programables (PLC), SPI facilita la comunicación entre el PLC y diversos sensores, actuadores y otros componentes periféricos, lo que lo convierte en un protocolo versátil y eficiente para transferencias de datos rápidas y a corta distancia entre dispositivos en sistemas embebidos.

Hardware

Los PLC basados en Arduino tienen un puerto SPI externo, formado por los siguientes pines:

  • MOSI (Master Out Slave In): el maestro envía datos al esclavo por esta línea.
  • MISO (Master In Slave Out): el esclavo devuelve datos al maestro por esta línea.
  • SCLK (Serial Clock): la señal de reloj generada por el maestro, que sincroniza el maestro y los esclavos.
  • CS (Slave Select o Chip Select): lo usa el maestro para seleccionar con qué esclavo quiere comunicarse. Debe haber 1 pin CS por cada esclavo.

Ten en cuenta que, en algunos dispositivos, los pines SPI pueden tener otros nombres, como:

  • SCLK / SCK / CLK
  • MOSI / SDO / SO
  • MISO / SDI / SI
  • CS / SS

El siguiente esquema muestra cómo conectar dos dispositivos como esclavos a un maestro mediante SPI:



Además, los dispositivos deben tener una referencia GND común. Si no la tienen, añade una conexión adicional entre los nodos GND.

Ten en cuenta que no hay ningún pin asignado directamente como CS. Cualquiera de los pines de E/S dedicados del PLC se puede usar como selección de esclavo, por ejemplo Pin 2 o Pin 3.

La comunicación SPI en los PLC basados en Arduino no requiere ninguna configuración de hardware específica. En cambio, algunos de los pines que se pueden usar como chip select sí la requieren. Los pines 2 y 3, por ejemplo, pueden necesitar activarse con un interruptor DIP. Revisa los interruptores de tu PLC o la guía de usuario para más información.

Recuerda alimentar correctamente el PLC con una fuente de alimentación de 12-24V.

Software 

El paquete de placas industrialshields incluye una librería SPI, basada en la librería SPI de Arduino. Esta librería permite programar los PLC basados en Arduino como maestro SPI.

Este programa muestra cómo configurar el PLC como maestro en una comunicación SPI y enviar y recibir datos. En este caso se envía el carácter "0", y el dato recibido se guarda en la variable correspondiente (la transferencia SPI se basa en enviar y recibir simultáneamente) y se imprime por el puerto serie.

#include <SPI.h>

// Set pin as the slave select:
const int slaveSelectPin = GPIO_0;
volatile byte receivedData;

void setup() {
  Serial.begin(9600);
  // Set the slaveSelectPin as an output:
  pinMode(slaveSelectPin, OUTPUT);
  // Initialize SPI:
  SPI.begin();
}

void loop() {
  SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE0));
  digitalWrite(slaveSelectPin, LOW); // Start of transmission: set chip select LOW
  receivedData = SPI.transfer('0');
  digitalWrite(slaveSelectPin, HIGH); // End of transmission: set chip select HIGH
  SPI.endTransaction();
  
  Serial.println((char)receivedData);
 
  delay(100);
}
Referencia de la API

Descripción:

Inicializa el bus SPI y configura los parámetros necesarios para la comunicación SPI. Debe llamarse antes que cualquier otra función SPI.

Sintaxis:

SPI.begin();

Parámetros:

Ninguno.

Devuelve:

Ninguno.

Descripción:

Inicia una transacción SPI con la configuración indicada y ajusta los parámetros del bus SPI mientras dura la transacción.

Sintaxis:

SPI.beginTransaction(settings);

Parámetros:

  • settings: un objeto SPISettings que especifica la velocidad de reloj SPI, el orden de bits y el modo de datos.

Devuelve:

Ninguno.

Descripción:

Envía un byte de datos al bus SPI y, al mismo tiempo, recibe un byte de datos del bus SPI.

Sintaxis:

SPI.transfer(data);

Parámetros:

  • data: el byte de datos que se envía por el bus SPI.

Devuelve:

Devuelve el byte de datos recibido del bus SPI durante la transferencia.

Descripción:

Finaliza la transacción SPI, libera el bus SPI y permite que otros dispositivos SPI lo usen.

Sintaxis:

SPI.endTransaction();

Parámetros:

Ninguno.

Devuelve:

Ninguno.

Calificación
0 0

No hay comentarios por ahora.

para ser el primero en comentar.