- STM32F103C8 में एस.पी.आई.
- Arduino में SPI पिंस
- अवयव आवश्यक
- सर्किट डायग्राम और एसटीएम 32 एसपीआई ट्यूटोरियल के लिए कनेक्शन
- STM32 SPI प्रोग्रामिंग
- मास्टर STM32 SPI प्रोग्रामिंग स्पष्टीकरण
- गुलाम Arduino एसपीआई प्रोग्रामिंग स्पष्टीकरण
हमारे पिछले ट्यूटोरियल में, हमने दो Arduino बोर्डों के बीच SPI और I2C संचार के बारे में सीखा है। इस ट्यूटोरियल में हम ब्लू पिल बोर्ड के साथ एक Arduino बोर्ड को प्रतिस्थापित करेंगे जो STM32F103C8 है और SPI बस का उपयोग करके Arduino बोर्ड के साथ संचार करेगा। इस STM32 SPI उदाहरण में, हम Arduino UNO को स्लेव और STM32F103C8 के रूप में मास्टर के रूप में उपयोग करेंगे, जिसमें दो 16X2 LCD डिस्प्ले एक दूसरे से अलग-अलग जुड़े होंगे। दो पोटेंशियोमीटर एसटीएम 32 (पीए 0) और अरुडिनो (ए 0) के साथ भी जुड़े हुए हैं, ताकि मास्टर से दास और दास से पोटेंशियोमीटर अलग-अलग होते हुए भेजने के मूल्यों (0 से 255) का निर्धारण किया जा सके।
STM32F103C8 में एस.पी.आई.
Arduino & STM32F103C8 ब्लू पिल बोर्ड में SPI बस की तुलना में, STM32 में 2 SPI बस है जबकि Arduino Uno में एक SPI बस है । Arduino Uno में ATMEGA328 माइक्रोकंट्रोलर है, और STM32F103C8 में ARM Cortex- M3 है जो इसे Arudino Board की तुलना में तेज़ बनाता है।
SPI संचार के बारे में अधिक जानने के लिए, हमारे पिछले लेख देखें
- Arduino में SPI का उपयोग कैसे करें: दो Arduino बोर्डों के बीच संचार
- PIC माइक्रोकंट्रोलर PIC16F877A के साथ SPI कम्युनिकेशन
- बिट बैंगिंग के माध्यम से एसपीआई संचार
- रास्पबेरी पाई गर्म पानी की टंकी रिसाव डिटेक्टर SPI मॉड्यूल का उपयोग कर
- ES3232 DS3231 मॉड्यूल का उपयोग करके रियल टाइम क्लॉक
STM32 SPI पिन STM32F103C8
SPI लाइन 1 | STM32F103C8 में पिन करें |
MOSI1 | PA7 या PB5 |
MISO1 | PA6 या PB4 |
SCK1 | PA5 या PB3 |
एसएस १ | PA4 या PA15 |
एसपीआई लाइन 2 | |
MOSI2 | पीबी 15 |
MISO2 | पीबी 14 |
SCK2 | PB13 |
SS2 | पीबी 12 |
Arduino में SPI पिंस
एसपीआई लाइन |
Arduino में पिन करें |
MOSI |
11 या आईसीएसपी -4 |
मीसो |
12 या ICSP-1 |
SCK |
13 या आईसीएसपी -3 |
एसएस |
१० |
अवयव आवश्यक
- STM32F103C8
- Arduino
- एलसीडी 16x2 - 2
- 10k पोटेंशियोमीटर - 4
- ब्रेड बोर्ड
- तारों को जोड़ना
सर्किट डायग्राम और एसटीएम 32 एसपीआई ट्यूटोरियल के लिए कनेक्शन
नीचे दी गई सारणी Arduino के साथ STM32 SPI संचार के लिए जुड़े पिन को दिखाती है ।
एसपीआई पिन |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
1 1 |
मीसो |
PA6 |
१२ |
SCK |
PA5 |
१३ |
एसएस १ |
PA4 |
१० |
नीचे दी गई तालिका STM32F103C8 और Arduino के साथ दो एलसीडी (16x2) से जुड़े पिनों को अलग-अलग दिखाती है ।
एलसीडी पिन |
STM32F103C8 |
Arduino |
वीएसएस |
GND |
GND |
VDD |
+ 5 वी |
+ 5 वी |
वि ० |
एलसीडी कंट्रास्ट के लिए पोटेंशियोमीटर सेंटर पिन |
एलसीडी कंट्रास्ट के लिए पोटेंशियोमीटर सेंटर पिन |
रुपये |
पीबी ० |
२ |
आरडब्ल्यू |
GND |
GND |
इ |
पीबी 1 |
३ |
डी 4 |
PB10 |
४ |
D5 |
पीबी 11 |
५ |
डी 6 |
PC13 |
६ |
डी 7 |
PC14 |
। |
ए |
+ 5 वी |
+ 5 वी |
क |
GND |
GND |
जरूरी:
- Arduino GND और STM32F103C8 GND को एक साथ जोड़ना न भूलें।
STM32 SPI प्रोग्रामिंग
प्रोग्रामिंग Arduino कोड के समान है। यह वही
इस STM32 SPI उदाहरण में, हम Arduino UNO को स्लेव और STM32F103C8 के रूप में मास्टर के रूप में उपयोग करेंगे, जिसमें दो 16X2 LCD डिस्प्ले एक दूसरे से अलग-अलग जुड़े होंगे। दो पोटेंशियोमीटर एसटीएम 32 (पीए 0) और अरुडिनो (ए 0) के साथ भी जुड़े हुए हैं, ताकि मास्टर से दास और दास से पोटेंशियोमीटर अलग-अलग होते हुए भेजने के मूल्यों (0 से 255) का निर्धारण किया जा सके।
पोटेंशियोमीटर को घुमाकर एनालॉग इनपुट STM32F10C8 पिन PA0 (0 से 3.3V) पर लिया जाता है। फिर इस इनपुट वैल्यू को एनालॉग से डिजिटल वैल्यू (0 से 4096) में बदल दिया जाता है और इस डिजिटल वैल्यू को और मैप किया जाता है (0 से 255) क्योंकि हम एक ही बार में SPI कम्युनिकेशन के जरिए केवल 8-बिट (बाइट) डेटा भेज सकते हैं।
इसी तरह स्लेव साइड में हम पोटेंशियोमीटर का उपयोग करके Arduino pin A0 से (0 से 5V) पर एनालॉग इनपुट वैल्यू लेते हैं। और फिर से इस इनपुट वैल्यू को एनालॉग से डिजिटल वैल्यू (0 से 1023) में बदल दिया जाता है और इस डिजिटल वैल्यू को और मैप किया जाता है (0 से 255)
इस ट्यूटोरियल में मास्टर एसटीएम 32 के लिए एक और गुलाम अरुडिनो के लिए दो कार्यक्रम हैं। इस परियोजना के अंत में प्रदर्शन वीडियो के साथ दोनों पक्षों के लिए पूर्ण कार्यक्रम दिए गए हैं ।
मास्टर STM32 SPI प्रोग्रामिंग स्पष्टीकरण
1. सबसे पहले हमें SPI संचार कार्यों का उपयोग करने के लिए SPI पुस्तकालय और एलसीडी कार्यों का उपयोग करने के लिए LCD पुस्तकालय शामिल करने की आवश्यकता है । 16x2 एलसीडी के लिए एलसीडी पिन भी परिभाषित करें। STM32 के साथ एलसीडी को यहाँ रखने के बारे में अधिक जानें।
#शामिल
2. शून्य सेटअप में ()
- बॉड दर 9600 पर सीरियल संचार शुरू करें।
सीरियल.बेगिन (9600);
- अगला एसपीआई संचार शुरू करें
SPI.begin ();
- फिर SPI संचार के लिए घड़ी विभक्त सेट करें। मैंने डिवाइडर 16 निर्धारित किया है।
SPI.setClockDivider (SPI_CLOCK_DIV16);
- अगले एसएस पिन हाई सेट करें क्योंकि हमने दास एर्डिनो को कोई भी स्थानांतरण शुरू नहीं किया है।
digitalWrite (एसएस, हाई);
3. शून्य लूप () में
- गुलाम को कोई भी मूल्य भेजने से पहले, हमें गुलाम का चयन करने के लिए गुलाम का चयन करना होगा।
digitalWrite (SS, LOW);
- अगले मास्ट STM32F10C8 पॉट से पिन पीए 0 से जुड़ी एनालॉग वैल्यू पढ़ें।
int pot = analogRead (PA0);
फिर इस मूल्य को एक बाइट (0 से 255) के संदर्भ में परिवर्तित करें।
बाइट मास्टरसेंड = नक्शा (पॉट, 0,4096,0,255);
- यहाँ महत्वपूर्ण चरण आता है, निम्नलिखित कथन में हम मास्टर्सएंड वेरिएबल में संग्रहित पॉट वैल्यू को स्लेव आर्डुइनो में भेजते हैं , और स्लेव अरुडिनो से वैल्यू भी प्राप्त करते हैं और इसे मास्टेरियस वैरिएबल में स्टोर किया जाता है ।
मास्टरीसिव = SPI.transfer (मास्टर्सेंड);
- अगला प्रदर्शन उन प्राप्त मूल्यों को 500 माइक्रोसेकंड की देरी के साथ दास arduino से प्राप्त करता है और फिर मूल्यों को लगातार प्राप्त और प्रदर्शित करता है।
Serial.println ("दास Arduino से मास्टर STM32 के लिए"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive delay) (500); डिजिटलराइट (एसएस, हाई);
नोट: हम Arduino IDE के सीरियल मोटर में परिणाम देखने के लिए serial.println () का उपयोग करते हैं।
गुलाम Arduino एसपीआई प्रोग्रामिंग स्पष्टीकरण
1. मास्टर के रूप में ही, सबसे पहले हमें I2C संचार कार्यों और एलसीडी कार्यों का उपयोग करने के लिए एलसीडी पुस्तकालय का उपयोग करने के लिए एसपीआई पुस्तकालय शामिल करने की आवश्यकता है । 16x2 एलसीडी के लिए एलसीडी पिन भी परिभाषित करें।
#शामिल
2. शून्य सेटअप में ()
- हम बौड रेट 9600 पर सीरियल कम्युनिकेशन शुरू करते हैं।
सीरियल.बेगिन (9600);
- नीचे बयान MISO को OUTPUT (मास्टर IN में डेटा भेजना है) के रूप में सेट करता है। कोई डेटा स्लेव Arduino के MISO के माध्यम से भेजा जाता है।
पिनमोड (MISO, OUTPUT);
- अब SPI कंट्रोल रजिस्टर का उपयोग करके SPI को स्लेव मोड में चालू करें
SPCR - = _BV (SPE);
- फिर एसपीआई संचार के लिए ऑन इंटरप्ट चालू करें। यदि एक डेटा मास्टर से प्राप्त होता है तो इंटरप्ट सर्विस रूटिन कहा जाता है और प्राप्त मूल्य SPDR (SPI डेटा रजिस्टर) से लिया जाता है
SPI.attachInterrupt ();
- मास्टर से मूल्य SPDR से लिया जाता है और Slavereceived चर में संग्रहीत किया जाता है। यह इंटरप्ट रूटीन फ़ंक्शन के बाद होता है।
ISR (SPI_STC_vect) {Slavereceived = SPDR; प्राप्त = सत्य; }
3. शून्य लूप में अगला ()
- पिन A0 से जुड़े स्लेव अरुडिनो पॉट से एनालॉग वैल्यू पढ़ें।
int pot = analogRead (A0);
- उस मान को 0 से 255 तक एक बाइट के रूप में परिवर्तित करें।
दास = मानचित्र (बर्तन, 0,1023,0,255);
- अगला महत्वपूर्ण कदम परिवर्तित मान को STM32F10C8 पर भेजना है, इसलिए मूल्य को SPDR रजिस्टर में रखें। SPDR रजिस्टर का उपयोग मूल्यों को भेजने और प्राप्त करने के लिए किया जाता है।
एसपीडीआर = दास;
- फिर 500 microseconds की देरी के साथ एलसीडी पर मास्टर STM32F103C8 से प्राप्त मूल्य ( SlaveReceive ) प्रदर्शित करें और फिर उन मानों को लगातार प्राप्त करें और प्रदर्शित करें।
lcd.setCursor (0,0); lcd.print ("दास: अरुडिनो"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("मास्टर STM32 से दास अरुडिनो के लिए"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); देरी (500);
तक एक साइड को नापने घूर्णन, तो आप एक तरफ एलसीडी पर अलग-अलग मान देख सकते हैं:
तो इस तरह एसपीएम 32 में एसपीआई संचार होता है । अब आप STM32 बोर्ड के साथ किसी भी SPI सेंसर को इंटरफेस कर सकते हैं।
मास्टर STM32 और स्लेव Arduino के लिए पूरा कोडिंग एक प्रदर्शन वीडियो के साथ नीचे दिया गया है