- SPI dans STM32F103C8
- Broches SPI dans Arduino
- Composants requis
- Schéma de circuit et connexions pour le didacticiel SPI STM32
- Programmation SPI STM32
- Explication de la programmation du maître STM32 SPI
- Explication de la programmation de l'esclave Arduino SPI
Dans nos tutoriels précédents, nous avons appris la communication SPI et I2C entre deux cartes Arduino. Dans ce tutoriel, nous remplacerons une carte Arduino par la carte Blue Pill qui est STM32F103C8 et communiquerons avec la carte Arduino en utilisant le bus SPI. Dans cet exemple SPI STM32, nous utiliserons Arduino UNO comme esclave et STM32F103C8 comme maître avec deux écrans LCD 16X2 reliés l'un à l'autre séparément. Deux potentiomètres sont également connectés avec STM32 (PA0) et Arduino (A0) pour déterminer les valeurs d'envoi (0 à 255) du maître à l'esclave et de l'esclave au maître en faisant varier le potentiomètre.
SPI dans STM32F103C8
En comparant le bus SPI dans Arduino et la carte Blue Pill STM32F103C8, STM32 contient 2 bus SPI tandis qu'Arduino Uno a un bus SPI. Arduino Uno a un microcontrôleur ATMEGA328, et STM32F103C8 a ARM Cortex-M3, ce qui le rend plus rapide que la carte Arudino.
Pour en savoir plus sur la communication SPI, reportez-vous à nos articles précédents
- Comment utiliser SPI dans Arduino: Communication entre deux cartes Arduino
- Communication SPI avec le microcontrôleur PIC PIC16F877A
- Communication SPI via Bit Banging
- Détecteur de fuite de réservoir d'eau chaude Raspberry Pi utilisant des modules SPI
- Horloge temps réel ESP32 utilisant le module DS3231
Broches SPI STM32 STM32F103C8
Ligne SPI1 | Broche dans STM32F103C8 |
MOSI1 | PA7 ou PB5 |
MISO1 | PA6 ou PB4 |
SCK1 | PA5 ou PB3 |
SS1 | PA4 ou PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Broches SPI dans Arduino
Ligne SPI |
Broche dans Arduino |
MOSI |
11 ou ICSP-4 |
MISO |
12 ou ICSP-1 |
SCK |
13 ou ICSP-3 |
SS |
dix |
Composants requis
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Potentiomètre 10k - 4
- Planche à pain
- Connexion des fils
Schéma de circuit et connexions pour le didacticiel SPI STM32
Le tableau ci-dessous montre les broches connectées pour la communication STM32 SPI avec Arduino.
Broche SPI |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
dix |
Le tableau ci-dessous montre les broches connectées pour deux LCD (16x2) avec STM32F103C8 et Arduino séparément.
Broche LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Vers le PIN central du potentiomètre pour le contraste de l'écran LCD |
Vers le PIN central du potentiomètre pour le contraste de l'écran LCD |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
sept |
UNE |
+ 5V |
+ 5V |
K |
GND |
GND |
Important:
- N'oubliez pas de connecter l'Arduino GND et le STM32F103C8 GND ensemble.
Programmation SPI STM32
La programmation est similaire au code Arduino. Le même
Dans cet exemple SPI STM32, nous utiliserons Arduino UNO comme esclave et STM32F103C8 comme maître avec deux écrans LCD 16X2 reliés l'un à l'autre séparément. Deux potentiomètres sont également connectés avec STM32 (PA0) et Arduino (A0) pour déterminer les valeurs d'envoi (0 à 255) du maître à l'esclave et de l'esclave au maître en faisant varier le potentiomètre.
L'entrée analogique est prise à la broche PA0 du STM32F10C8 (0 à 3,3 V) en tournant le potentiomètre. Ensuite, cette valeur d'entrée est convertie en valeur analogique vers numérique (0 à 4096) et cette valeur numérique est encore mappée à (0 à 255) car nous ne pouvons envoyer que des données 8 bits (octets) via la communication SPI à la fois.
De même, côté esclave, nous prenons la valeur d'entrée analogique à la broche Arduino A0 de (0 à 5 V) en utilisant un potentiomètre. Et à nouveau, cette valeur d'entrée est convertie en valeur analogique en numérique (0 à 1023) et cette valeur numérique est encore mappée à (0 à 255)
Ce tutoriel a deux programmes un pour le maître STM32 et un autre pour l'esclave Arduino. Des programmes complets pour les deux côtés sont donnés à la fin de ce projet avec une vidéo de démonstration.
Explication de la programmation du maître STM32 SPI
1. Tout d'abord, nous devons inclure la bibliothèque SPI pour l'utilisation des fonctions de communication SPI et la bibliothèque LCD pour l'utilisation des fonctions LCD. Définissez également les broches LCD pour 16x2 LCD. En savoir plus sur l'interface LCD avec STM32 ici.
#comprendre
2. Dans void setup ()
- Démarrez la communication série à la vitesse de transmission 9600.
Serial.begin (9600);
- Ensuite, commencez la communication SPI
SPI.begin ();
- Réglez ensuite le diviseur d'horloge pour la communication SPI. J'ai réglé le diviseur 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Ensuite, définissez la broche SS HIGH car nous n'avons commencé aucun transfert vers l'arduino esclave.
DigitalWrite (SS, HIGH);
3. Dans une boucle vide ()
- Avant d'envoyer une valeur à l'esclave, nous devons BASSE la valeur de sélection d'esclave pour commencer le transfert vers l'esclave depuis le maître.
DigitalWrite (SS, LOW);
- Lisez ensuite la valeur analogique du POT maître STM32F10C8 attaché à la broche PA0.
int pot = analogRead (PA0);
Puis convertissez cette valeur en termes d'un octet (0 à 255).
byte MasterSend = carte (pot, 0,4096,0,255);
- Voici l'étape importante, dans la déclaration suivante, nous envoyons la valeur POT convertie stockée dans la variable Mastersend à l'esclave Arduino, et recevons également la valeur de l'esclave Arduino et stockons cela dans la variable mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Ensuite, affichez les valeurs reçues de l'arduino esclave avec un retard de 500 microsecondes, puis recevez et affichez en continu les valeurs.
Serial.println ("Esclave Arduino vers Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive delay (500); DigitalWrite (SS, HIGH);
Remarque: Nous utilisons serial.println () pour afficher le résultat dans Serial Motor of Arduino IDE.
Explication de la programmation de l'esclave Arduino SPI
1. Identique au maître, nous devons tout d'abord inclure la bibliothèque SPI pour l'utilisation des fonctions de communication I2C et la bibliothèque LCD pour l'utilisation des fonctions LCD. Définissez également les broches LCD pour 16x2 LCD.
#comprendre
2. Dans void setup ()
- Nous commençons la communication série au débit en bauds de 9600.
Serial.begin (9600);
- L'instruction ci-dessous définit MISO comme OUTPUT (doivent envoyer des données à Master IN).Les données sont donc envoyées via MISO de Slave Arduino.
pinMode (MISO, SORTIE);
- Activez maintenant SPI en mode esclave à l'aide du registre de contrôle SPI
SPCR - = _BV (SPE);
- Activez ensuite l'interruption pour la communication SPI. Si une donnée est reçue du maître, la routine de service d'interruption est appelée et la valeur reçue est extraite du SPDR (registre de données SPI)
SPI.attachInterrupt ();
- La valeur du maître est extraite de SPDR et stockée dans la variable Slavereceived . Cela a lieu dans la fonction de routine d'interruption suivante.
ISR (SPI_STC_vect) {Slavereceived = SPDR; reçu = vrai; }
3. Suivant dans la boucle vide ()
- Lisez la valeur analogique du POT Arduino esclave attaché à la broche A0.
int pot = analogRead (A0);
- Convertissez cette valeur en termes d'un octet de 0 à 255.
Slavesend = carte (pot, 0,1023,0,255);
- La prochaine étape importante consiste à envoyer la valeur convertie au maître STM32F10C8, alors placez la valeur dans le registre SPDR. Le registre SPDR est utilisé pour envoyer et recevoir des valeurs.
SPDR = Slavesend;
- Affichez ensuite la valeur reçue ( SlaveReceive ) du maître STM32F103C8 sur l'écran LCD avec un retard de 500 microsecondes, puis recevez et affichez en continu ces valeurs.
lcd.setCursor (0,0); lcd.print ("Esclave: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 to Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); retard (500);
En tournant le potentiomètre d'un côté, vous pouvez voir les valeurs variables sur l'écran LCD d'un autre côté:
Voici donc comment la communication SPI se déroule dans STM32. Vous pouvez désormais interfacer n'importe quel capteur SPI avec la carte STM32.
Le codage complet pour Master STM32 et Slave Arduino est donné ci-dessous avec une vidéo de démonstration