Introducción
Requisitos
En el ejemplo del esquema, hemos utilizado un controlador industrial Arduino M-Duino 21+, pero toda la gama de PLCs de Industrial Shields también podría servir para realizar el mismo ejemplo:
- Familia de controladores WiFi y Bluetooth
- 20 E/S Familia de controladores
- Familia de controladores Ethernet
- Familia de controladores GPRS / GSM
Protocolo SPI
El bus SPI (Serial Peripheral Interface) fue desarrollado por Motorola en 1980. Actualmente, es un estándar en el mundo de la electrónica y la automatización.
El bus SPI tiene una arquitectura maestro-esclavo.
- MOSI (Master-out, slave-in) Comunicación maestro a esclavo
- MISO (Master-in, slave-out) Comunicación esclavo a maestro
- SCK (Clock) Señal de reloj generada por el maestro
- SS (Slave Select) Selecciona el dispositivo con el que se establecerá la comunicación
Cableado SPI típico
Ventajas y Desvantajas
Ventajas:
Comunicación dúplex completa.
Mayor velocidad de transmisión que con I²C o SMBus.
Protocolo flexible en el que podemos tener un control absoluto sobre los bits transmitidos.
No se limita a la transferencia de bloques de 8 bits.
Elección del tamaño de cuadro de bits, su significado y propósito.
Su implementación de hardware es extremadamente simple.
Consume menos energía que I²C o SMBus porque tiene menos circuitos (incluidas las resistencias pull-up) y estos son más simples.
No es necesario un mecanismo de arbitraje o respuesta a fallas.
Los dispositivos del cliente usan el reloj enviado, por lo tanto, no necesitan su propio reloj.
No es obligatorio implementar un transceptor (transmisor y receptor): un dispositivo conectado puede configurarse para enviar, recibir o ambas opciones al mismo tiempo.
Utiliza muchos menos terminales en cada chip / conector que una interfaz paralela equivalente.
Como máximo, se requiere una señal específica única para cada usuario (señal SS); Las otras señales pueden ser compartidas.
Desventajas:
Consume más pines de cada chip que I²C, incluso en la variante de 3 hilos.
El direccionamiento se realiza a través de líneas específicas (señalización fuera de banda) a diferencia de lo que sucede en I²C, donde cada chip se selecciona mediante una dirección de 7 bits que se envía por las mismas líneas de bus.
No hay control de flujo de hardware.
No hay signos de asentimiento. El servidor podría estar enviando información sin clientes conectados y no notaría nada.
No permite tener múltiples servidores conectados al bus fácilmente.
Solo funciona en distancias cortas, a diferencia, por ejemplo, del RS-232 o el RS-485.
Conexiones SPI típicas
Opción 1) Si se trata de una conexión donde deben conectarse pocos esclavos, se utiliza el siguiente esquema de conexión:
Se requiere una línea SS (Slave Select) adicional para cada dispositivo esclavo conectado, para seleccionar el dispositivo con el que se debe hacer la comunicación.
Opción 2) Esta conexión previa tiene la desventaja de requerir una línea para cada dispositivo esclavo. En caso de tener muchos dispositivos esclavos, esto puede no ser práctico, por lo que es posible adoptar una conexión en cascada, donde cada esclavo transmite datos al siguiente:
Por otro lado, en esta configuración la información debe llegar a todos los esclavos para que la comunicación finalice; por eso, en general la velocidad de respuesta del bus es menor que en la primera configuración.
Hardware
Cada controlador lógico programable de Industrial Shields tiene los pines SO, SI y SCK. Consulta el Manual del usuario de tu modelo de PLC industrial para ver dónde se encuentran estos pines. Consulta también el capítulo Pinout del Manual del usuario para ver cuántos pines se pueden usar como SS (Slave Select). Aquí tienes el ejemplo del controlador PLC M-Duino 21+:
Software
Para utilizar el puerto SPI en Arduino, el IDE Standard proporciona la biblioteca "SPI.h" que contiene las funciones necesarias para controlar el hardware SPI integrado.
Funciones básicas de SPI:
SPI.begin(); // Starts the SPI busPara cambiar el orden de los bits enviados, tenemos la función setBitOrder:
SPI.transfer(c); // Send a byte
SPI.attachInterrupt(); // Activate the interrupt to receive data
setBitOrder (LSBFIRST); //Least Significant bit first
setBitOrder (MSBFIRST); //Most Significant bit first
Para cambiar la polaridad y la fase del reloj, tenemos la función SPI.setDataMode:
setDataMode (SPI_MODE0); // clock normally LOW, rising edge sampling
setDataMode (SPI_MODE1); // clock normally LOW, flank sampling lowered
setDataMode (SPI_MODE2); // clock normally HIGH, rising edge sampling
setDataMode (SPI_MODE3); // clock normally HIGH, flank sampling lowered
Finalmente, podemos cambiar la velocidad del bus con los divisores de función SPI.setClockDivider () de 2 a 128. La frecuencia del bus será la velocidad del reloj dividida por el divisor elegido.
setClockDivider (SPI_CLOCK_DIV2); // 8 MHz (considering a 16 MHz model) setClockDivider (SPI_CLOCK_DIV4); // 4 MHz setClockDivider (SPI_CLOCK_DIV8); // 2 MHz setClockDivider (SPI_CLOCK_DIV16); // 1 MHz setClockDivider (SPI_CLOCK_DIV32); // 500 KHz setClockDivider (SPI_CLOCK_DIV64); // 250 KHz setClockDivider (SPI_CLOCK_DIV128); // 125 KHz
Sin embargo, estas funciones son obsoletas ya que se prefiere la función Arduino versión 1.6.0., beginTransaction, como muestra el siguiente ejemplo.
SPI.beginTransaction (SPISettings (2000000, MSBFIRST, SPI_MODE0)); // 2 MHz clock, MSB first, mode 0
Sin embargo, al ser el marco de datos específico de cada dispositivo, la mayoría de las veces no utilizamos estas funciones directamente, y nuestro uso del bus SPI se lleva a cabo indirectamente a través de la biblioteca del componente.
Podemos encontrar ejemplos de comunicación SPI en el IDE de Arduino como vemos en la siguiente imagen: