- ¿Qué es el protocolo de comunicación SPI?
- ¿Cómo funciona el protocolo SPI?
- Diferencia entre comunicación I2C y SPI
- SPI con PIC16F877A usando el compilador XC8:
- Explicación del archivo de encabezado SPI:
- Explicación del programa principal:
- Simulación de PIC con depurador SPI:
Los microcontroladores PIC son una potente plataforma proporcionada por microchip para proyectos integrados; su naturaleza versátil le ha permitido encontrar formas en muchas aplicaciones y aún no ha crecido mucho. Si ha estado siguiendo nuestros tutoriales PIC, se habrá dado cuenta de que ya hemos cubierto una amplia gama de tutoriales sobre el microcontrolador PIC desde lo más básico. En el mismo flujo, vamos a aprender los protocolos de comunicación disponibles con PIC y cómo usarlos. Ya hemos cubierto I2C con microcontrolador PIC.
En el vasto sistema de aplicaciones integradas, ningún microcontrolador puede realizar todas las actividades por sí mismo. En algún momento tiene que comunicarse con otros dispositivos para compartir información, existen muchos tipos diferentes de protocolos de comunicación para compartir esta información, pero los más utilizados son USART, IIC, SPI y CAN. Cada protocolo de comunicación tiene sus propias ventajas y desventajas. Centrémonos en el Protocolo SPI por ahora, ya que eso es lo que vamos a aprender en este tutorial.
¿Qué es el protocolo de comunicación SPI?
El término SPI significa " Interfaz de periféricos en serie ". Es un protocolo de comunicación común que se utiliza para enviar datos entre dos microcontroladores o para leer / escribir datos desde un sensor a un microcontrolador. También se utiliza para comunicarse con tarjetas SD, registros de cambio, controladores de pantalla y mucho más.
¿Cómo funciona el protocolo SPI?
La comunicación SPI es una comunicación sincrónica, lo que significa que funciona con la ayuda de una señal de reloj que se comparte entre los dos dispositivos que intercambian los datos. También es una comunicación full-duplex porque puede enviar y recibir datos usando un bus separado. La comunicación SPI requiere 5 cables para funcionar. A continuación se muestra un circuito de comunicación SPI simple entre un maestro y un esclavo
Los cinco cables necesarios para la comunicación son SCK (reloj en serie), MOSI (Master Out Slave In), MISO (Master In Slave Out) y SS (Slave Select). La comunicación SPI siempre tiene lugar solo entre un maestro y un esclavo. Un maestro puede tener varios esclavos conectados. El maestro es responsable de generar el pulso de reloj y el mismo se comparte con todos los esclavos. Además, todas las comunicaciones solo pueden ser iniciadas por el maestro.
El pin SCK (también conocido como reloj en serie SCL) comparte la señal de reloj generada por el maestro con los esclavos. El pin MOSI (también conocido como SDA - Salida de datos en serie) se usa para enviar los datos del maestro al bálsamo. El pin MISO (también conocido como SDI - Serial Data In) se usa para llevar los datos del bálsamo al maestro. También puede seguir la marca de flecha en la figura anterior para comprender el movimiento de datos / señal. Finalmente, el pin SS (también conocido como CS - Selección de chip) se usa cuando hay más de un módulo esclavo conectado al maestro. Esto se puede utilizar para seleccionar el esclavo requerido. Un circuito de muestra donde más de un esclavo está conectado con el maestro para la comunicación SPI se muestra en el circuito a continuación.
Diferencia entre comunicación I2C y SPI
Ya hemos aprendido la comunicación I2C con PIC y, por lo tanto, debemos estar familiarizados con cómo funciona I2C y dónde podemos usarlos, como I2C se puede usar para interconectar el módulo RTC. Pero ahora, ¿por qué necesitamos el protocolo SPI cuando ya tenemos I2C? La razón es que las comunicaciones I2C y SPI son ventajas a su manera y, por lo tanto, son específicas de la aplicación.
Hasta cierto punto, se puede considerar que la comunicación I2C tiene algunas ventajas sobre la comunicación SPI porque I2C usa menos cantidad de pines y se vuelve muy útil cuando hay una gran cantidad de esclavos conectados al bus. Pero el inconveniente de I2C es que tiene el mismo bus para enviar y recibir datos y, por lo tanto, es comparativamente lento. Por lo tanto, se basa puramente en la aplicación para decidir entre el protocolo SPI e I2C para su proyecto.
SPI con PIC16F877A usando el compilador XC8:
Suficiente de conceptos básicos, ahora aprendamos cómo podemos usar la comunicación SPI en el microcontrolador PIC16F877A usando el compilador MPLABX IDE y XC8. Antes de comenzar, deje en claro que este tutorial solo habla de SPI en PIC16F877a usando el compilador XC8, el proceso será el mismo para otros microcontroladores, pero es posible que se requieran pequeños cambios. También recuerde que para microcontroladores avanzados como la serie PIC18F, el compilador en sí puede tener alguna biblioteca incorporada para usar las funciones de SPI, pero para PIC16F877A no existe nada de eso, así que construyamos uno por nuestra cuenta. La biblioteca explicada aquí se proporcionará como un archivo de encabezado para descargar en la parte inferior que se puede utilizar para que PIC16F877A se comunique con otros dispositivos SPI.
En este tutorial escribiremos un pequeño programa que usa la comunicación SPI para escribir y leer datos del bus SPI. Luego verificaremos lo mismo usando la simulación de Proteus. Todo el código relacionado con los registros SPI se hará dentro del archivo de encabezado llamado PIC16f877a_SPI.h. De esta manera podemos usar este archivo de encabezado en todos nuestros próximos proyectos en los que se requiera comunicación SPI. Y dentro del programa principal solo usaremos las funciones del archivo de encabezado. El código completo junto con el archivo de encabezado se puede descargar desde aquí.
Explicación del archivo de encabezado SPI:
Dentro del archivo de encabezado tenemos que inicializar la comunicación SPI para PIC16F877a. Como siempre, el mejor lugar para comenzar es la hoja de datos PIC16F877A. Los registros que controlan la comunicación SPI para PIC16F8777a son SSPSTAT y SSPCON Register. Puede consultarlos en las páginas 74 y 75 de la hoja de datos.
Hay muchas opciones de parámetros que deben elegirse al inicializar la comunicación SPI. La opción más utilizada es que la frecuencia del reloj se establecerá en Fosc / 4 y se realizará en el medio y el reloj se establecerá como bajo en el estado ideal. Por lo tanto, también estamos usando la misma configuración para nuestro archivo de encabezado, puede cambiarlos fácilmente cambiando los bits respectivos.
SPI_Initialize_Master ()
La función SPI initialize Master se utiliza para iniciar la comunicación SPI como maestro. Dentro de esta función configuramos los respectivos pines RC5 y RC3 como pines de salida. Luego configuramos el SSPTAT y el registro SSPCON para encender las comunicaciones SPI
anular SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // pág. 74/234 SSPCON = 0b00100000; // pág. 75/234 TRISC3 = 0; // Establecer como salida para el modo esclavo }
SPI_Initialize_Slave ()
Esta función se utiliza para configurar el microcontrolador para que funcione en modo esclavo para la comunicación SPI. Durante el modo esclavo, el pin RC5 debe establecerse como salida y el pin RC3 debe establecerse como entrada. SSPSTAT y SSPCON se configuran de la misma forma tanto para el esclavo como para el maestro.
anular SPI_Initialize_Slave () { TRISC5 = 0; // El pin SDO debe declararse como salida SSPSTAT = 0b00000000; // pág. 74/234 SSPCON = 0b00100000; // pág. 75/234 TRISC3 = 1; // Establecer como en salida para el modo maestro }
SPI_Write (char entrante)
La función SPI Write se utiliza para escribir datos en el bus SPI. Obtiene la información del usuario a través de la variable entrante y luego la usa para pasar al registro Buffer. El SSPBUF se borrará en el pulso de reloj consecutivo y los datos se enviarán al bus bit a bit.
void SPI_Write (char entrante) { SSPBUF = entrante; // Escribe los datos proporcionados por el usuario en el búfer }
SPI_Ready2Read ()
La función SPI ready to Read se utiliza para verificar si los datos en el bus SPI se reciben completamente y si se pueden leer. El registro SSPSTAT tiene un bit llamado BF que se establecerá una vez que los datos se hayan recibido por completo, por lo que verificamos si este bit está establecido si no lo está, entonces tenemos que esperar hasta que se establezca para leer algo del bus SPI.
unsigned SPI_Ready2Read () { if (SSPSTAT & 0b00000001) return 1; de lo contrario, devuelve 0; }
SPI_Read ()
La lectura de SPI se utiliza para leer los datos del bus SPI en el microcontrolador. Los datos presentes en el bus SPI se almacenarán en el SSPBUF, tenemos que esperar hasta que los datos completos se almacenen en el Buffer y luego podamos leerlos en una variable. Verificamos el bit BF del registro SSPSTAT antes de leer el búfer para asegurarnos de que la recepción de datos sea completa.
char SPI_Read () // Leer los datos recibidos { while (! SSPSTATbits.BF); // Mantener presionado hasta que se establezca el bit BF, para asegurarse de que se lean los datos completos return (SSPBUF); // devuelve los datos leídos }
Explicación del programa principal:
Las funciones explicadas en la sección anterior estarán en el archivo de encabezado y se pueden llamar al archivo c principal. Entonces, escribamos un pequeño programa para verificar si la comunicación SPI está funcionando. Simplemente escribiremos algunos datos en el bus SPI y usaremos la simulación de proteus para verificar si se están recibiendo los mismos datos en el depurador SPI.
Como siempre, comience el programa configurando los bits de configuración y luego es muy importante agregar el archivo de encabezado que acabamos de explicar en el programa como se muestra a continuación.
#incluir
Si ha abierto el programa desde el archivo zip descargado anteriormente, de forma predeterminada, el archivo de encabezado estará presente dentro del directorio de archivos de encabezado de su archivo de proyecto. De lo contrario, debe agregar el archivo de encabezado manualmente dentro de su proyecto, una vez agregado, los archivos de su proyecto se verán así a continuación
Dentro del archivo principal tenemos que inicializar el PIC como maestro para la comunicación SPI y luego dentro de un bucle while infinito escribiremos tres valores hexadecimales aleatorios en el bus SPI para comprobar si recibimos lo mismo durante la simulación.
void main () { SPI_Initialize_Master (); mientras que (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Observe que los valores aleatorios usados en el programa son 0A, 0F y 15 y son valores hexadecimales, por lo que deberíamos ver lo mismo durante la simulación. Es decir, el código está todo hecho, esto es solo una muestra, pero podemos usar la misma metodología para comunicarnos con otro MCU o con otro módulo de sensores que operan en el protocolo SPI.
Simulación de PIC con depurador SPI:
Ahora que nuestro programa está listo, podemos compilarlo y luego proceder con la simulación. Proteus tiene una característica útil y agradable llamada depurador SPI , que se puede usar para monitorear los datos a través de un bus SPI. Entonces usamos lo mismo y construimos un circuito como se muestra a continuación.
Dado que solo hay un dispositivo SPI en la simulación, no estamos usando el pin SS y cuando no se usa debe conectarse a tierra como se muestra arriba. Simplemente cargue el archivo hexadecimal en el microcontrolador PIC16F877A y haga clic en el botón de reproducción para simular nuestro programa. Una vez que comience la simulación, aparecerá una ventana emergente que muestra los datos en el bus SPI como se muestra a continuación.
Echemos un vistazo más de cerca a los datos que ingresan y verifiquemos si son los mismos que los que escribimos en nuestro programa.
Los datos se reciben en el mismo orden en que los escribimos en nuestro programa y los mismos se resaltan para usted. También puede intentar simular un programa para comunicarse con dos microcontroladores PIC utilizando el protocolo SPI. Tiene que programar un PIC como maestro y el otro como esclavo. Todos los archivos de encabezado necesarios para este propósito ya se encuentran en el archivo de encabezado.
Esto es solo un vistazo de lo que puede hacer SPI, también puede leer y escribir datos en múltiples dispositivos. Cubriremos más sobre SPI en nuestros próximos tutoriales mediante la interfaz de varios módulos que funcionan con el protocolo SPI.
Espero que haya entendido el proyecto y haya aprendido algo útil de él. Si tiene alguna duda, publíquela en la sección de comentarios a continuación o utilice los foros para obtener ayuda técnica.
A continuación se proporciona el código principal completo; puedes descargar archivos de encabezado con todo el código desde aquí