- SPI az STM32F103C8-ban
- SPI csapok Arduino-ban
- Szükséges alkatrészek
- Áramkör és kapcsolatok az STM32 SPI bemutatóhoz
- STM32 SPI programozás
- Az STM32 SPI programozási magyarázat
- Slave Arduino SPI programozási magyarázat
Korábbi oktatóanyagainkban megismerkedtünk két Arduino tábla közötti SPI és I2C kommunikációval. Ebben az oktatóanyagban egy Arduino kártyát lecserélünk a Blue Pill táblára, amely STM32F103C8, és SPI buszon keresztül kommunikálunk az Arduino táblával. Ebben az STM32 SPI példában az Arduino UNO-t Slave-ként, az STM32F103C8-t pedig Master-ként fogjuk használni, két külön 16X2 LCD-kijelzővel, amelyek egymáshoz vannak csatlakoztatva. Két potenciométer is csatlakozik az STM32-hez (PA0) és az Arduino-hoz (A0), hogy meghatározzák a küldési értékeket (0–255) masterről slave-re és slave to masterre a potenciométer változtatásával.
SPI az STM32F103C8-ban
Az Arduino SPI buszát és az STM32F103C8 Blue Pill táblát összehasonlítva az STM32-ben 2 SPI busz található, míg az Arduino Uno-ban egy SPI busz található. Az Arduino Uno rendelkezik ATMEGA328 mikrokontrollerrel, az STM32F103C8 pedig ARM Cortex-M3-mal, ami gyorsabbá teszi, mint az Arudino Board.
Ha többet szeretne megtudni az SPI kommunikációról, olvassa el korábbi cikkeinket
- Az SPI használata Arduino-ban: Kommunikáció két Arduino tábla között
- SPI kommunikáció a PIC16F877A PIC mikrovezérlővel
- SPI kommunikáció Bit Banging segítségével
- Raspberry Pi melegvíztartály szivárgásérzékelő SPI modulokkal
- ESP32 valós idejű óra a DS3231 modul használatával
STM32 SPI csapok STM32F103C8
SPI vonal1 | Tű az STM32F103C8-ba |
MOSI1 | PA7 vagy PB5 |
MISO1 | PA6 vagy PB4 |
SCK1 | PA5 vagy PB3 |
SS1 | PA4 vagy PA15 |
SPI vonal2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI csapok Arduino-ban
SPI vonal |
Tűzd be az Arduino-t |
MOSI |
Vagy az ICSP-4 |
MISO |
Vagy az ICSP-1 |
SCK |
Vagy az ICSP-3 |
SS |
10. |
Szükséges alkatrészek
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k potenciométer - 4
- Kenyérlemez
- Vezetékek csatlakoztatása
Áramkör és kapcsolatok az STM32 SPI bemutatóhoz
Az alábbi táblázat bemutatja az Arduinóval folytatott STM32 SPI kommunikációhoz csatlakoztatott csapokat.
SPI Pin |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11. |
MISO |
PA6 |
12. |
SCK |
PA5 |
13. |
SS1 |
PA4 |
10. |
Az alábbi táblázat külön mutatja a két LCD (16x2), az STM32F103C8 és az Arduino számára csatlakoztatott érintkezőket.
LCD tű |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
A potenciométer középső PIN-kódjához az LCD kontraszthoz |
A potenciométer középső PIN-kódjához az LCD kontraszthoz |
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 |
Fontos:
- Ne felejtse el összekapcsolni az Arduino GND és az STM32F103C8 GND készülékeket.
STM32 SPI programozás
A programozás hasonló az Arduino kódhoz. Ugyanaz
Ebben az STM32 SPI példában az Arduino UNO-t Slave-ként, az STM32F103C8-t pedig Master-ként fogjuk használni, két külön 16X2 LCD-kijelzővel, amelyek egymáshoz vannak csatlakoztatva. Két potenciométer is csatlakozik az STM32-hez (PA0) és az Arduino-hoz (A0), hogy meghatározzák a küldési értékeket (0–255) masterről slave-re és slave to masterre a potenciométer változtatásával.
Az analóg bemenet az STM32F10C8 PA0-tűn (0-3,3 V) történik a potenciométer forgatásával. Ezután ezt a bemeneti értéket analógból digitális értékre (0–4096) alakítja át, és ezt a digitális értéket tovább térképezi fel (0–255), mivel egyszerre csak 8 bites (bájtos) adatokat küldhetünk SPI kommunikáción keresztül.
Hasonlóképpen, a Slave oldalon, az Arduino A0 tűnél analóg bemeneti értéket veszünk (0 és 5 V) között potenciométerrel. Ezt a bemeneti értéket ismét analóg-digitális értékre konvertáljuk (0-tól 1023-ig), és ezt a digitális értéket tovább térképezzük (0-tól 255-ig).
Ez az oktatóprogram két programmal rendelkezik, az egyik az STM32 mesterhez, a másik pedig a rabszolga Arduino számára. A teljes programokat mindkét fél számára a projekt végén egy bemutató videó tartalmazza.
Az STM32 SPI programozási magyarázat
1. Először is be kell illesztenünk az SPI könyvtárat az SPI kommunikációs funkciók használatához és az LCD könyvtárat az LCD funkciók használatához. Határozzon meg LCD érintkezőket a 16x2 LCD-hez is. Itt többet tudhat meg az LCD és az STM32 összekapcsolásáról.
#include
2. Üres beállításban ()
- Indítsa el a soros kommunikációt 9600 sebességgel.
Serial.begin (9600);
- Ezután kezdje meg az SPI kommunikációt
SPI.begin ();
- Ezután állítsa be az Óra elválasztót az SPI kommunikációhoz. Beállítottam a 16. elválasztót.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Ezután állítsa HIGH-ra az SS-tűt, mivel nem indítottunk el semmilyen átvitelt a slave arduino-ra.
digitalWrite (SS, HIGH);
3. Üres hurokban ()
- Mielőtt bármilyen értéket elküldenénk a szolga számára, LOW-t kell adnunk a slave kiválasztási értékéről, hogy megkezdjük a master-től a slave-be történő átvitelet.
digitalWrite (SS, LOW);
- Ezután olvassa el az analóg értéket a PA0 érintkezőhöz rögzített STM32F10C8 POT masterről.
int pot = analogRead (PA0);
Ezután konvertálja ezt az értéket egy bájtban (0-ról 255-re).
byte MasterSend = térkép (pot, 0,4096,0,255);
- Itt jön a fontos lépés, a következő utasításban elküldjük a Mastersend változóban tárolt átalakított POT értéket a slave Arduino-nak, és értéket kapunk a slave Arduino-tól is, és ezt tároljuk a mastereceive változóban.
Mastereceive = SPI.transzfer (Mastersend);
- Ezután jelenítse meg a szolga arduino által kapott értékeket 500 mikroszekundum késéssel, majd folyamatosan fogadja és jelenítse meg az értékeket.
Serial.println ("Rabszolga Arduino az STM32 mesterhez"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive késleltetés) (500); digitalWrite (SS, HIGH);
Megjegyzés: A serial.println () paranccsal megtekinthetjük az eredményt az Arduino IDE soros motorjában.
Slave Arduino SPI programozási magyarázat
1. Ugyanúgy, mint a master, először is be kell illesztenünk az SP2 könyvtárat az I2C kommunikációs funkciók és az LCD könyvtárat az LCD funkciók használatához. Határozzon meg LCD érintkezőket a 16x2 LCD-hez is.
#include
2. Üres beállításban ()
- A soros kommunikációt 9600 átviteli sebességgel kezdjük.
Serial.begin (9600);
- Az alábbi utasítás a MISO-t OUTPUT-ként állítja be (adatokat kell küldenie a Master IN-nek). Tehát az adatokat a Slave Arduino MISO-ján keresztül küldi el.
pinMode (MISO, OUTPUT);
- Most kapcsolja be az SPI-t Slave módban az SPI Control Register használatával
SPCR - = _BV (SPE);
- Ezután kapcsolja be az SPI kommunikáció megszakítását. Ha adatot kapnak a master-től, akkor a megszakító szolgáltatás rutin meghívásra kerül, és a kapott érték az SPDR-ből (SPI data Register) származik.
SPI.attachInterrupt ();
- A master értékét az SPDR-ből vesszük, és a Slavereceived változóban tároljuk. Ez a megszakítási rutin funkció követésével történik.
ISR (SPI_STC_vect) {Slavereceived = SPDR; kapott = igaz; }
3. Következő a void ciklusban ()
- Olvassa el az analóg értéket a Slave Arduino POT-ból, amely az A0 tűhöz csatlakozik.
int pot = analógRead (A0);
- Konvertálja ezt az értéket egy bájtban 0-ról 255-re.
Slavesend = térkép (fazék, 0,1023,0,255);
- A következő fontos lépés az átalakított érték elküldése a Master STM32F10C8-nak, így helyezze el az értéket az SPDR regiszterben. Az SPDR regiszter értékek küldésére és fogadására szolgál.
SPDR = Slavesend;
- Ezután jelenítse meg a Master STM32F103C8-tól kapott értéket ( SlaveReceive ) az LCD-n 500 mikroszekundum késéssel, majd folyamatosan fogadja és jelenítse meg ezeket az értékeket.
lcd.setCursor (0,0); lcd.print ("Rabszolga: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 a Slave Arduino számára"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); késés (500);
Az egyik oldalon forgatva a potenciométert, a másik oldalon láthatja a változó értékeket az LCD-n:
Tehát így zajlik az SPI kommunikáció az STM32-ben. Mostantól bármely SPI érzékelőt összekapcsolhatja az STM32 kártyával.
A Master STM32 és a Slave Arduino teljes kódolását alább mutatjuk be egy bemutató videóval