Index
1. Introducción
2. Requisitos
3. Protocolo SPI
4. Ventajas y desventajas
5. Conexiones tÃpicas de SPI
6. Hardware
7. Software
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
 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:Â
Â
Bus SPI en un PLC Arduino de Industrial Shields