- SPI STM32F103C8
- SPI tapas Arduino
- Nepieciešamās sastāvdaļas
- STM32 SPI apmācības shēmas shēma un savienojumi
- STM32 SPI programmēšana
- Master STM32 SPI programmēšanas skaidrojums
- Slave Arduino SPI programmēšanas skaidrojums
Iepriekšējās apmācībās mēs esam iemācījušies par SPI un I2C komunikāciju starp divām Arduino plāksnēm. Šajā apmācībā mēs aizstāsim vienu Arduino dēli ar Blue Pill dēli, kas ir STM32F103C8, un sazināsimies ar Arduino dēli, izmantojot SPI kopni. Šajā STM32 SPI piemērā mēs izmantosim Arduino UNO kā Slave un STM32F103C8 kā Master ar diviem 16X2 LCD displejiem, kas piestiprināti viens otram atsevišķi. Divi potenciometri ir savienoti arī ar STM32 (PA0) un Arduino (A0), lai, mainot potenciometru, noteiktu sūtīšanas vērtības (no 0 līdz 255) no kapteiņa līdz vergam un no verga uz galveno.
SPI STM32F103C8
Salīdzinot SPI autobusu Arduino un STM32F103C8 Blue Pill dēļā, STM32 ir 2 SPI autobusi, savukārt Arduino Uno ir viens SPI autobuss. Arduino Uno ir ATMEGA328 mikrokontrolleris, un STM32F103C8 ir ARM Cortex-M3, kas padara to ātrāku nekā Arudino Board.
Lai uzzinātu vairāk par SPI komunikāciju, skatiet mūsu iepriekšējos rakstus
- Kā izmantot SPI Arduino: saziņa starp diviem Arduino dēļiem
- SPI komunikācija ar PIC mikrokontrolleru PIC16F877A
- SPI komunikācija, izmantojot Bit Banging
- Aveņu Pi karstā ūdens tvertnes noplūdes detektors, izmantojot SPI moduļus
- ESP32 reālā laika pulkstenis, izmantojot moduli DS3231
STM32 SPI tapas STM32F103C8
SPI līnija | Piespraude STM32F103C8 |
MOSI1 | PA7 vai PB5 |
MISO1 | PA6 vai PB4 |
SCK1 | PA5 vai PB3 |
SS1 | PA4 vai PA15 |
SPI līnija2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI tapas Arduino
SPI līnija |
Piesprauž Arduino |
MOSI |
11 vai ICSP-4 |
MISO |
12 vai ICSP-1 |
SCK |
13 vai ICSP-3 |
SS |
10 |
Nepieciešamās sastāvdaļas
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10 k potenciometrs - 4
- Maizes dēlis
- Vadu savienošana
STM32 SPI apmācības shēmas shēma un savienojumi
Zemāk redzamajā tabulā ir parādīti kontakti, kas savienoti STM32 SPI saziņai ar Arduino.
SPI tapa |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Zemāk redzamajā tabulā ir parādīti divi LCD (16x2) savienotāji ar STM32F103C8 un Arduino atsevišķi.
LCD tapa |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Uz potenciometra centra PIN, lai iegūtu LCD kontrastu |
Uz potenciometra centra PIN, lai iegūtu LCD kontrastu |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
A |
+ 5V |
+ 5V |
K |
GND |
GND |
Svarīgs:
- Neaizmirstiet savienot Arduino GND un STM32F103C8 GND kopā.
STM32 SPI programmēšana
Programmēšana ir līdzīga Arduino kodam. Tas pats
Šajā STM32 SPI piemērā mēs izmantosim Arduino UNO kā Slave un STM32F103C8 kā Master ar diviem 16X2 LCD displejiem, kas piestiprināti viens otram atsevišķi. Divi potenciometri ir savienoti arī ar STM32 (PA0) un Arduino (A0), lai, mainot potenciometru, noteiktu sūtīšanas vērtības (no 0 līdz 255) no kapteiņa līdz vergam un no verga uz galveno.
Analogā ieeja tiek uzņemta pie STM32F10C8 tapas PA0 (no 0 līdz 3,3 V), pagriežot potenciometru. Tad šī ieejas vērtība tiek pārveidota par analogo uz digitālo vērtību (no 0 līdz 4096), un šī digitālā vērtība tiek tālāk kartēta uz (0 līdz 255), jo caur SPI komunikāciju mēs vienlaikus varam nosūtīt tikai 8 bitu (baitu) datus.
Līdzīgi vergu pusē, izmantojot potenciometru, mēs ņemam analogo ieejas vērtību pie Arduino tapas A0 no (0 līdz 5 V). Un atkal šī ieejas vērtība tiek pārveidota par analogo uz digitālo vērtību (0 līdz 1023), un šī digitālā vērtība tiek tālāk kartēta uz (0 līdz 255)
Šajā apmācībā ir divas programmas, viena - meistaram STM32, bet otra - vergam Arduino. Pilnīgas programmas abām pusēm ir norādītas šī projekta beigās ar demonstrācijas video.
Master STM32 SPI programmēšanas skaidrojums
1. Vispirms mums jāiekļauj SPI bibliotēka SPI sakaru funkciju izmantošanai un LCD bibliotēka LCD funkciju izmantošanai. Definējiet arī LCD tapas 16x2 LCD. Uzziniet vairāk par LCD saskarni ar STM32 šeit.
# iekļaut
2. Tukšajā iestatījumā ()
- Sāciet sērijveida saziņu ar Baud Rate 9600.
Sērijas sākums (9600);
- Pēc tam sāciet SPI komunikāciju
SPI.sākt ();
- Pēc tam SPI saziņai iestatiet sadalītāju Pulkstenis. Esmu uzstādījis dalītāju 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Pēc tam iestatiet SS tapu HIGH, jo mēs nesācām pārsūtīt uz vergu arduino.
digitalWrite (SS, HIGH);
3. Tukšā lokā ()
- Pirms jebkādas vērtības nosūtīšanas vergam, mums jāsamazina vergu atlases vērtība, lai sāktu pārsūtīšanu vergam no galvenā.
digitalWrite (SS, LOW);
- Pēc tam nolasiet analogo vērtību no galvenā STM32F10C8 POT, kas piestiprināts pie tapas PA0.
int pot = analogRead (PA0);
Pēc tam konvertējiet šo vērtību viena baita izteiksmē (no 0 līdz 255).
baits MasterSend = karte (pot, 0,4096,0,255);
- Šeit seko svarīgais solis. Šajā paziņojumā mēs konvertēto POT vērtību, kas saglabāta mainīgajā Mastersend, nosūtīt vergam Arduino, kā arī saņemt vērtību no vergu Arduino un glabāt to mastereceive mainīgajā.
Mastereceive = SPI.transfer (Mastersend);
- Pēc tam parādiet šīs vergu arduino saņemtās vērtības ar 500 mikrosekunžu kavēšanos un pēc tam nepārtraukti saņemiet un parādiet vērtības.
Serial.println ("Slave Arduino Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive aizkave) (500); digitalWrite (SS, HIGH);
Piezīme: Mēs izmantojam serial.println (), lai skatītu rezultātu Arduino IDE sērijveida motorā.
Slave Arduino SPI programmēšanas skaidrojums
1. Tas pats, kas meistaram, vispirms mums jāiekļauj SPI bibliotēka I2C sakaru funkciju izmantošanai un LCD bibliotēka LCD funkciju izmantošanai. Definējiet arī LCD tapas 16x2 LCD.
# iekļaut
2. Tukšajā iestatījumā ()
- Mēs sākam sērijveida saziņu ar Baud likmi 9600.
Sērijas sākums (9600);
- Zemāk esošajā paziņojumā MISO tiek iestatīts kā OUTPUT (jānosūta dati Master IN). Tātad dati tiek nosūtīti caur Slave Arduino MISO.
pinMode (MISO, OUTPUT);
- Tagad ieslēdziet SPI vergu režīmā, izmantojot SPI vadības reģistru
SPCR - = _BV (SPE);
- Pēc tam ieslēdziet pārtraukumu SPI saziņai. Ja tiek saņemti dati no kapteiņa, tiek izsaukta pakalpojuma pārtraukšanas kārtība un saņemtā vērtība tiek ņemta no SPDR (SPI datu reģistra)
SPI.attachInterrupt ();
- Vērtība no galvenā tiek ņemta no SPDR un saglabāta mainīgajā Slavereceived . Tas notiek sekojot Interrupt rutīnas funkcijai.
ISR (SPI_STC_vect) {Slavereceived = SPDR; saņemts = patiess; }
3. Nākamais tukšumā ()
- Izlasiet analogo vērtību no Slave Arduino POT, kas piestiprināts pie tapas A0.
int pot = analogRead (A0);
- Konvertējiet šo vērtību viena baita izteiksmē no 0 līdz 255.
Slavesend = karte (katls, 0,1023,0,255);
- Nākamais svarīgais solis ir konvertētās vērtības nosūtīšana uz Master STM32F10C8, tāpēc ievietojiet vērtību SPDR reģistrā. SPDR reģistrs tiek izmantots vērtību nosūtīšanai un saņemšanai.
SPDR = Slavesend;
- Pēc tam LCD ekrānā ar 500 mikrosekunžu aizturi parādiet saņemto vērtību ( SlaveReceive ) no Master STM32F103C8 un pēc tam nepārtraukti saņemiet un parādiet šo vērtību.
lcd.setCursor (0,0); lcd.print ("Vergs: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 vergam Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); kavēšanās (500);
Ar rotējošu potenciometrs vienā pusē, jūs varat redzēt dažādas vērtības LCD citā pusē:
Tātad šādi SPI komunikācija notiek STM32. Tagad jūs varat sasaistīt jebkuru SPI sensoru ar STM32 paneli.
Pilns Master STM32 un Slave Arduino kodējums ir sniegts zemāk ar demonstrācijas video