- Configuración de hardware y requisitos para habilitar la función SPI en N76E003
- Circuito a interfaz
- Pines SPI en el microcontrolador Nuvoton N76E003
- Información SPI N76E003
- Maestro
- Programación
- Probando la comunicación SPI en Nuvoton usando Arduino
SPI es un protocolo de comunicación crucial que se usa ampliamente para comunicarse entre microcontroladores, tarjetas SD y varios otros sensores. SPI son las siglas de Serial Peripheral Interface, es un protocolo de transferencia de datos síncrono en el que el dispositivo maestro podría comunicarse con múltiples dispositivos esclavos y obtener datos de ellos. Es síncrono porque el maestro genera un reloj en una línea de E / S separada que garantiza que ambos dispositivos, maestro y esclavo, estén funcionando a la misma velocidad de reloj.
El protocolo SPI usa dos líneas de datos, una línea de selección y una línea de reloj. Las conexiones son SS (Selección de esclavo), MISO (Master In Slave Out), MOSI (Master Out Slave In) y SCK (Serial Clock). A pesar de una línea SCK, el maestro genera un reloj y el SS se utiliza para seleccionar cualquier esclavo individual en una línea de bus donde varios dispositivos esclavos están conectados con el maestro. MISO se usa para recibir los datos del esclavo y MOSI se usa para enviar datos del maestro al dispositivo esclavo.
Anteriormente, hemos creado muchos proyectos que utilizan el protocolo SPI para comunicarse entre sensores, así que échales un vistazo si quieres aprender un poco más sobre el tema. Además, si desea comenzar con los conceptos básicos de una placa Nuvoton N76E003, considere verificar la guía de introducción a Nuvoton
Configuración de hardware y requisitos para habilitar la función SPI en N76E003
El objetivo de este proyecto es aprender la comunicación SPI usando N76E003, y la mejor manera es configurar un ejemplo de SPI en el cual transferimos un mensaje entre dos unidades microcontroladoras, para ello usaremos un Arduino como dispositivo esclavo que es conectado con la línea N76E003 SPI. Enviaremos datos al Arduino, los validaremos y los imprimiremos usando Arduinos UART. A continuación, enviamos un dato de Arduino al N76E003, lo validamos y lo imprimimos usando N76E003 UART, es por eso que se hace necesario un conversor USB a UART para el N76E003 y un Arduino para nuestra aplicación de ejemplo, usaremos CP2102 UART a USB convertidor y un Arduino Nano para cumplir con nuestros requisitos.
Sin mencionar que, aparte de las cosas anteriores, necesitamos la placa de desarrollo basada en microcontroladores N76E003, así como el programador Nu-Link para programar la placa. Además, los cables de Berg se utilizan para todas las conexiones de hardware.
Mientras hicimos algunos artículos como RS-485 MODBUS Comunicación serial con Arduino como maestro, y Arduino a Arduino Comunicación Bluetooth usando la configuración maestro-esclavo donde hemos configurado un Arduino como dispositivo maestro, no dude en revisarlos si eso alcanza su punto interesar.
Circuito a interfaz
Como podemos ver en el esquema, el Arduino Nano está conectado con el SPI del N76E003. En el extremo izquierdo, se muestra la conexión de la interfaz de programación.
Pines SPI en el microcontrolador Nuvoton N76E003
El diagrama de pines de N76E003 se puede ver en la siguiente imagen:
Como podemos ver en el diagrama de pines anterior, cada pin tiene especificaciones funcionales multiplexadas, y cada uno puede programarse dependiendo de la aplicación. Sin embargo, los pasadores 0.1, 0.0, 1.0, y 1.5 se utilizan como MISO, MOSI, SPCLK, y SS pasadores respectivamente. Si habilitamos SPI, perderá PWM y otras funciones. Pero eso no es un problema ya que no se requiere otra funcionalidad para este proyecto. Este chip considera todos los pines SPI como GPIO, por lo que es necesario configurarlos. El método de configuración se describe a continuación.
Según la hoja de datos, PxM1.ny PxM2.n son dos registros que se utilizan para determinar la operación de control del puerto de E / S. En la hoja de datos N76E003, se indica que para usar la funcionalidad SPI, los modos de E / S deben usarse como modo Cuasi para comunicaciones SPI.
Información SPI N76E003
El periférico SPI es una característica imprescindible para cualquier microcontrolador, no solo es fácil de usar, sino que puede lograr las velocidades de transferencia más rápidas entre muchos otros protocolos de comunicación genéricos, por lo que los diferentes tipos de microcontroladores vienen con un periférico SPI incorporado..
Antes de continuar con la comunicación SPI, es importante conocer algunas cosas sobre la comunicación SPI en N7E003.
Pin SS del N76E003:
Es un pin importante en la comunicación SPI. El pin de selección de esclavos selecciona esclavos específicos en un bus SPI de múltiples esclavos. Todos los esclavos individuales deben requerir un pin de selección de esclavos. No se puede conectar un solo pin SS a varios esclavos.
La siguiente imagen muestra las posibles conexiones esclavas múltiples:
Selección del bit MSB First o LSB First en N76E003:
N76E003 admite dos tipos de comunicación de datos: primero MSB o primero LSB. De forma predeterminada, se selecciona el MSB primero. Sin embargo, los primeros datos de LSB también se pueden seleccionar en N76E003. Nos encargaremos de esta selección en el proceso de codificación.
La conexión SPI simple con Single-Master y Single-Salve se muestra en la siguiente imagen:
Registro de control de periféricos SPI (SPCR) del N76E003:
El registro de control SPI SPCR se utiliza para controlar las operaciones SPI.
Los dos primeros bits son el bit de selección de frecuencia de reloj SPI. Las velocidades de reloj se ilustran a continuación donde la frecuencia del sistema es de 16 Mhz.
El bit CPHA es el bit de selección de fase de reloj. Si se establece la bandera de CPHA, los datos se muestrean en el segundo borde del reloj SPI. Si se borra, los datos se muestrean en el primer borde. El siguiente bit es CPOLI, que es el nivel de estado inactivo del reloj SPI. Si se establece en 0, el reloj estará bajo en estado inactivo, si se establece en 1, estará alto en estado inactivo. El MSTR es el bit de habilitación del modo maestro, que se utiliza para configurar el N76E003 como modo maestro, al borrar este bit se convertirá en modo esclavo. LSBFE se utiliza para la dirección de transferencia de datos. Borrar este bit hará que la transferencia de datos sea primero MSB, mientras que establecerlo en 1 activará la primera dirección LSB. SPIEN se utiliza para habilitar el SPI. El ajuste 1 habilitará el periférico SPI. El SSOE final es el bit de habilitación de salida de selección esclava SPI,y se utiliza para configurar el pin SS como de propósito general o en modo automático.
Aparte del anterior, hay otro registro llamado registro de estado de periférico en serie.
El registro anterior se utiliza para obtener los distintos estados de SPI.
Maestro
La función principal es simple, iniciará el periférico SPI y la UART, también llamará al Start_Sending_SPI (); función en el ciclo while. Si es nuevo en el uso de UART con Nuvoton, consulte el tutorial vinculado.
vacío principal (vacío) {Set_All_GPIO_Quasi_Mode; InitialUART0_Timer1 (115200); / * 115200 Velocidad en baudios * / SPI_Initial (); printf ("\ nSPI Iniciar transmisión… \ n"); while (1) // Finalización de la transmisión SPI {Start_Sending_SPI (); }}
Echemos un vistazo a SPI_Initial (); función.
anular SPI_Initial (anular) {P15_Quasi_Mode; // P15 (SS) Modo cuasi P10_Quasi_Mode; // P10 (SPCLK) Modo cuasi P00_Quasi_Mode; // P00 (MOSI) Modo cuasi P01_Quasi_Mode; // P22 (MISO) Modo cuasi set_DISMODF; // SS E / S de propósito general (sin falla de modo) clr_SSOE; clr_LSBFE; // MSB primero clr_CPOL; // El reloj SPI está bajo en modo inactivo set_CPHA; // Los datos son
muestra en el segundo borde del reloj SPI.
set_MSTR; // SPI en modo maestro SPICLK_DIV2; // Seleccione el reloj SPI Enable_SPI_Interrupt; // Habilita la interrupción SPI set_SPIEN; // Habilita la función SPI}
Como se describió anteriormente, los pines del puerto SPI deben configurarse y establecerse como la configuración Cuasi, las primeras cuatro líneas dentro de la función SPI_Initial () hacen exactamente eso, la configuración para el SPI se selecciona como el pin SS de propósito general, el los datos se transferirán primero como MSB, el reloj SPI es bajo en modo inactivo con muestreo de datos del segundo borde. Como N76E003 actuará como modo maestro, se configura como maestro. La interrupción SPI se establece con el bit SPIEN habilitado para SPI. Todas estas funciones están disponibles en el archivo de encabezado SFR_Macro.h .
En la función Start_Sending_SPI () , el pin SS se baja primero, los datos se envían al Arduino a través de SPI. El registro SPDR mantendrá el valor que se enviará al esclavo SPI y también recibirá el valor del esclavo.
void Start_Sending_SPI () {SS = 0; SPDR = 0x90; // Enviar 0x90 al esclavo PCON - = SET_BIT0; // Entrar en modo inactivo si (SPDR! = 0x4E) // Recibir el primer DATOS del esclavo SPI_Error (); printf ("\ nRegreso esclavo% x \ n", SPDR & 0xFF); SS = 1; }
Sin embargo, existe una condición de validación, donde el valor SPRD se verifica con (0x4E) que se recibe del Arduino. Si los datos no son 0x4E, detendrá la comunicación SPI ingresando al ciclo while.
void SPI_Error (void) {printf ("\ nSlave detuvo el envío de datos. \ n"); while (1) // error SPI y flash P0.7 / {}}
Como SPI utilizado en la interrupción del temporizador, aquí se utiliza una función ISR:
void SPI_ISR (void) interrumpir 9 // Vecotr @ 0x4B {clr_SPIF; Timer3_Delay10us (1); }
Limpiará el SPIF con un intervalo de tiempo de 1 microsegundo.
Programación
Arduino Nano también tiene los mismos pines SPI que se muestran en la imagen a continuación-
Sin embargo, no entraremos en detalles sobre Arduino SPI, ya que hay un montón de detalles disponibles que muestran cómo usar SPI en un Arduino.
Primero, incluimos todos los encabezados y variables necesarios, #incluir
A continuación, en la sección de configuración, inicializamos UART, configuramos nuestro pin MISO predefinido como salida, habilitamos SPI en modo esclavo, configuramos nuestra variable recibida predefinida como falsa, y finalmente, habilitamos nuestra interrupción, que marca el final de el ciclo de configuración.
configuración vacía () {Serial.begin (115200); pinMode (MISO, SALIDA); // Establece MISO como SALIDA (tiene que enviar datos al maestro IN SPCR - = _BV (SPE); // Activar SPI en modo esclavo recibido = falso; SPI.attachInterrupt (); // Interuupt ON está configurado para comunicación SPI}
A continuación, hemos definido nuestra rutina de servicio de interrupción, en la rutina de servicio de interrupción, volcamos los datos de SPDR Register a nuestra variable predefinida Slavereceived , imprimimos los datos utilizando las funciones incorporadas Serial.print y establecemos la variable recibida en true.
En la sección de bucle, estamos enviando un valor predefinido al registro SPDR, una vez por segundo, que transmite los datos al módulo maestro.
Probando la comunicación SPI en Nuvoton usando Arduino
El código completo se encuentra al final de esta página. El código cuando se cargó devolvió 0 advertencia y 0 errores y parpadeó utilizando el método de parpadeo predeterminado de Keil. La aplicación comienza a funcionar.
Crear enlace de destino 'SPI_INT_M'… Tamaño del programa: data = 58.2 xdata = 0 código = 2402 creando un archivo hexadecimal desde ". \ Output \ Master_P"… ". \ Output \ Master_P" - 0 Error (s), 0 Advertencia (s). Tiempo de compilación transcurrido: 00:00:01 Resumen de compilación por lotes: 1 exitoso, 0 fallido, 0 omitido - Tiempo transcurrido: 00:00:01
He usado cables de puente para conectar mi placa nuvoton con Arduino, mi conexión de configuración de prueba se muestra a continuación.
La salida de la UART se puede ver en las siguientes imágenes. Cuando abrimos el monitor serial de Arduino, podemos ver los valores de la placa nuvoton que se reciben a través de la comunicación SPI.
De manera similar, en el lado de nuvoton, hemos utilizado el término tera para monitorear los datos que se reciben del esclavo (aquí Arduino). Básicamente, estamos enviando 90 de nuvoton a Arduino y enviando 4e00 de Arduino a nuvoton. De las instantáneas en el monitor en serie, queda claro que tanto el maestro como el esclavo SPI funcionan como se esperaba.
Puede ver el video vinculado a continuación para ver la demostración completa de este tutorial. Espero que hayas disfrutado del artículo y hayas aprendido algo útil. Si tiene alguna pregunta, puede dejarla en la sección de comentarios a continuación o utilizar nuestros foros para publicar otras preguntas técnicas.