SPI (Serial Peripheral Interface) es un protocolo de comunicación serie síncrono utilizado habitualmente para conectar un dispositivo maestro a uno o varios periféricos. Comparado con I2C, SPI es más rápido y sencillo: en lugar de usar direcciones de dispositivo, utiliza un cable dedicado de Chip Select (CS) por esclavo para seleccionar con qué dispositivo comunicarse. Este artículo muestra cómo conectar un M-Duino PLC maestro a dos M-Duino PLC esclavos mediante SPI y controlar sus salidas digitales desde el maestro.
Qué necesitas
- Tres M-Duino PLC (uno maestro, dos esclavos)
- Fuente de alimentación
Cableado del bus SPI
Los tres PLCs comparten MISO (50 SO), MOSI (51 SI) y SCK (52 SCK) en el mismo bus. Cada esclavo tiene su propio pin de Chip Select dedicado conectado al maestro:

En este ejemplo, el maestro usa el Pin 2 como CS_1 (para el esclavo 1) y el Pin 3 como CS_2 (para el esclavo 2). Consulta la guía del usuario de tu M-Duino para conocer todos los pines CS disponibles en tu modelo.
Sketch del maestro
El maestro alterna entre activar el esclavo 1 y el esclavo 2 cada segundo enviando un byte (1 = HIGH, 0 = LOW) al esclavo seleccionado mediante su pin de Chip Select.
#include <SPI.h>
#define CS_1 2
#define CS_2 3
void setup() {
pinMode(CS_1, OUTPUT);
pinMode(CS_2, OUTPUT);
SPI.begin();
}
void send_order(uint8_t CS, uint8_t action) {
digitalWrite(CS, LOW);
SPI.transfer(0);
SPI.transfer(action);
digitalWrite(CS, HIGH);
}
void loop() {
send_order(CS_1, 1);
send_order(CS_2, 0);
delay(1000);
send_order(CS_1, 0);
send_order(CS_2, 1);
delay(1000);
}La función send_order() baja el pin CS seleccionado a LOW, transfiere un byte ficticio seguido del byte de acción y luego libera CS a HIGH. Enviar 1 pone la salida del esclavo en HIGH; enviar 0 la pone en LOW.
Sketch del esclavo
Ambos esclavos ejecutan el mismo código. El esclavo escucha los datos SPI entrantes mediante una rutina de servicio de interrupción (ISR) y escribe el byte recibido directamente en la salida Q0_0.
#include <SPI.h>
#define CS 2
void setup() {
pinMode(CS, INPUT_PULLUP);
SPCR |= _BV(SPE); // Habilita SPI en modo esclavo
SPI.attachInterrupt(); // Habilita la interrupción SPI
}
ISR(SPI_STC_vect) {
digitalWrite(Q0_0, SPDR); // Escribe el byte recibido en la salida
}SPCR |= _BV(SPE) activa el bit SPI Enable del registro de control SPI, configurando el dispositivo como esclavo. SPI.attachInterrupt() habilita la interrupción de transferencia SPI completa. Cada vez que el maestro envía un byte, la ISR se dispara y escribe SPDR (el registro de datos SPI) en Q0_0.
Enviar datos de vuelta al maestro
Si un esclavo necesita devolver datos al maestro, modifica SPDR dentro de la ISR antes de que se complete la transferencia:
ISR(SPI_STC_vect) {
if (SPDR == 1) {
SPDR = 10;
} else {
SPDR = 20;
}
}
Conexión de múltiples esclavos SPI a un M-Duino PLC