Hola controleros y controleras bienvenidos a otra entrada de nuestro curso de PIC donde vamos a aprender a usar la comunicación SPI con la cual en nuestra próxima entrada lo usaremos para conectaremos una termocupla tipo K al microcontrolador para que nos sirva de ejemplo en la utilización de este protocolo de comunicación.

Primero deseo hacerte la invitación a que revises el curso GRATIS de 👉Microcontroladores PIC

Comunicación SPI con PIC

A lo largo de nuestro curso de microcontroladores PIC hemos abordado los diferentes tipos de comunicación serial que posee nuestro sistema embebido tanto síncrona como asíncrona.

Tuvimos la oportunidad de ver el protocolo de comunicación asíncrono RS232 utilizando el UART (Universal Asynchronous Receiver Transmitter), como también la comunicación sincrona utilizando la comunicación I2C (Inter Integrated Circuit), pero ahora es tiempo de ver una segunda comunicación síncrona muy popular conocida como comunicación SPI (Serial Peripheral Interface).

Habíamos visto que en la comunicación serial síncrona definimos el concepto de Maestro-Esclavo. Normalmente, quien genera la señal de sincronismo se define como Maestro (Master) de la comunicación y los dispositivos que utilizan la señal de sincronismo generada los definimos como Esclavo (Slave).

La comunicación SPI utiliza dos señales de transmisión de datos lo que le da mayor velocidad de comunicación debido a que hay poca deformación de la señal.

Con la comunicación SPI el intercambio de datos ocurre siempre en ambas direcciones. En decir, cuando existe intercambio de un bit entre el maestro y algún esclavo seguidamente vendrá un intercambio de un bit del esclavo para el maestro. De esta forma, definimos que la comunicación es siempre full-duplex.

Los pines básicos de comunicación entre dispositivos SPI y el esquema de conexión estándar se muestra a continuación, esto sirve para CUALQUIER dispositovo que use SPI (PIC, ARDUINO, MOTOROLA,ETC):

Pin

Nombre Estandar

Significado

Nombres Alternativos

 

Del Master para el Slave

MOSI

Master Output Slave Input

SDO, DO, SO

 

Del Slave para el Master

MISO

Master Input Slave Output

SDI, DI, SI

 

Clock

SCLK

Serial Clock

SCK, CLK

 

Selección del Slave

SS

Slave Select

CS, nSS, nCS

 
Esquema comunicación SPI

Cuando se conectan varios esclavos a un puerto SPI, los esclavos se conectan en paralelo y las señales CS o SS del maestro se vinculan a cada SS de los esclavos. La salida de datos del esclavo seleccionado mediante la señal CS/SS se habilita y los dispositivos deseleccionados se desconectan de la línea MISO.

La señal de SS funciona como Selección de Esclavo (Slave Select). Es una señal activa a nivel bajo, lo que significa que el dispositivo se selecciona cuando este pin se encuentra a un nivel bajo.

Pines SPI 16F887 y 18F4550

A continuación en Rojo se muestra la ubicación de los pines que componen el hardware del protocolo SPI en los PIC 16F887 y 18F4550. Los 4 pines en cada uno corresponden a (SDO, SDI, SCK, SS) explicados en la tabla de arriba.

SPI pinout

Funcionamiento de la comunicación SPI

Como vimos en el esquema anterior, una comunicación SPI básica entre dos dispositivos tendrá 4 Lineas o en su defecto 3 lineas si uno de los dispositovos no necesita enviar nada.

Vemos que el MASTER colocará en bajo el pin SS del Slave con el que se quiere comunicar. Seguidamente, el master genera una señal de reloj para sincronizar el envío y recepción de datos. Note que los datos aparecen en el flanco de subida de la señal de reloj (SCK), este es el modo de comunicación más común, sin embargo existen otros modos de comunicarse que se detallarán a continuación.

Modos de Transferencia en comunicación SPI

En la comunicación SPI, el cambio de datos y el bloqueo de datos se realizan en los bordes de la señal de reloj (flancos de subida o bajada), respectivamente. Existe la ventaja de que cuando se separan las operaciones de cambio de polaridad del reloj (latch) y de fase del reloj (shift), se puede evitar la sincronización crítica entre dos operaciones. Por lo tanto, la consideración de tiempo para el maestro y el esclavo se puede aliviar. Pero, por otro lado, hay cuatro modos de operación debido a la combinación de polaridad de reloj y fase de reloj, el maestro debe configurar su interfaz SPI con un modo SPI que el esclavo sea capaz de interpretar.

Tiempos y modos del SPI

Funciones de CCS para SPI

setup_spi (modo), setup_spi2 (modo): configura el SPI de hardware en el modo especificado.
El modo configura si es maestro o esclavo, la velocidad del reloj y la configuración cambios de reloj / datos.
Nota: para dispositivos con interfaces SPI dobles se proporciona una segunda función, setup_spi2 (), para configurar la segunda interfaz.

