- STM32F103C8 లో SPI
- ఆర్డునోలో SPI పిన్స్
- భాగాలు అవసరం
- STM32 SPI ట్యుటోరియల్ కోసం సర్క్యూట్ రేఖాచిత్రం మరియు కనెక్షన్లు
- STM32 SPI ప్రోగ్రామింగ్
- మాస్టర్ STM32 SPI ప్రోగ్రామింగ్ వివరణ
- స్లేవ్ ఆర్డునో SPI ప్రోగ్రామింగ్ వివరణ
మా మునుపటి ట్యుటోరియల్లో, రెండు ఆర్డునో బోర్డుల మధ్య SPI మరియు I2C కమ్యూనికేషన్ గురించి తెలుసుకున్నాము. ఈ ట్యుటోరియల్లో మేము ఒక ఆర్డునో బోర్డ్ను బ్లూ పిల్ బోర్డ్తో STM32F103C8 తో భర్తీ చేస్తాము మరియు SPI బస్సును ఉపయోగించి Arduino బోర్డుతో కమ్యూనికేట్ చేస్తాము. ఈ STM32 SPI ఉదాహరణలో, మేము Arduino UNO ను స్లేవ్గా మరియు STM32F103C8 ను మాస్టర్గా రెండు 16X2 LCD డిస్ప్లేతో ఒకదానికొకటి విడిగా జతచేస్తాము. పోటెన్టోమీటర్ను మార్చడం ద్వారా మాస్టర్ నుండి బానిస మరియు బానిస నుండి మాస్టర్కు పంపే విలువలను (0 నుండి 255 వరకు) నిర్ణయించడానికి రెండు పొటెన్టోమీటర్లు STM32 (PA0) మరియు Arduino (A0) తో అనుసంధానించబడి ఉన్నాయి.
STM32F103C8 లో SPI
Arduino & STM32F103C8 బ్లూ పిల్ బోర్డులో SPI బస్సును పోల్చి చూస్తే, STM32 లో 2 SPI బస్సులు ఉండగా, Arduino Uno కి ఒక SPI బస్సు ఉంది. Arduino Uno లో ATMEGA328 మైక్రోకంట్రోలర్ ఉంది, మరియు STM32F103C8 లో ARM కార్టెక్స్- M3 ఉంది, ఇది అరుడినో బోర్డ్ కంటే వేగంగా చేస్తుంది.
SPI కమ్యూనికేషన్ గురించి మరింత తెలుసుకోవడానికి, మా మునుపటి కథనాలను చూడండి
- Arduino లో SPI ని ఎలా ఉపయోగించాలి: రెండు Arduino బోర్డుల మధ్య కమ్యూనికేషన్
- PIC మైక్రోకంట్రోలర్ PIC16F877A తో SPI కమ్యూనికేషన్
- బిట్ బ్యాంగింగ్ ద్వారా SPI కమ్యూనికేషన్
- ఎస్పీఐ మాడ్యూళ్ళను ఉపయోగించి రాస్ప్బెర్రీ పై హాట్ వాటర్ ట్యాంక్ లీక్ డిటెక్టర్
- DS3231 మాడ్యూల్ ఉపయోగించి ESP32 రియల్ టైమ్ క్లాక్
STM32 SPI పిన్స్ STM32F103C8
SPI లైన్ 1 | STM32F103C8 లో పిన్ చేయండి |
MOSI1 | PA7 లేదా PB5 |
MISO1 | PA6 లేదా PB4 |
SCK1 | PA5 లేదా PB3 |
SS1 | PA4 లేదా PA15 |
SPI లైన్ 2 | |
MOSI2 | పిబి 15 |
MISO2 | పిబి 14 |
SCK2 | పిబి 13 |
SS2 | పిబి 12 |
ఆర్డునోలో SPI పిన్స్
SPI లైన్ |
Arduino లో పిన్ చేయండి |
మోసి |
11 లేదా ఐసిఎస్పి -4 |
MISO |
12 లేదా ICSP-1 |
ఎస్.సి.కె. |
13 లేదా ఐసిఎస్పి -3 |
ఎస్.ఎస్ |
10 |
భాగాలు అవసరం
- STM32F103C8
- ఆర్డునో
- LCD 16x2 - 2
- 10 కె పొటెన్టోమీటర్ - 4
- బ్రెడ్బోర్డ్
- వైర్లను కనెక్ట్ చేస్తోంది
STM32 SPI ట్యుటోరియల్ కోసం సర్క్యూట్ రేఖాచిత్రం మరియు కనెక్షన్లు
దిగువ పట్టిక Arduino తో STM32 SPI కమ్యూనికేషన్ కోసం కనెక్ట్ చేయబడిన పిన్లను చూపుతుంది.
SPI పిన్ |
STM32F103C8 |
ఆర్డునో |
మోసి |
PA7 |
11 |
MISO |
PA6 |
12 |
ఎస్.సి.కె. |
PA5 |
13 |
SS1 |
PA4 |
10 |
దిగువ పట్టిక STM32F103C8 మరియు Arduino తో రెండు LCD (16x2) కోసం కనెక్ట్ చేసిన పిన్లను విడిగా చూపిస్తుంది.
LCD పిన్ |
STM32F103C8 |
ఆర్డునో |
వి.ఎస్.ఎస్ |
GND |
GND |
VDD |
+ 5 వి |
+ 5 వి |
వి 0 |
LCD కాంట్రాస్ట్ కోసం పొటెన్టోమీటర్ సెంటర్ పిన్కు |
LCD కాంట్రాస్ట్ కోసం పొటెన్టోమీటర్ సెంటర్ పిన్కు |
ఆర్ఎస్ |
పిబి 0 |
2 |
ఆర్డబ్ల్యూ |
GND |
GND |
ఇ |
పిబి 1 |
3 |
డి 4 |
పిబి 10 |
4 |
డి 5 |
పిబి 11 |
5 |
డి 6 |
పిసి 13 |
6 |
డి 7 |
పిసి 14 |
7 |
జ |
+ 5 వి |
+ 5 వి |
కె |
GND |
GND |
ముఖ్యమైనది:
- Arduino GND మరియు STM32F103C8 GND లను కనెక్ట్ చేయడం మర్చిపోవద్దు.
STM32 SPI ప్రోగ్రామింగ్
ప్రోగ్రామింగ్ Arduino కోడ్ మాదిరిగానే ఉంటుంది. అదే
ఈ STM32 SPI ఉదాహరణలో, మేము Arduino UNO ను స్లేవ్గా మరియు STM32F103C8 ను మాస్టర్గా రెండు 16X2 LCD డిస్ప్లేతో ఒకదానికొకటి విడిగా జతచేస్తాము. పోటెన్టోమీటర్ను మార్చడం ద్వారా మాస్టర్ నుండి బానిస మరియు బానిస నుండి మాస్టర్కు పంపే విలువలను (0 నుండి 255 వరకు) నిర్ణయించడానికి రెండు పొటెన్టోమీటర్లు STM32 (PA0) మరియు Arduino (A0) తో అనుసంధానించబడి ఉన్నాయి.
పొటెన్షియోమీటర్ను తిప్పడం ద్వారా అనలాగ్ ఇన్పుట్ STM32F10C8 పిన్ PA0 (0 నుండి 3.3V) వద్ద తీసుకోబడుతుంది. అప్పుడు ఈ ఇన్పుట్ విలువ అనలాగ్ నుండి డిజిటల్ విలువ (0 నుండి 4096) గా మార్చబడుతుంది మరియు ఈ డిజిటల్ విలువ (0 నుండి 255) కు మ్యాప్ చేయబడుతుంది, ఎందుకంటే మేము ఒకేసారి SPI కమ్యూనికేషన్ ద్వారా 8-బిట్ (బైట్) డేటాను మాత్రమే పంపగలము.
అదేవిధంగా స్లేవ్ వైపు మేము పొటెన్షియోమీటర్ ఉపయోగించి Arduino పిన్ A0 వద్ద (0 నుండి 5V వరకు) అనలాగ్ ఇన్పుట్ విలువను తీసుకుంటాము. మరలా ఈ ఇన్పుట్ విలువ అనలాగ్ నుండి డిజిటల్ విలువ (0 నుండి 1023 వరకు) గా మార్చబడుతుంది మరియు ఈ డిజిటల్ విలువ మరింత (0 నుండి 255) కు మ్యాప్ చేయబడుతుంది.
ఈ ట్యుటోరియల్ మాస్టర్ STM32 కోసం రెండు ప్రోగ్రామ్లను కలిగి ఉంది మరియు మరొకటి బానిస Arduino కోసం. ఈ ప్రాజెక్ట్ చివరిలో ప్రదర్శన వీడియోతో ఇరువైపుల పూర్తి కార్యక్రమాలు ఇవ్వబడ్డాయి.
మాస్టర్ STM32 SPI ప్రోగ్రామింగ్ వివరణ
1. మొదట మనం SPI కమ్యూనికేషన్ ఫంక్షన్లను ఉపయోగించటానికి SPI లైబ్రరీని మరియు LCD ఫంక్షన్లను ఉపయోగించటానికి LCD లైబ్రరీని చేర్చాలి. 16x2 LCD కోసం LCD పిన్లను కూడా నిర్వచించండి. STM32 తో LCD ని ఇంటర్ఫేసింగ్ గురించి ఇక్కడ మరింత తెలుసుకోండి.
# చేర్చండి
2. శూన్య సెటప్లో ()
- బాడ్ రేట్ 9600 వద్ద సీరియల్ కమ్యూనికేషన్ ప్రారంభించండి.
సీరియల్.బెగిన్ (9600);
- తరువాత SPI కమ్యూనికేషన్ ప్రారంభించండి
SPI.begin ();
- అప్పుడు SPI కమ్యూనికేషన్ కోసం క్లాక్ డివైడర్ను సెట్ చేయండి. నేను డివైడర్ 16 ని సెట్ చేసాను.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- బానిస ఆర్డునోకు మేము ఎటువంటి బదిలీని ప్రారంభించనందున తదుపరి SS పిన్ HIGH ని సెట్ చేయండి.
డిజిటల్ రైట్ (SS, HIGH);
3. శూన్య లూప్లో ()
- బానిసకు ఏదైనా విలువను పంపే ముందు, మాస్టర్ నుండి బానిసకు బదిలీని ప్రారంభించడానికి బానిస ఎంపిక విలువను తక్కువ చేయాలి.
డిజిటల్ రైట్ (SS, LOW);
- పిన్ PA0 కు జతచేయబడిన మాస్టర్ STM32F10C8 POT నుండి అనలాగ్ విలువను చదవండి.
int పాట్ = అనలాగ్ రీడ్ (PA0);
అప్పుడు ఈ విలువను ఒక బైట్ (0 నుండి 255 వరకు) గా మార్చండి.
బైట్ మాస్టర్సెండ్ = మ్యాప్ (కుండ, 0,4096,0,255);
- ఇక్కడ ముఖ్యమైన దశ వస్తుంది, కింది ప్రకటనలో మేము మాస్టర్సెండ్ వేరియబుల్లో నిల్వ చేసిన మార్చబడిన POT విలువను బానిస ఆర్డునోకు పంపుతాము మరియు బానిస ఆర్డునో నుండి విలువను కూడా స్వీకరిస్తాము మరియు దానిని మాస్టెరిసివ్ వేరియబుల్లో నిల్వ చేస్తాము .
మాస్టెరిసివ్ = SPI.transfer (మాస్టర్సెండ్);
- తరువాత స్లేవ్ ఆర్డునో నుండి అందుకున్న విలువలను 500 మైక్రోసెకన్ల ఆలస్యంతో ప్రదర్శించి, ఆపై నిరంతరం విలువలను స్వీకరించి ప్రదర్శిస్తుంది.
సీరియల్.ప్రింట్ల్న్ ("స్లేవ్ ఆర్డునో టు మాస్టర్ STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("మాస్టర్: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive ఆలస్యం (500); డిజిటల్ రైట్ (ఎస్ఎస్, హై);
గమనిక: సీరియల్ మోటర్ ఆఫ్ ఆర్డునో IDE లో ఫలితాన్ని వీక్షించడానికి మేము serial.println () ను ఉపయోగిస్తాము.
స్లేవ్ ఆర్డునో SPI ప్రోగ్రామింగ్ వివరణ
1. మాస్టర్ మాదిరిగానే, మొదట మనం I2C కమ్యూనికేషన్ ఫంక్షన్లను ఉపయోగించటానికి SPI లైబ్రరీని మరియు LCD ఫంక్షన్లను ఉపయోగించటానికి LCD లైబ్రరీని చేర్చాలి. 16x2 LCD కోసం LCD పిన్లను కూడా నిర్వచించండి.
# చేర్చండి
2. శూన్య సెటప్లో ()
- మేము బాడ్ రేట్ 9600 వద్ద సీరియల్ కమ్యూనికేషన్ను ప్రారంభిస్తాము.
సీరియల్.బెగిన్ (9600);
- క్రింద స్టేట్మెంట్ MISO ని OUTPUT గా సెట్ చేస్తుంది (మాస్టర్ IN కి డేటాను పంపాలి).కాబట్టి డేటా MISO ఆఫ్ స్లేవ్ ఆర్డునో ద్వారా పంపబడుతుంది.
పిన్మోడ్ (MISO, OUTPUT);
- ఇప్పుడు SPI కంట్రోల్ రిజిస్టర్ ఉపయోగించి స్లేవ్ మోడ్లో SPI ని ఆన్ చేయండి
SPCR - = _BV (SPE);
- SPI కమ్యూనికేషన్ కోసం అంతరాయాన్ని ఆన్ చేయండి. మాస్టర్ నుండి డేటా స్వీకరించబడితే ఇంటరప్ట్ సర్వీస్ రొటీన్ అంటారు మరియు అందుకున్న విలువ SPDR (SPI డేటా రిజిస్టర్) నుండి తీసుకోబడుతుంది
SPI.attachInterrupt ();
- మాస్టర్ నుండి విలువ SPDR నుండి తీసుకోబడింది మరియు స్లేవెరిసివ్డ్ వేరియబుల్లో నిల్వ చేయబడుతుంది. ఇంటరప్ట్ రొటీన్ ఫంక్షన్ను అనుసరించడంలో ఇది జరుగుతుంది.
ISR (SPI_STC_vect) {బానిస = SPDR; అందుకున్నది = నిజం; }
3. శూన్య లూప్లో తదుపరిది ()
- పిన్ A0 కు జతచేయబడిన స్లేవ్ ఆర్డునో POT నుండి అనలాగ్ విలువను చదవండి.
int పాట్ = అనలాగ్ రీడ్ (A0);
- ఆ విలువను ఒక బైట్ పరంగా 0 నుండి 255 గా మార్చండి.
స్లేవ్సెండ్ = మ్యాప్ (కుండ, 0,1023,0,255);
- మార్చబడిన విలువను మాస్టర్ STM32F10C8 కు పంపడం తదుపరి ముఖ్యమైన దశ, కాబట్టి విలువను SPDR రిజిస్టర్లో ఉంచండి. విలువలను పంపడానికి మరియు స్వీకరించడానికి SPDR రిజిస్టర్ ఉపయోగించబడుతుంది.
SPDR = స్లేవ్సెండ్;
- అప్పుడు మాస్టర్ STM32F103C8 నుండి 500 మైక్రో సెకన్ల ఆలస్యంతో LCD లో అందుకున్న విలువను ( స్లేవ్ రిసీవ్ ) ప్రదర్శించి, ఆ విలువను నిరంతరం స్వీకరించి ప్రదర్శించండి.
lcd.setCursor (0,0); lcd.print ("బానిస: అర్డునో"); lcd.setCursor (0,1); lcd.print ("మాస్టర్వాల్:"); సీరియల్.ప్రింట్ల్న్ ("మాస్టర్ STM32 టు స్లేవ్ ఆర్డునో"); సీరియల్.ప్రింట్ల్న్ (స్లేవ్ రిసీవ్డ్); lcd.print (స్లేవ్ రిసీవ్డ్); ఆలస్యం (500);
పొటెన్టోమీటర్ను ఒక వైపు తిప్పడం ద్వారా , మీరు ఎల్సిడిలో విభిన్న విలువలను మరొక వైపు చూడవచ్చు:
కాబట్టి STM32 లో SPI కమ్యూనికేషన్ జరుగుతుంది. ఇప్పుడు మీరు STM32 బోర్డుతో ఏదైనా SPI సెన్సార్ను ఇంటర్ఫేస్ చేయవచ్చు.
మాస్టర్ STM32 మరియు స్లేవ్ ఆర్డునో కోసం పూర్తి కోడింగ్ ప్రదర్శన వీడియోతో క్రింద ఇవ్వబడింది