- SPI σε STM32F103C8
- Καρφίτσες SPI στο Arduino
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος και συνδέσεις για STM32 SPI Tutorial
- Προγραμματισμός STM32 SPI
- Εξήγηση προγραμματισμού Master STM32 SPI
- Επεξήγηση προγραμματισμού Slave Arduino SPI
Στα προηγούμενα μαθήματά μας, έχουμε μάθει για την επικοινωνία SPI και I2C μεταξύ δύο πινάκων Arduino. Σε αυτό το σεμινάριο θα αντικαταστήσουμε μια πλακέτα Arduino με την πλακέτα Blue Pill που είναι STM32F103C8 και θα επικοινωνήσουμε με την πλακέτα Arduino χρησιμοποιώντας δίαυλο SPI. Σε αυτό το παράδειγμα STM32 SPI, θα χρησιμοποιήσουμε το Arduino UNO ως Slave και το STM32F103C8 ως Master με δύο οθόνες LCD 16X2 συνδεδεμένες μεταξύ τους ξεχωριστά. Δύο ποτενσιόμετρα συνδέονται επίσης με STM32 (PA0) και Arduino (A0) για τον προσδιορισμό των τιμών αποστολής (0 έως 255) από master σε slave και slave σε master μεταβάλλοντας το ποτενσιόμετρο.
SPI σε STM32F103C8
Συγκρίνοντας το λεωφορείο SPI στο Arduino & το STM32F103C8 Blue Pill board, το STM32 έχει 2 SPI bus σε αυτό ενώ το Arduino Uno έχει ένα SPI bus. Το Arduino Uno διαθέτει μικροελεγκτή ATMEGA328 και το STM32F103C8 διαθέτει ARM Cortex-M3 που το καθιστά γρηγορότερο από το Arudino Board.
Για να μάθετε περισσότερα σχετικά με την επικοινωνία SPI, ανατρέξτε στα προηγούμενα άρθρα μας
- Πώς να χρησιμοποιήσετε το SPI στο Arduino: Επικοινωνία μεταξύ δύο πινάκων Arduino
- Επικοινωνία SPI με μικροελεγκτή PIC PIC16F877A
- Επικοινωνία SPI μέσω Bit Banging
- Ανιχνευτής διαρροής ζεστού νερού Raspberry Pi χρησιμοποιώντας μονάδες SPI
- Ρολόι σε πραγματικό χρόνο ESP32 χρησιμοποιώντας την ενότητα DS3231
STM32 SPI Καρφίτσες STM32F103C8
Γραμμή SPI1 | Καρφίτσωμα στο STM32F103C8 |
MOSI1 | PA7 ή PB5 |
MISO1 | PA6 ή PB4 |
SCK1 | PA5 ή PB3 |
SS1 | PA4 ή PA15 |
Γραμμή SPI2 | |
ΜΟΣΙ2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Καρφίτσες SPI στο Arduino
Γραμμή SPI |
Καρφιτσώστε στο Arduino |
MOSI |
11 ή ICSP-4 |
ΜΙΣΟ |
12 ή ICSP-1 |
SCK |
13 ή ICSP-3 |
SS |
10 |
Απαιτούμενα στοιχεία
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- Ποτενσιόμετρο 10k - 4
- Ψωμί
- Σύνδεση καλωδίων
Διάγραμμα κυκλώματος και συνδέσεις για STM32 SPI Tutorial
Ο παρακάτω πίνακας δείχνει τις καρφίτσες που συνδέονται για επικοινωνία STM32 SPI με το Arduino.
Καρφίτσα SPI |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
ΜΙΣΟ |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
ΡΑ4 |
10 |
Ο παρακάτω πίνακας δείχνει τις ακίδες που συνδέονται για δύο LCD (16x2) με STM32F103C8 και Arduino ξεχωριστά.
Καρφίτσα LCD |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Στο κέντρο ποτενσιόμετρου PIN για αντίθεση LCD |
Στο κέντρο ποτενσιόμετρου PIN για αντίθεση LCD |
RS |
PB0 |
2 |
RW |
GND |
GND |
μι |
PB1 |
3 |
Δ4 |
PB10 |
4 |
Δ5 |
PB11 |
5 |
Δ6 |
PC13 |
6 |
Δ7 |
PC14 |
7 |
ΕΝΑ |
+ 5V |
+ 5V |
κ |
GND |
GND |
Σπουδαίος:
- Μην ξεχάσετε να συνδέσετε το Arduino GND και το STM32F103C8 GND.
Προγραμματισμός STM32 SPI
Ο προγραμματισμός είναι παρόμοιος με τον κωδικό Arduino. Το ίδιο
Σε αυτό το παράδειγμα STM32 SPI, θα χρησιμοποιήσουμε το Arduino UNO ως Slave και το STM32F103C8 ως Master με δύο οθόνες LCD 16X2 συνδεδεμένες μεταξύ τους ξεχωριστά. Δύο ποτενσιόμετρα συνδέονται επίσης με STM32 (PA0) και Arduino (A0) για τον προσδιορισμό των τιμών αποστολής (0 έως 255) από master σε slave και slave σε master μεταβάλλοντας το ποτενσιόμετρο.
Η αναλογική είσοδος λαμβάνεται στο STM32F10C8 pin PA0 (0 έως 3.3V) περιστρέφοντας το ποτενσιόμετρο. Στη συνέχεια, αυτή η τιμή εισαγωγής μετατρέπεται σε τιμή Αναλογικής σε Ψηφιακή (0 έως 4096) και αυτή η ψηφιακή τιμή αντιστοιχίζεται περαιτέρω σε (0 έως 255) καθώς μπορούμε να στείλουμε μόνο 8-bit (byte) δεδομένα μέσω της επικοινωνίας SPI ταυτόχρονα.
Ομοίως, στην πλευρά Slave παίρνουμε αναλογική τιμή εισόδου στο Arduino pin A0 από (0 έως 5V) χρησιμοποιώντας ποτενσιόμετρο. Και πάλι, αυτή η τιμή εισαγωγής μετατρέπεται σε αναλογική σε ψηφιακή τιμή (0 έως 1023) και αυτή η ψηφιακή τιμή αντιστοιχίζεται περαιτέρω σε (0 έως 255)
Αυτό το σεμινάριο έχει δύο προγράμματα ένα για το master STM32 και άλλο για το slave Arduino. Πλήρη προγράμματα και για τις δύο πλευρές δίνονται στο τέλος αυτού του έργου με ένα βίντεο επίδειξης.
Εξήγηση προγραμματισμού Master STM32 SPI
1. Πρώτα απ 'όλα πρέπει να συμπεριλάβουμε τη βιβλιοθήκη SPI για τη χρήση λειτουργιών επικοινωνίας SPI και τη βιβλιοθήκη LCD για τη χρήση λειτουργιών LCD. Ορίστε επίσης καρφίτσες LCD για LCD 16x2. Μάθετε περισσότερα σχετικά με τη διασύνδεση LCD με STM32 εδώ.
#περιλαμβάνω
2. Σε άκυρη ρύθμιση ()
- Ξεκινήστε τη σειριακή επικοινωνία στο Baud Rate 9600.
Serial.begin (9600);
- Στη συνέχεια ξεκινήστε την επικοινωνία SPI
SPI.begin ();
- Στη συνέχεια, ορίστε το διαχωριστικό ρολογιού για επικοινωνία SPI. Έχω ρυθμίσει το διαχωριστικό 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Στη συνέχεια, ορίστε την καρφίτσα SS ΥΨΗΛΗ αφού δεν ξεκινήσαμε καμία μεταφορά στο slave arduino.
digitalWrite (SS, ΥΨΗΛΟΣ);
3. Σε κενό βρόχο ()
- Πριν από την αποστολή οποιασδήποτε τιμής στο slave, πρέπει να χαμηλώσουμε την τιμή select slave για να ξεκινήσουμε τη μεταφορά στο slave από το master.
digitalWrite (SS, LOW);
- Στη συνέχεια, διαβάστε την αναλογική τιμή από το κύριο STM32F10C8 POT που είναι προσαρτημένο στον ακροδέκτη PA0.
int pot = analogRead (PA0);
Στη συνέχεια, μετατρέψτε αυτήν την τιμή σε όρους ενός byte (0 έως 255).
byte MasterSend = χάρτης (ποτ, 0,4096,0,255);
- Εδώ έρχεται το σημαντικό βήμα, στην ακόλουθη δήλωση στέλνουμε τη μετατρεπόμενη τιμή POT που είναι αποθηκευμένη στη μεταβλητή Mastersend στο slave Arduino και λαμβάνουμε επίσης τιμή από το slave Arduino και την αποθηκεύουμε σε μεταβλητή mastereceive .
Mastereceive = SPI. Μεταφορά (Mastersend);
- Στη συνέχεια, εμφανίστε εκείνες τις ληφθείσες τιμές από το slave arduino με καθυστέρηση 500 μικροδευτερόλεπτα και στη συνέχεια λάβετε συνεχώς και εμφανίστε τις τιμές.
Serial.println ("Slave Arduino to Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive καθυστέρηση (500); digitalWrite (SS, HIGH);
Σημείωση: Χρησιμοποιούμε το serial.println () για να δούμε το αποτέλεσμα στο Serial Motor του Arduino IDE.
Επεξήγηση προγραμματισμού Slave Arduino SPI
1. Ίδιο με το κύριο, πρώτα απ 'όλα πρέπει να συμπεριλάβουμε τη βιβλιοθήκη SPI για τη χρήση λειτουργιών επικοινωνίας I2C και τη βιβλιοθήκη LCD για τη χρήση λειτουργιών LCD. Ορίστε επίσης καρφίτσες LCD για LCD 16x2.
#περιλαμβάνω
2. Σε άκυρη ρύθμιση ()
- Ξεκινάμε τη σειριακή επικοινωνία στο Baud Rate 9600.
Serial.begin (9600);
- Η παρακάτω δήλωση ορίζει το MISO ως OUTPUT (Πρέπει να στείλετε δεδομένα στο Master IN). Έτσι, τα δεδομένα αποστέλλονται μέσω MISO του Slave Arduino.
pinMode (MISO, OUTPUT);
- Τώρα ενεργοποιήστε το SPI σε Slave Mode χρησιμοποιώντας το SPI Control Register
SPCR - = _BV (SPE);
- Στη συνέχεια, ενεργοποιήστε τη διακοπή για επικοινωνία SPI. Εάν ληφθούν δεδομένα από τον κύριο, καλείται η ρουτίνα διακοπής υπηρεσίας και η ληφθείσα τιμή λαμβάνεται από το SPDR (SPI data Register)
SPI.attachInterrupt ();
- Η τιμή από το κύριο λαμβάνεται από το SPDR και αποθηκεύεται στη μεταβλητή Slavereceived . Αυτό συμβαίνει μετά από τη λειτουργία Interrupt Routine.
ISR (SPI_STC_vect) {Slavereceived = SPDR; ελήφθη = αλήθεια; }
3. Επόμενο σε κενό βρόχο ()
- Διαβάστε την αναλογική τιμή από το Slave Arduino POT που είναι προσαρτημένο στον ακροδέκτη A0.
int pot = analogRead (A0);
- Μετατρέψτε αυτήν την τιμή σε όρους ενός byte από 0 έως 255.
Slavesend = χάρτης (pot, 0,1023,0,255);
- Το επόμενο σημαντικό βήμα είναι να στείλετε την τιμή μετατροπής στο Master STM32F10C8, οπότε τοποθετήστε την τιμή στον καταχωρητή SPDR. Ο καταχωρητής SPDR χρησιμοποιείται για την αποστολή και τη λήψη τιμών.
SPDR = Slavesend;
- Στη συνέχεια, εμφανίστε την ληφθείσα τιμή ( SlaveReceive ) από το Master STM32F103C8 σε οθόνη LCD με καθυστέρηση 500 μικροδευτερολέπτων και, στη συνέχεια, λάβετε και εμφανίστε συνεχώς αυτήν την τιμή.
lcd.setCursor (0,0); lcd.print ("Slave: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 to Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); καθυστέρηση (500)
Με την περιστροφή του ποτενσιόμετρου σε μία πλευρά, μπορείτε να δείτε τις διαφορετικές τιμές στην οθόνη LCD στην άλλη πλευρά:
Έτσι λοιπόν λαμβάνει χώρα η επικοινωνία SPI στο STM32. Τώρα μπορείτε να συνδέσετε οποιονδήποτε αισθητήρα SPI με την πλακέτα STM32.
Η πλήρης κωδικοποίηση για Master STM32 και Slave Arduino δίνεται παρακάτω με ένα βίντεο επίδειξης