- SPI STM32F103C8
- SPI kaiščiai „Arduino“
- Būtini komponentai
- STM32 SPI pamokos grandinių schema ir jungtys
- STM32 SPI programavimas
- Pagrindinio STM32 SPI programavimo paaiškinimas
- Vergų „Arduino“ SPI programavimo paaiškinimas
Ankstesnėse mūsų pamokose sužinojome apie SPI ir I2C ryšį tarp dviejų „Arduino“ plokščių. Šioje pamokoje pakeisime vieną „Arduino“ plokštę „Blue Pill“ plokšte, kuri yra STM32F103C8, ir bendrausime su „Arduino“ plokšte naudodami SPI magistralę. Šiame STM32 SPI pavyzdyje mes naudosime „Arduino UNO“ kaip „Slave“ ir „STM32F103C8“ kaip „Master“ su dviem 16X2 skystųjų kristalų ekranais, pritvirtintais vienas prie kito atskirai. Du potenciometrai taip pat yra sujungti su STM32 (PA0) ir „Arduino“ (A0), kad būtų nustatytos siuntimo vertės (nuo 0 iki 255) iš pagrindinio į vergą ir iš vergo į valdymą, keičiant potenciometrą.
SPI STM32F103C8
Lyginant SPI magistralę „Arduino“ ir „STM32F103C8 Blue Pill“ lentoje, STM32 turi 2 SPI magistralę, o „Arduino Uno“ - vieną SPI magistralę. „Arduino Uno“ turi mikrovaldiklį ATMEGA328, o STM32F103C8 - „ARM Cortex-M3“, todėl jis greitesnis nei „Arudino Board“.
Norėdami sužinoti daugiau apie SPI komunikaciją, skaitykite ankstesnius mūsų straipsnius
- Kaip naudoti SPI „Arduino“: Ryšys tarp dviejų „Arduino“ plokščių
- SPI ryšys su PIC mikrovaldikliu PIC16F877A
- SPI ryšys per „Bit Banging“
- „Raspberry Pi“ karšto vandens rezervuaro nuotėkio detektorius, naudojant SPI modulius
- ESP32 realaus laiko laikrodis naudojant DS3231 modulį
STM32 SPI kaiščiai STM32F103C8
SPI linija | Prisegti STM32F103C8 |
MOSI1 | PA7 arba PB5 |
MISO1 | PA6 arba PB4 |
SCK1 | PA5 arba PB3 |
SS1 | PA4 arba PA15 |
SPI linija2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI kaiščiai „Arduino“
SPI linija |
Prisegti „Arduino“ |
MOSI |
11 arba ICSP-4 |
MISO |
12 arba ICSP-1 |
SCK |
13 arba ICSP-3 |
SS |
10 |
Būtini komponentai
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10 k potenciometras - 4
- Bandomoji Lenta
- Laidų sujungimas
STM32 SPI pamokos grandinių schema ir jungtys
Žemiau esančioje lentelėje rodomi kaiščiai, prijungti STM32 SPI ryšiui su „Arduino“.
SPI kaištis |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Žemiau esančioje lentelėje rodomi kaiščiai, prijungti prie dviejų LCD (16x2) su STM32F103C8 ir „Arduino“ atskirai.
LCD kaištis |
STM32F103C8 |
Arduino |
VSS |
BND |
BND |
VDD |
+ 5 V |
+ 5 V |
V0 |
Į potenciometro centrinį PIN kodą, norint gauti LCD kontrastą |
Į potenciometro centrinį PIN kodą, norint gauti LCD kontrastą |
RS |
PB0 |
2 |
RW |
BND |
BND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
A |
+ 5 V |
+ 5 V |
K. |
BND |
BND |
Svarbu:
- Nepamirškite sujungti „Arduino GND“ ir „STM32F103C8 GND“.
STM32 SPI programavimas
Programavimas yra panašus į „Arduino“ kodą. Tas pats
Šiame STM32 SPI pavyzdyje mes naudosime „Arduino UNO“ kaip „Slave“ ir „STM32F103C8“ kaip „Master“ su dviem 16X2 skystųjų kristalų ekranais, pritvirtintais vienas prie kito atskirai. Du potenciometrai taip pat yra sujungti su STM32 (PA0) ir „Arduino“ (A0), kad būtų nustatytos siuntimo vertės (nuo 0 iki 255) iš pagrindinio į vergą ir iš vergo į valdymą, keičiant potenciometrą.
Analoginis įėjimas imamas STM32F10C8 kaiščiu PA0 (nuo 0 iki 3,3 V) sukant potenciometrą. Tada ši įvesties vertė yra konvertuojama į analoginę į skaitmeninę vertę (nuo 0 iki 4096) ir ši skaitmeninė vertė dar priskiriama (nuo 0 iki 255), nes per SPI ryšį vienu metu galime siųsti tik 8 bitų (baitų) duomenis.
Panašiai vergo pusėje, naudojant potenciometrą, imame analoginę įvesties vertę prie „Arduino“ kaiščio A0 (nuo 0 iki 5 V). Ir vėl ši įvesties vertė yra konvertuojama į analoginę į skaitmeninę vertę (nuo 0 iki 1023) ir ši skaitmeninė vertė dar priskiriama (nuo 0 iki 255)
Šioje pamokoje yra dvi programos, skirtos meistrui STM32, kitos - vergui „Arduino“. Užbaigtos abiejų šalių programos pateikiamos šio projekto pabaigoje su demonstraciniu vaizdo įrašu.
Pagrindinio STM32 SPI programavimo paaiškinimas
1. Pirmiausia turime įtraukti SPI biblioteką, skirtą naudoti SPI komunikacijos funkcijas, ir LCD biblioteką, skirtą naudoti LCD funkcijoms. Taip pat nustatykite 16x2 LCD ekranui skirtus LCD kaiščius. Sužinokite daugiau apie LCD sąsają su STM32 čia.
# įtraukti
2. Neteisingoje sąrankoje ()
- Pradėkite nuoseklųjį ryšį 9600 perdavimo sparta.
Serijos pradžia (9600);
- Tada pradėkite SPI komunikaciją
SPI.prasideda ();
- Tada nustatykite laikrodžio daliklį SPI ryšiui. Aš nustatiau daliklį 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Tada nustatykite SS kaištį HIGH, nes mes nepradėjome jokio perkėlimo į vergo arduino.
„digitalWrite“ (SS, HIGH);
3. Tuščiajame cikle ()
- Prieš siunčiant bet kokią vertę vergui, mes turime SUMETINTI vergo pasirinktą vertę, kad galėtume pradėti perduoti vergui iš pagrindinio.
„digitalWrite“ (SS, LOW);
- Tada perskaitykite analoginę vertę iš pagrindinio STM32F10C8 POT, pritvirtinto prie kaiščio PA0.
int pot = analogasRead (PA0);
Tada konvertuokite šią vertę pagal vieną baitą (nuo 0 iki 255).
baitas „MasterSend“ = žemėlapis (puodas, 0,4096,0255);
- Čia pateikiamas svarbus žingsnis, šiame sakinyje mes siunčiame konvertuotą POT vertę, saugomą „ Mastersend“ kintamajame, vergui „Arduino“, taip pat gauname vertę iš vergo „Arduino“ ir išsaugojome tai pagrindiniame kintamajame.
Mastereceive = SPI.transfer (Mastersend);
- Tada rodykite gautas vergo „arduino“ reikšmes su 500 mikrosekundžių vėlavimu, tada nuolat gaukite ir rodykite vertes.
„Serial.println“ („Vergas Arduino meistrui STM32“); Serial.println („MasterReceive“ lcd.setCursor (0,0); lcd.print („Master: STM32“); lcd.setCursor (0,1); lcd.print („SalveVal:“); lcd.print („MasterReceive“ uždelsimas) (500); „ digitalWrite“ (SS, AUKŠTAS);
Pastaba: Mes naudojame serial.println (), kad galėtume peržiūrėti „Arduino IDE“ serijinio variklio rezultatus.
Vergų „Arduino“ SPI programavimo paaiškinimas
1. Tas pats kaip meistras, pirmiausia turime įtraukti SPI biblioteką, kad galėtumėte naudotis I2C ryšio funkcijomis, ir LCD biblioteką, kad būtų galima naudoti LCD funkcijas. Taip pat nustatykite 16x2 LCD ekranui skirtus LCD kaiščius.
# įtraukti
2. Neteisingoje sąrankoje ()
- Nuoseklią komunikaciją pradedame 9600 perdavimo sparta.
Serijos pradžia (9600);
- Žemiau pateiktame teiginyje MISO nustatomas kaip OUTPUT (reikia siųsti duomenis „Master IN“). Taigi duomenys siunčiami per „Slave Arduino“ MISO.
pinMode (MISO, OUTPUT);
- Dabar įjunkite SPI vergo režimu naudodami SPI valdymo registrą
SPCR - = _BV (SPE);
- Tada įjunkite pertraukimą SPI ryšiui. Jei duomenys gaunami iš magistro, iškviečiama pertraukiamoji tarnyba ir gaunama vertė paimama iš SPDR (SPI duomenų registras)
SPI.attachInterrupt ();
- Vertė iš pagrindinio yra paimta iš SPDR ir saugoma Slavereceived kintamajame. Tai vyksta vykdant „Interrupt Routine“ funkciją.
ISR (SPI_STC_vect) {Slavereceived = SPDR; gautas = tiesa; }
3. Kitas tuštumos cikle ()
- Perskaitykite analoginę vertę iš „Slave Arduino POT“, pritvirtinto prie kaiščio A0.
int pot = analogasRead (A0);
- Konvertuokite tą vertę pagal vieną baitą nuo 0 iki 255.
Slavesend = žemėlapis (puodas, 0,1023,0,255);
- Kitas svarbus žingsnis yra nusiųsti konvertuotą vertę į „Master STM32F10C8“, todėl įrašykite vertę į SPDR registrą. SPDR registras naudojamas reikšmėms siųsti ir gauti.
SPDR = „Slavesend“;
- Tada rodykite gautą vertę („ SlaveReceive“ ) iš „Master STM32F103C8“ skystųjų kristalų ekrane su 500 mikrosekundžių vėlavimu, tada nuolat gaukite ir rodykite tą vertę.
lcd.setCursor (0,0); lcd.print ("Vergas: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); „Serial.println“ („Master STM32 to Slave Arduino“); Serial.println („SlaveReceived“); lcd.print („SlaveReceived“); vėlavimas (500);
Iki sukasi potenciometras vienoje pusėje, jūs galite pamatyti įvairius vertybes LCD kitoje pusėje:
Taigi taip vyksta SPI ryšys STM32. Dabar galite susieti bet kurį SPI jutiklį su STM32 plokšte.
Visas „Master STM32“ ir „Slave Arduino“ kodavimas pateiktas žemiau su demonstraciniu vaizdo įrašu