Busca en nuestro Blog. Encontrarás múltiples aplicaciones, soluciones, ejemplos de código. Navega utilizando la nube de etiquetas o busca utilizando criterios específicos

Bus SPI en un PLC Arduino de Industrial Shields

Trabajar con el Serial Peripheral Interface Bus (SPI)

 Introducción


En esta publicación veremos el bus SPI, una de las comunicaciones disponibles en toda nuestra gama de PLC basados en Arduino.

El bus SPI es interesante porque una amplia variedad de sensores y dispositivos comerciales tienen una interfaz SPI como medio de comunicación; por ejemplo, muchas unidades Display TFT utilizan el protocolo SPI, así como una amplia gama de sensores, como termopares, sensores de temperatura o sensores de humedad. 
Resultado de imagen de SPI

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:


- WiFi & Bluetooth Controller Family

- 20 I/Os Controller Family 

- Ethernet Controller Family

- GPRS / GSM Controller Family


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.

El dispositivo maestro puede iniciar la comunicación con uno o más dispositivos esclavos y enviar o recibir datos. Los dispositivos esclavos no pueden iniciar la comunicación ni intercambiar datos entre ellos directamente. 

La comunicación de datos entre maestros y esclavos se realiza en dos líneas independientes, una del maestro a los esclavos y otra de los esclavos al maestro. Por lo tanto, la comunicación es Full Duplex, es decir, el maestro puede enviar y recibir datos simultáneamente.

Otra característica del SPI es que es un bus síncrono. El dispositivo maestro proporciona una señal de reloj, que mantiene todos los dispositivos sincronizados. Esto reduce la complejidad del sistema en comparación con los sistemas asincrónicos.

Por otro lado, necesitamos un mínimo de 3 señales para la transmisión de datos a través de SPI: una de las líneas para enviar datos a los esclavos, otra línea para recibir datos de los diferentes esclavos y la señal del reloj para sincronizar todo el bus. Además, se requiere una línea SS (Slave Select) adicional para cada dispositivo esclavo conectado, para seleccionar el dispositivo con el que se realizará la comunicación:

  • 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

arduino-spi-esquema-basico

      Typical SPI wiring



 Ventajas y desventajas

             

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 típicas del SPI


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 bus
SPI.transfer(c);        // Send a byte
SPI.attachInterrupt(); // Activate the interrupt to receive data

Para cambiar el orden de los bits enviados, tenemos la función setBitOrder:

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: 




 

¿Quieres más información?

Con la tecnología Open Source, puedes ejecutar tus propias instalaciones.

Rellena el formulario y contactaremos contigo lo más pronto posible.

Enviar  Por favor, completa el formulario correctamente.