- SPI en STM32F103C8
- Pines SPI en Arduino
- Componentes requeridos
- Diagrama de circuito y conexiones para el tutorial STM32 SPI
- Programación STM32 SPI
- Explicación de la programación SPI del maestro STM32
- Explicación de la programación del esclavo Arduino SPI
En nuestros tutoriales anteriores, hemos aprendido sobre la comunicación SPI e I2C entre dos placas Arduino. En este tutorial reemplazaremos una placa Arduino con la placa Blue Pill que es STM32F103C8 y se comunicará con la placa Arduino utilizando el bus SPI. En este ejemplo de STM32 SPI, usaremos Arduino UNO como esclavo y STM32F103C8 como maestro con dos pantallas LCD de 16X2 conectadas entre sí por separado. También se conectan dos potenciómetros con STM32 (PA0) y Arduino (A0) para determinar los valores de envío (0 a 255) de maestro a esclavo y de esclavo a maestro variando el potenciómetro.
SPI en STM32F103C8
Comparando el bus SPI en Arduino y el tablero Blue Pill STM32F103C8, STM32 tiene 2 buses SPI mientras que Arduino Uno tiene un bus SPI. Arduino Uno tiene un microcontrolador ATMEGA328 y STM32F103C8 tiene ARM Cortex-M3, lo que lo hace más rápido que la placa Arudino.
Para obtener más información sobre la comunicación SPI, consulte nuestros artículos anteriores.
- Cómo usar SPI en Arduino: comunicación entre dos placas Arduino
- Comunicación SPI con el microcontrolador PIC PIC16F877A
- Comunicación SPI a través de Bit Banging
- Detector de fugas de tanque de agua caliente Raspberry Pi con módulos SPI
- Reloj en tiempo real ESP32 usando el módulo DS3231
Pines STM32 SPI STM32F103C8
SPI Line1 | Pin en STM32F103C8 |
MOSI1 | PA7 o PB5 |
MISO1 | PA6 o PB4 |
SCK1 | PA5 o PB3 |
SS1 | PA4 o PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Pines SPI en Arduino
Línea SPI |
Pin en Arduino |
MOSI |
11 o ICSP-4 |
MISO |
12 o ICSP-1 |
SCK |
13 o ICSP-3 |
SS |
10 |
Componentes requeridos
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Potenciómetro 10k - 4
- Tablero de circuitos
- Conexión de cables
Diagrama de circuito y conexiones para el tutorial STM32 SPI
La siguiente tabla muestra los pines conectados para la comunicación STM32 SPI con Arduino.
Pin SPI |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
La siguiente tabla muestra los pines conectados para dos LCD (16x2) con STM32F103C8 y Arduino por separado.
Pin LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Al PIN central del potenciómetro para el contraste de la pantalla LCD |
Al PIN central del potenciómetro para el contraste de la pantalla LCD |
RS |
PB0 |
2 |
RW |
GND |
GND |
mi |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
UN |
+ 5V |
+ 5V |
K |
GND |
GND |
Importante:
- No olvide conectar el Arduino GND y el STM32F103C8 GND juntos.
Programación STM32 SPI
La programación es similar al código Arduino. Lo mismo
En este ejemplo de STM32 SPI, usaremos Arduino UNO como esclavo y STM32F103C8 como maestro con dos pantallas LCD de 16X2 conectadas entre sí por separado. También se conectan dos potenciómetros con STM32 (PA0) y Arduino (A0) para determinar los valores de envío (0 a 255) de maestro a esclavo y de esclavo a maestro variando el potenciómetro.
La entrada analógica se toma en el pin PA0 del STM32F10C8 (0 a 3.3V) girando el potenciómetro. Luego, este valor de entrada se convierte en un valor analógico a digital (0 a 4096) y este valor digital se asigna más a (0 a 255) ya que solo podemos enviar datos de 8 bits (bytes) a través de la comunicación SPI a la vez.
De manera similar, en el lado esclavo, tomamos el valor de entrada analógica en el pin A0 de Arduino de (0 a 5V) usando un potenciómetro. Y nuevamente, este valor de entrada se convierte en valor analógico a digital (0 a 1023) y este valor digital se asigna además a (0 a 255)
Este tutorial tiene dos programas, uno para el maestro STM32 y otro para el esclavo Arduino. Los programas completos para ambos lados se dan al final de este proyecto con un video de demostración.
Explicación de la programación SPI del maestro STM32
1. En primer lugar, debemos incluir la biblioteca SPI para usar las funciones de comunicación SPI y la biblioteca LCD para usar las funciones LCD. También defina los pines LCD para LCD de 16x2. Obtenga más información sobre la interfaz de LCD con STM32 aquí.
#incluir
2. En configuración nula ()
- Inicie la comunicación serie a una velocidad de 9600 baudios.
Serial.begin (9600);
- Luego comience la comunicación SPI
SPI.begin ();
- Luego configure el divisor de reloj para la comunicación SPI. He puesto el divisor 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- A continuación, configure el pin SS en ALTO ya que no iniciamos ninguna transferencia al arduino esclavo.
escritura digital (SS, ALTA);
3. En bucle vacío ()
- Antes de enviar cualquier valor al esclavo, debemos BAJAR el valor de selección del esclavo para comenzar la transferencia al esclavo desde el maestro.
escritura digital (SS, BAJA);
- A continuación, lea el valor analógico del POT maestro STM32F10C8 conectado al pin PA0.
int pot = analogRead (PA0);
Luego convierta este valor en términos de un byte (0 a 255).
byte MasterSend = mapa (bote, 0,4096,0,255);
- Aquí viene el paso importante, en la siguiente declaración enviamos el valor POT convertido almacenado en la variable Mastersend al Arduino esclavo, y también recibimos el valor del Arduino esclavo y lo almacenamos en la variable mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- A continuación, muestre los valores recibidos del arduino esclavo con un retraso de 500 microsegundos y luego reciba y muestre continuamente los valores.
Serial.println ("Arduino esclavo al maestro STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive delay (500); escritura digital (SS, ALTA);
Nota: Usamos serial.println () para ver el resultado en Serial Motor of Arduino IDE.
Explicación de la programación del esclavo Arduino SPI
1. Al igual que el maestro, en primer lugar debemos incluir la biblioteca SPI para usar las funciones de comunicación I2C y la biblioteca LCD para usar las funciones LCD. También defina los pines LCD para LCD de 16x2.
#incluir
2. En configuración nula ()
- Comenzamos la comunicación en serie a una velocidad de 9600 baudios.
Serial.begin (9600);
- La siguiente declaración establece MISO como SALIDA (tiene que enviar datos a Master IN). Por lo tanto, los datos se envían a través de MISO de Slave Arduino.
pinMode (MISO, SALIDA);
- Ahora encienda SPI en modo esclavo usando el registro de control SPI
SPCR - = _BV (SPE);
- Luego encienda la interrupción para la comunicación SPI. Si se reciben datos del maestro, se llama a la rutina de servicio de interrupción y el valor recibido se toma de SPDR (registro de datos SPI)
SPI.attachInterrupt ();
- El valor del maestro se toma de SPDR y se almacena en la variable esclava recibida . Esto tiene lugar en la siguiente función de rutina de interrupción.
ISR (SPI_STC_vect) {Slavereceived = SPDR; recibido = verdadero; }
3. Siguiente en bucle vacío ()
- Lea el valor analógico del Slave Arduino POT adjunto al pin A0.
int pot = analogRead (A0);
- Convierta ese valor en términos de un byte de 0 a 255.
Slavesend = map (bote, 0,1023,0,255);
- El siguiente paso importante es enviar el valor convertido al maestro STM32F10C8, así que coloque el valor en el registro SPDR. El registro SPDR se utiliza para enviar y recibir valores.
SPDR = esclavo;
- Luego, muestre el valor recibido ( SlaveReceive ) del maestro STM32F103C8 en la pantalla LCD con un retraso de 500 microsegundos y luego reciba y muestre continuamente esos valores.
lcd.setCursor (0,0); lcd.print ("Esclavo: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Maestro STM32 a esclavo Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); retraso (500);
Al girar el potenciómetro a un lado, puede ver los valores variables en la pantalla LCD del otro lado:
Así es como se lleva a cabo la comunicación SPI en STM32. Ahora puede conectar cualquier sensor SPI con la placa STM32.
La codificación completa para Master STM32 y Slave Arduino se proporciona a continuación con un video de demostración