spi_data_is_in (), spi_data_is_in2 () – Devuelve TRUE si el búfer de recepción SPI tiene un byte de datos.
spi_write (valor), spi_write2 (valor): transmite el valor a través de la interfaz SPI. Esto hará que los datos se vacien en el pin SDO.
spi_read (valor), spi_read2 (valor): realiza una transacción SPI, donde el valor se registra en el pin SDO y se devuelven los datos sincronizados en el pin SDI. Si solo desea registrar los datos, puede usar spi_read () sin un parámetro.

Interrupciones por SPI

int_ssp, # int_ssp2 – directiva para definir la interrupción dentro del código

[PCD] # int_spi1 – Interrumpe la actividad del primer módulo SPI.
[PCD] # int_spi2 – Interrumpe la actividad del segundo módulo SPI.

Modos SPI dentro de CCS

Buffer SPI

Dentro de los registros del PIC, se encuentra una directiva llamada SSBUF, la cual es el buffer donde se almacenan los datos recibidos a través de la comunicación SPI, será importante definir la dirección de memoria de esta libreria en el programa, la cual nos la suministra el datasheet.

Ejemplo de Comunicación SPI con PIC en CCS

Realizar una comunicación SPI entre dos Microcontroladores, donde el PIC maestro tendrá una comunicación Serial RS232 para que el usuario pueda decidir las acciones a ejecutar.

Las acciones a ejecutar consisten en que el Maestro debe mostrarle al usuario 3 lecturas diferentes:

  1. Leer el voltaje de un potenciometro
  2. Leer el estado logico de un interruptor
  3. Leer la cuenta de un contador

Solo que esas tres lecturas las tiene un PIC esclavo (potenciomentro en AN0, interruptor en B4 y contador en la memoria interna del esclavo).

Por lo tanto el Maestro deberá pedir esas informaciones al esclavo a través de una comunicación SPI.

Circuito SPI 16F887

Circuito SPI 18F4550

Código en CCS de Comunicación SPI

Para descargar el código basta solo con que compartas el contenido de este post con cualquiera de los siguientes tres botones, de esa forma ayudas a que este sitio web pueda llegar a más personas y pueda brindar estos conocimientos

Código del Maestro

Código del Esclavo

Bueno controleros y controleras, eso es todo por la entrada del día de hoy, ya por lo menos nos hemos familiarizado un poco con la comunicación SPI, y en la próxima entrada podremos hacer una lectura de una termocupla tipo K usando este tipo de protocolo de comunicación.

Espero se encuentren muy bien y nos vemos en la próxima.

Comunicación SPI con PIC
5 (100%) 1 vote[s]

Esta entrada tiene 4 comentarios

  1. Hola Sergio,

    Te felicito por tu página.
    Nos ha sido muy útil.
    Nosotros trabajamos con PIC y no sabemos como lograr que un ADC se estabilice, por ejemplo para sistemas muy dinámicos (en movimiento).
    Puedes tratar el tema o recomendar como filtrar o amortiguar por código esta toma de datos?
    Por ejemplo si tomas un ADC para una báscula de pesaje dinámico los datos suben y bajan y no se como estabilizarlos.
    Usamos algunos CI de ADC y nos pasa lo mismo, no sabemos como estabilizar el pesaje.
    Ojalá nos puedas guiar o recomendar algo.
    Saludos desde Chile.

    1. Hola Francisco, una opción de estabilizar las lecturas ADC es a través de un filtro de promedio movil, el cual se hace por código. En un FOR lees digamos unas 100 veces, guardas los 100 valores en un vector, los sumas todos y los divides por 100, para obtener el promeio. Igual puedes hacerlo con menos datos.

      1. Probamos eso y no nos da resultados positivos, ya que no elimina los extremos que generan vibraciones de los motores o bandas transportadoras.
        Tambien intentamos simular un filtro RC, pero tampoco logro los resultados en iguales condiciones con una bascula industrial.

        1. Es importante tener una medida lo más limpia posible, pues si hay mucha varianza en la lectura, va a ser complicado. Trata de filtrar la señal con amplificadores operacionales, en modo seguidor y con filtro pasa bajos. En el pic coloca un condensador de 10u lo más cerca posible del pin de 5v y gnd. Si la señal es muy ruidosa es complicado arreglar un problema de hardware por software. Lo otro que podrías hacer es tomar la medida cuando se estabilice, es decir al colocar el objeto en la balanza, dicha balanza le tomara un tiempo en entregar el peso, una vez que lo cuantifique, en ese momento sería el ideal para leerlo con el PIC, y talvez con el filtro de promedio movil.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comunicación SPI con PIC
Cerrar menú