MICROCONTROLADORES II (A)
INFORME DE LABORATORIO Nº5
COMUNICACIÓN MEDIANTE INTERFAZ SPI
SEMESTRE II/2023
Estudiante:
Natalia Berrocal Gamez
Docente: Ing. Ariel Condo Merlo
La Paz 16 de Noviembre del 2023
Tabla de contenido
ÍNDICE DE FIGURAS........................................................................................................... 2
ÍNDICE DE TABLAS ............................................................................................................. 3
1. Introducción ................................................................................................................ 4
2. Objetivos ..................................................................................................................... 4
3. Fundamento teórico .................................................................................................... 4
3.1. `SPI ......................................................................................................................... 4
3.2. Modos de crónometro del SPI ................................................................................. 6
4. Materiales y Equipos .................................................................................................. 7
5. Técnica o Procedimiento ............................................................................................ 7
5.1. PARTE 1 ................................................................................................................. 7
6. CUESTIONARIO .......................................................................................................11
7. Bibliografía .................................................................................................................11
1
ÍNDICE DE FIGURAS
Figura 1.La conexión dúplex SPI básica usa dos líneas de datos (MOSI, MISO), una línea
de reloj (SCK) y una línea de selección de chip (CS) ........................................................... 5
Figura 2. Dos configuraciones para tratar con interfaces de varios dispositivos secundarios.
............................................................................................................................................. 5
Figura 3.La selección del modo de cronómetro de la SPI fija el borde de reloj activo en el que
se toman muestras de los datos ........................................................................................... 6
Figura 4. Ejemplo de un cambio de la SPI según se visualiza con un osciloscopio Teledyne
LeCroy HDO4104A ............................................................................................................... 7
2
ÍNDICE DE TABLAS
Tabla 1.Materiales y equipos ................................................................................................ 7
3
INFORME DE LABORATORIO Nº5
COMUNICACIÓN MEDIANTE INTERFAZ SPI
1. Introducción
La comunicación eficiente y confiable entre dispositivos electrónicos es fundamental en el
mundo de la tecnología actual. Uno de los protocolos de comunicación ampliamente utilizado
en sistemas embebidos es el Interfaz de Periféricos en Serie (SPI, por sus siglas en inglés).
En este contexto, la familia de microcontroladores STM32, desarrollada por
STMicroelectronics, ofrece una robusta implementación de esta interfaz, proporcionando a
los diseñadores las herramientas necesarias para establecer una comunicación rápida y
bidireccional entre diversos componentes.
La Interfaz SPI se destaca por su versatilidad y capacidad para conectar varios dispositivos
en un bus único, lo que la convierte en una elección popular para aplicaciones que requieren
la transferencia de datos en tiempo real. En este contexto, exploraremos a fondo la
implementación de la comunicación mediante la interfaz SPI en microcontroladores STM32.
Examinaremos sus características clave, ventajas, y cómo aprovechar al máximo esta
tecnología para diseñar sistemas embebidos eficientes y fiables.
2. Objetivos
⚫ Comprender los fundamentos de la interfaz SPI
⚫ Conocer la arquitectura de los microcontroladores stm32
⚫ Configurar el software y hardware
3. Fundamento teórico
3.1. `SPI
La SPI fue desarrollada por Motorola (ahora parte de NXP Semiconductors)
aproximadamente en 1985. Se trata de una interfaz serial síncrona prevista para la
comunicación entre dispositivos a corta distancia. Desde entonces, se ha convertido en un
estándar de-facto empleado por muchos fabricantes de semiconductores, especialmente en
microprocesadores y microcontroladores.
El motivo de la popularidad de SPI radica en sus muchas ventajas. La primera es que es una
interfaz direccionada de hardware simple que ofrece completa flexibilidad para la cantidad
de bis transferidos. Usa un modelo de maestro-secundario con un maestro simple y puede
4
manejar varios dispositivos secundarios usando comunicaciones dúplex que operan a
velocidades de reloj de hasta 50 MHz. No usa un protocolo estándar y transfiere solo
paquetes de datos, lo que la hace ideal para transferir flujos de datos largos.
SPI usa un máximo de cuatro líneas de señal (Figura 1). El dispositivo maestro, por lo general
un procesador o controlador, suministra y controla el reloj (SCK) y líneas de selección de
chip (CS). La operación multiplexor completa se maneja a través de las líneas de datos
Master Out Slave In (MOSI) y Master In Slave Out (MISO). En un maestro individual simple,
con configuración del dispositivo secundario individual, la línea de selección de chip puede
eliminarse y se puede forzar la entrada de CS al dispositivo secundario al estado lógico
habilitado. Si el dispositivo secundario solo puede enviar datos (comunicación semidúplex),
luego la línea MOSI también puede eliminarse, y así reducir el conteo de señales
adicionalmente. Los datos salen a través de la señal del reloj de tal forma que la transferencia
de datos se asemeja a un registro de turnos con un bit cambiado para cada reloj.
Figura 1.La conexión dúplex SPI básica usa dos líneas de datos (MOSI, MISO), una línea de reloj (SCK) y una línea de
selección de chip (CS)
Hay dos enfoques para manejar varios dispositivos secundarios (Figura 2).
Figura 2. Dos configuraciones para tratar con interfaces de varios dispositivos secundarios.
5
La conexión directa usa una línea de selección de chips para cada dispositivo secundario.
La mayoría de los microprocesadores posee tres o cuatro líneas de selección de chip. Esto
limita la cantidad máxima de dispositivos secundarios al número de líneas de selección de
chip. En la mayoría de los casos, esto no resulta ser un problema, pero si un diseño requiere
más dispositivos en el bus, se pueden configurar algunos usando el enfoque encadenado.
Con un encadenamiento, se usa una selección de chips comunes para varios dispositivos
secundarios y los datos se transfieren hacia afuera en una línea de datos común. Una vez
más, si se usa el modelo de los dispositivos secundarios SPI como un registro de turnos, los
datos de los dispositivos secundarios se propagan en un flujo multiplexado serial.
3.2. Modos de crónometro del SPI
El maestro controla y genera el reloj. Los dos atributos de reloj son la polaridad del reloj
(CPOL) y la fase de reloj (CPHA). Estos controlan el borde del reloj activo, donde se
cronometra el dispositivo secundario en relación con los datos. CPOL = 0 establece el reloj
en inactivo a una lógica 0. CPOL = 1 presenta el reloj inactivo en la lógica 1. CPHA = 0
establece los datos en el reloj en el borde principal, y CPHA = 1 establece los datos en el
reloj en el borde de rastreo (Figura 3).
Figura 3.La selección del modo de cronómetro de la SPI fija el borde de reloj activo en el que se toman muestras de los
datos
La configuración de las líneas CPOL y CPHA en el maestro determina la polaridad del reloj
y el borde activo para la cronometrización de los datos. El Modo 1 es el que se usa con más
frecuencia, pero el diseñador puede acceder fácilmente a los otros tres modos.
Los tres componentes de señales de una transferencia de la SPI pueden observarse con un
osciloscopio (Figura 4). En este ejemplo, se transfieren paquetes de datos de 8 bits. Se usa
el osciloscopio de Teledyne LeCroy HDO4104A con su opción de decodificación serial de la
SPI para observar la transferencia.
6
Figura 4. Ejemplo de un cambio de la SPI según se visualiza con un osciloscopio Teledyne LeCroy HDO4104A
4. Materiales y Equipos
DENOMINACIÓN CANTIDAD
1 Aplicación STM32CUBE-ide 1
Tabla 1.Materiales y equipos
5. Técnica o Procedimiento
5.1. PARTE 1
Analizar el código enviado por el docente
1. Analizaremos el archivo main.c
2. #include "stm32f1xx.h"
3. #include "spi.h"
4.
5. uint8_t data[5]={0x01,0x02,0x03,0x04,0x05};
6.
7.
8. int main(void)
9. {
10. spi_init();
11.
12. while(1)
13. { cs_low();
14. spi_transmit(data, 5);
15. cs_high();
16. for (int i=0;i<10000;i++);
17. }
18. }
19.
7
No analizaremos todo el código porque ya lo conocemos, por lo tanto nos iremos a la función
principal main, donde encontramos lo siguiente:
• spi_init(): Llama a una función spi_init() que se encarga de inicializar la interfaz
SPI. La implementación específica de esta función se encontraría en el archivo
"spi.c" o "spi.c".
• Bucle Principal (while(1)): El programa entra en un bucle infinito.
• cs_low() y cs_high(): Estas funciones (probablemente definidas en el archivo
"spi.c") controlan el pin de selección del esclavo (Chip Select). cs_low() coloca
el pin en estado bajo, indicando que se selecciona el dispositivo esclavo, y
cs_high() lo coloca en estado alto, indicando que el esclavo está
deseleccionado.
• spi_transmit(data, 5): Transmite los datos del array data a través de la interfaz
SPI. La implementación de esta función (spi_transmit()) también se encontraría
en el archivo "spi.c" y sería responsable de enviar los datos a través de la
interfaz SPI.
• for (int i=0;i<10000;i++);: Un bucle de retardo que espera un tiempo antes de
volver a transmitir los datos. Este bucle se utiliza para introducir un cierto
retraso antes de la siguiente transmisión.
En resumen, el código establece una comunicación SPI básica enviando un conjunto de
datos (data) a través de la interfaz SPI a un dispositivo esclavo. La selección y deselección
del dispositivo esclavo se realiza mediante el control del pin de selección del esclavo (Chip
Select). La velocidad de transmisión y otros detalles de configuración de la interfaz SPI
dependerán de cómo se implemente la función spi_init() en el archivo "spi.c".
2. Analizaremos el Archivo SPI.c
#include "spi.h"
#include "stm32f1xx.h"
void spi_init(void)
{
//Enable Port A clock
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
/* PA5-SCK and PA7-MOSI */
//Mode: Output, Speed: 10MHz
GPIOA->CRL &= ~(GPIO_CRL_MODE5);
GPIOA->CRL &= ~(GPIO_CRL_MODE7);
GPIOA->CRL |= (GPIO_CRL_MODE5_0);
GPIOA->CRL |= (GPIO_CRL_MODE7_0);
8
//Alternate function push-pull
GPIOA->CRL &= ~(GPIO_CRL_CNF5);
GPIOA->CRL &= ~(GPIO_CRL_CNF7);
GPIOA->CRL |= (GPIO_CRL_CNF5_1);
GPIOA->CRL |= (GPIO_CRL_CNF7_1);
/* PA5-MISO */
//Mode input
GPIOA->CRL &= ~(GPIO_CRL_MODE6);
//Floating input
GPIOA->CRL &= ~(GPIO_CRL_CNF6);
GPIOA->CRL |= (GPIO_CRL_CNF6_0);
//Remap 0: PA5, PA6, PA7
AFIO->MAPR &= ~(1UL << 0);
//Enable SPI Clock
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
//Mode: Master
SPI1->CR1 |= SPI_CR1_MSTR;
//Baud rate to (8MHz / 2 = 4MHz)
SPI1->CR1 &= ~SPI_CR1_BR;
//MSB first
SPI1->CR1 &= ~(SPI_CR1_LSBFIRST);
//Full duplex (Transmit/Receive)
SPI1->CR1 &= ~(SPI_CR1_RXONLY);
//Data format 8-bit
SPI1->CR1 &= ~(SPI_CR1_DFF);
//Software Slave select
SPI1->CR1 |= SPI_CR1_SSI;
SPI1->CR1 |= SPI_CR1_SSM;
//SPI Enable
SPI1->CR1 |= SPI_CR1_SPE;
//Clear initial flags
(void)SPI1->SR;
/*Configure PA0 as output CS*/
GPIOA->CRL|=GPIO_CRL_MODE0;
GPIOA->CRL&=~(GPIO_CRL_CNF0);
}
void spi_transmit(uint8_t *data,uint32_t size)
{
uint32_t i=0;
while(i<size)
{
/*Wait for the TXE bit to set in the Status Register*/
/*This will indicate that the transmit buffer is empty*/
while (!((SPI1->SR)&(1<<1))) {};
/*Write the data to the Data Register*/
SPI1->DR = data[i];
i++;
}
/*Wait for the TXE bit to set in the Status Register*/
while (!((SPI1->SR)&(1<<1))) {};
/*Wait for the BSY bit to reset in the Status Register*/
9
while (((SPI1->SR)&(1<<7))) {};
/*Clear OVR flag*/
(void) SPI1->DR;
(void) SPI1->SR;
}
void cs_low()
{
GPIOA->BSRR=GPIO_BSRR_BR0;
}
void cs_high()
{
GPIOA->BSRR=GPIO_BSRR_BS0;
}
Este código se encarga de la inicialización y configuración de la interfaz SPI en un
microcontrolador STM32 de la serie F1, así como de funciones relacionadas con la
transmisión de datos a través de SPI y el control del pin de selección del esclavo (Chip
Select). A continuación, se detalla cada parte del código:
2.1. Función spi_init(void):
• Configuración de Pines GPIO (PA5, PA6, PA7): Se habilita el reloj para el puerto A
(RCC_APB2ENR_IOPAEN), y se configuran los pines PA5, PA6 y PA7 para la función
SPI (modo de salida, velocidad de 10MHz, y configuración en modo push-pull).
• Configuración de PA5-MISO: Se configura PA5 como entrada (MISO) y se establece
como entrada flotante.
• Remapeo de Pines (PA5, PA6, PA7): Se desactiva el remapeo de pines para PA5,
PA6 y PA7.
• Configuración de SPI1: Se habilita el reloj para el SPI1 (RCC_APB2ENR_SPI1EN),
se configura el SPI como maestro (SPI_CR1_MSTR), se ajusta la velocidad de
transmisión (SPI_CR1_BR), se configura la transmisión en formato de 8 bits, se
habilita el control manual del esclavo (SPI_CR1_SSM y SPI_CR1_SSI), y se habilita
la interfaz SPI (SPI_CR1_SPE).
• Configuración del Pin de Selección del Esclavo (CS): Se configura el pin PA0
como salida para el control del Chip Select.
2.2. Función spi_transmit(uint8_t *data, uint32_t size):
• Transmisión de Datos: Utiliza un bucle para transmitir cada byte de datos en el array
data a través del SPI1.
10
• Espera de la Bandera TXE (Transmit Buffer Empty): Espera hasta que el buffer de
transmisión esté vacío antes de enviar cada byte.
• Espera de la Bandera BSY (Busy): Espera a que el SPI termine la transmisión antes
de continuar.
• Limpieza de la Bandera OVR (Overrun): Se asegura de limpiar la bandera OVR.
2.3. Funciones cs_low() y cs_high():
• Control del Pin de Selección del Esclavo (CS): cs_low() coloca el pin de selección
del esclavo en bajo, indicando la selección del dispositivo, mientras que cs_high() lo
coloca en alto, indicando la deselección del dispositivo.
En resumen, este código configura la interfaz SPI como maestro en un microcontrolador
STM32 de la serie F1, inicializa los pines necesarios, y proporciona funciones para controlar
la transmisión de datos a través de SPI y el pin de selección del esclavo.
6. CUESTIONARIO
6.1. Dibujar un diagrama que muestre como puede configurarse un STM32F103C8T6 como
maestro solo para que reciba datos provenientes del esclavo.
7. Bibliografía
• https://www.digikey.com/es/articles/why-how-to-use-serial-peripheral-interface-
simplify-connections-between-multiple-
devices#:~:text=El%20SPI%20permite%20la%20comunicaci%C3%B3n,permite%20l
a%20comunicaci%C3%B3n%20entre%20microcontroladores.
11