- SPI mallissa STM32F103C8
- SPI-nastat Arduinossa
- Tarvittavat komponentit
- Piirikaavio ja liitännät STM32 SPI -oppaaseen
- STM32 SPI -ohjelmointi
- Master STM32 SPI -ohjelmoinnin selitys
- Slave Arduino SPI -ohjelmoinnin selitys
Aikaisemmissa opetusohjelmissamme olemme oppineet SPI- ja I2C-viestinnästä kahden Arduino-levyn välillä. Tässä opetusohjelmassa vaihdamme yhden Arduino-kortin Blue Pill -levyyn, joka on STM32F103C8, ja kommunikoimme Arduino-kortin kanssa SPI-väylää käyttäen. Tässä STM32 SPI -esimerkissä käytämme Arduino UNO: ta orjana ja STM32F103C8: ta isäntänä kahdella 16X2 LCD-näytöllä, jotka on kiinnitetty toisiinsa erikseen. Kaksi potentiometriä on myös kytketty STM32: een (PA0) ja Arduinoon (A0), jotta lähetysarvot (0-255) määritetään isännältä orjalle ja orja isännälle vaihtelemalla potentiometriä.
SPI mallissa STM32F103C8
Kun verrataan SPD-väylää Arduinossa ja STM32F103C8 Blue Pill -taulussa, STM32: ssa on 2 SPI-väylää, kun taas Arduino Unossa on yksi SPI-väylä. Arduino Unossa on ATMEGA328-mikrokontrolleri ja STM32F103C8: ssa ARM Cortex-M3, mikä tekee siitä nopeamman kuin Arudino Board.
Lisätietoja SPI-viestinnästä on aiemmissa artikkeleissamme
- SPI: n käyttö Arduinossa: Kahden Arduino-levyn välinen viestintä
- SPI-tiedonsiirto PIC-mikrokontrollerin PIC16F877A kanssa
- SPI-tiedonsiirto Bit Bangingin kautta
- Vadelma Pi -vesisäiliön vuotoilmaisin SPI-moduuleilla
- ESP32-reaaliaikainen kello DS3231-moduulin avulla
STM32 SPI -nastat STM32F103C8
SPI-linja 1 | Tappi STM32F103C8 |
MOSI1 | PA7 tai PB5 |
MISO1 | PA6 tai PB4 |
SCK1 | PA5 tai PB3 |
SS1 | PA4 tai PA15 |
SPI-linja 2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI-nastat Arduinossa
SPI-linja |
Kiinnitä Arduinoon |
MOSI |
11 tai ICSP-4 |
MISO |
12 tai ICSP-1 |
SCK |
13 tai ICSP-3 |
SS |
10 |
Tarvittavat komponentit
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k potentiometri - 4
- Leipälauta
- Johtojen liittäminen
Piirikaavio ja liitännät STM32 SPI -oppaaseen
Alla olevassa taulukossa näkyvät STM32 SPI -yhteyttä varten liitetyt nastat Arduinon kanssa.
SPI-tappi |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Alla olevassa taulukossa näkyvät kaksi LCD-näyttöä (16x2) varten liitetyt nastat erikseen STM32F103C8: n ja Arduinon kanssa.
LCD-tappi |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5 V |
+ 5 V |
V0 |
Potentiometrin keskikoodiin LCD-kontrastia varten |
Potentiometrin keskikoodiin LCD-kontrastia varten |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
A |
+ 5 V |
+ 5 V |
K |
GND |
GND |
Tärkeä:
- Älä unohda liittää Arduino GND ja STM32F103C8 GND toisiinsa.
STM32 SPI -ohjelmointi
Ohjelmointi on samanlainen kuin Arduino-koodi. Sama
Tässä STM32 SPI -esimerkissä käytämme Arduino UNO: ta orjana ja STM32F103C8: ta isäntänä kahdella 16X2 LCD-näytöllä, jotka on kiinnitetty toisiinsa erikseen. Kaksi potentiometriä on myös kytketty STM32: een (PA0) ja Arduinoon (A0), jotta lähetysarvot (0-255) määritetään isännältä orjalle ja orja isännälle vaihtelemalla potentiometriä.
Analogiatulo otetaan STM32F10C8-nastalla PA0 (0-3,3 V) kiertämällä potentiometriä. Sitten tämä tuloarvo muunnetaan analogiseksi digitaaliseksi arvoksi (0 - 4096) ja tämä digitaalinen arvo kartoitetaan edelleen (0 - 255): ksi, koska voimme lähettää vain 8-bittistä (tavua) dataa SPI-tiedonsiirron kautta kerralla.
Samoin orjapuolella otamme analogisen tulon arvon Arduino-nastassa A0 (0-5 V) potentiometrillä. Ja jälleen tämä tuloarvo muunnetaan analogiseksi digitaaliseksi arvoksi (0-1023) ja tämä digitaaliarvo kartoitetaan edelleen (0-255)
Tässä opetusohjelmassa on kaksi ohjelmaa, yksi master-STM32: lle ja toinen orja Arduinolle. Molempien osapuolten täydelliset ohjelmat annetaan tämän projektin lopussa esittelyvideolla.
Master STM32 SPI -ohjelmoinnin selitys
1. Ensinnäkin meidän on sisällytettävä SPI-kirjasto SPI-viestintätoimintojen käyttämiseen ja LCD-kirjasto LCD-toimintojen käyttöön. Määritä myös LCD-nastat 16x2 LCD: lle. Lisätietoja LCD-näytön ja STM32: n liitännästä on täällä.
#sisältää
2. Tyhjässä asennuksessa ()
- Aloita sarjaliikenne nopeudella 9600.
Sarjan alku (9600);
- Seuraavaksi aloita SPI-viestintä
SPI alkaa ();
- Aseta sitten kellonjakaja SPI-viestintää varten. Olen asettanut jakajan 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Aseta seuraavaksi SS-nasta KORKEA, koska emme aloittaneet mitään siirtoa orja-arduinoon.
digitalWrite (SS, HIGH);
3. Tyhjässä silmukassa ()
- Ennen arvon lähettämistä orjalle meidän on alitettava orjan valintaarvo aloittaaksesi siirron orjalle isännältä.
digitalWrite (SS, LOW);
- Lue seuraavaksi analoginen arvo mastosta STM32F10C8 POT, joka on kiinnitetty tapiin PA0.
int pot = analoginen luku (PA0);
Muunna sitten tämä arvo yhden tavun muodossa (0 - 255).
tavu MasterSend = kartta (potti, 0,4096,0255);
- Tässä tulee tärkeä vaihe, seuraavassa lauseessa lähetämme muunnetun POT-arvon, joka on tallennettu Mastersend- muuttujaan orja Arduinolle, ja myös saamme arvon orja Arduinolta ja tallennamme sen mastereceive- muuttujaan.
Mastereceive = SPI.siirto (Mastersend);
- Seuraavaksi näytetään orja-arduinolta vastaanotetut arvot 500 mikrosekunnin viiveellä ja vastaanotetaan ja näytetään sitten arvot jatkuvasti.
Serial.println ("Orja Arduino päällikölle STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive-viive) (500); digitalWrite (SS, HIGH);
Huomaa: Käytämme sarjaa.println () tarkastellaksesi tulosta Arduino IDE : n sarjamoottorissa.
Slave Arduino SPI -ohjelmoinnin selitys
1. Sama kuin master, ensinnäkin meidän on sisällytettävä SPI-kirjasto I2C-viestintätoimintojen käyttämiseen ja LCD-kirjasto LCD-toimintojen käyttöön. Määritä myös LCD-nastat 16x2 LCD: lle.
#sisältää
2. Tyhjässä asennuksessa ()
- Aloitamme sarjaliikenteen tiedonsiirtonopeudella 9600.
Sarjan alku (9600);
- Alla olevassa lauseessa MISO asetetaan LÄHTÖksi (täytyy lähettää tietoja Master IN: lle). Joten tiedot lähetetään MISO: n kautta Slave Arduinosta.
pinMode (MISO, OUTPUT);
- Kytke nyt SPI päälle orjatilassa SPI Control Register -sovelluksella
SPCR - = _BV (SPE);
- Kytke sitten keskeytys päälle SPI-tiedonsiirtoa varten. Jos tietoja vastaanotetaan päälliköltä, soitetaan keskeytyspalvelurutiini ja vastaanotettu arvo otetaan SPDR-tietorekisteristä (SPI data Register)
SPI.attachInterrupt ();
- Master-arvo otetaan SPDR: ltä ja tallennetaan Slavereceived- muuttujaan. Tämä tapahtuu seuraavassa keskeytysrutiinitoiminnossa.
ISR (SPI_STC_vect) {Slavereceived = SPDR; vastaanotettu = tosi; }
3. Seuraava tyhjässä silmukassa ()
- Lue analoginen arvo Slave Arduino POT: sta, joka on kiinnitetty tapaan A0.
int pot = analoginen luku (A0);
- Muunna tämä arvo yhden tavun arvona 0: sta 255: een.
Slavesend = kartta (potti, 0,1023,0,255);
- Seuraava tärkeä vaihe on lähettää muunnettu arvo Master STM32F10C8: lle, joten sijoita arvo SPDR-rekisteriin. SPDR-rekisteriä käytetään arvojen lähettämiseen ja vastaanottamiseen.
SPDR = Slavesend;
- Näytä sitten vastaanotettu arvo ( SlaveReceive ) Master STM32F103C8: lta LCD-näytöllä 500 mikrosekunnin viiveellä ja vastaanota ja näytä sitten kyseinen arvo jatkuvasti.
lcd.setCursor (0,0); lcd.print ("Orja: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 orja Arduinolle"); Serial.println (orja vastaanotettu); lcd.print (SlaveReceived); viive (500);
By pyörittämällä Potentiometri toiselle puolelle, näet vaihtelevat arvot LCD toisella puolella:
Joten näin SPI-viestintä tapahtuu STM32: ssä. Nyt voit liittää minkä tahansa SPI-anturin STM32-korttiin.
Master STM32: n ja Slave Arduinon täydellinen koodaus on esitetty alla esittelyvideolla