- SPI कम्युनिकेशन प्रोटोकॉल क्या है?
- SPI प्रोटोकॉल कैसे काम करता है?
- I2C और SPI संचार के बीच अंतर
- X168 कम्पाइलर का उपयोग करके PIC16F877A के साथ SPI:
- एसपीआई हैडर फ़ाइल स्पष्टीकरण:
- मुख्य कार्यक्रम स्पष्टीकरण:
- SPI डिबगर के साथ सिमिंग PIC:
PIC माइक्रोकंट्रोलर एम्बेडेड प्रोजेक्ट्स के लिए माइक्रोचिप द्वारा प्रदान किया गया एक शक्तिशाली प्लेटफॉर्म है; इसकी बहुमुखी प्रकृति ने इसे कई अनुप्रयोगों में तरीके खोजने में सक्षम किया है और अभी तक बहुत कुछ विकसित नहीं किया है। यदि आप हमारे PIC ट्यूटोरियल्स का अनुसरण कर रहे हैं, तो आपने देखा होगा कि हमने बहुत ही बेसिक्स से शुरू होने वाले PIC माइक्रोकंट्रोलर पर ट्यूटोरियल की एक विस्तृत श्रृंखला को कवर किया है । उसी प्रवाह में हम PIC के साथ उपलब्ध संचार प्रोटोकॉल और उन्हें कैसे उपयोग करें, यह जानने के लिए आगे बढ़ रहे हैं। हमने पहले से ही I2C को PIC माइक्रोकंट्रोलर के साथ कवर किया है।
एम्बेडेड अनुप्रयोगों की विशाल प्रणाली में, कोई भी माइक्रोकंट्रोलर सभी गतिविधियों को खुद से नहीं कर सकता है। किसी समय में सूचना साझा करने के लिए अन्य उपकरणों से संवाद करना पड़ता है, इन सूचनाओं को साझा करने के लिए कई अलग-अलग प्रकार के संचार प्रोटोकॉल हैं, लेकिन सबसे अधिक उपयोग किए जाने वाले USART, IIC, SPI और CAN हैं । प्रत्येक संचार प्रोटोकॉल का अपना लाभ और नुकसान है। आइए अब से एसपीआई प्रोटोकॉल पर ध्यान केंद्रित करें जो कि हम इस ट्यूटोरियल में सीखने जा रहे हैं।
SPI कम्युनिकेशन प्रोटोकॉल क्या है?
SPI शब्द का अर्थ " सीरियल पेरिफेरल इंटरफ़ेस " है। यह एक सामान्य संचार प्रोटोकॉल है जिसका उपयोग दो माइक्रोकंट्रोलरों के बीच डेटा भेजने या एक सेंसर से माइक्रोकंट्रोलर को डेटा पढ़ने / लिखने के लिए किया जाता है। इसका उपयोग एसडी कार्ड, शिफ्ट रजिस्टर, डिस्प्ले कंट्रोलर और बहुत कुछ के साथ संवाद करने के लिए भी किया जाता है।
SPI प्रोटोकॉल कैसे काम करता है?
एसपीआई संचार तुल्यकालिक संचार है, जिसका अर्थ है कि यह एक घड़ी संकेत की मदद से काम करता है जो डेटा का आदान-प्रदान करने वाले दो उपकरणों के बीच साझा किया जाता है। इसके अलावा यह एक पूर्ण द्वैध संचार है क्योंकि यह एक अलग बस का उपयोग करके डेटा भेज और प्राप्त कर सकता है। एसपीआई संचार 5 तारों संचालित करने के लिए की आवश्यकता है । एक मास्टर और गुलाम के बीच एक सरल एसपीआई संचार सर्किट नीचे दिखाया गया है
संचार के लिए आवश्यक पाँच तारों में SCK (सीरियल क्लॉक), MOSI (मास्टर आउट स्लेव इन), MISO (मास्टर इन स्लेव आउट) और SS (स्लेव सिलेक्ट) हैं। एसपीआई संचार हमेशा एक स्वामी और दास के बीच होता है। एक मास्टर के पास इससे जुड़े कई दास हो सकते हैं। मास्टर घड़ी नाड़ी उत्पन्न करने के लिए जिम्मेदार है और सभी दासों के साथ साझा किया जाता है। साथ ही सभी संचार केवल मास्टर द्वारा शुरू किए जा सकते हैं ।
SCK पिन (उर्फ SCL- धारावाहिक घड़ी) घड़ी के संकेत को दासों के साथ गुरु द्वारा साझा करता है। MOSI पिन (उर्फ SDA –Serial Data Out) का उपयोग मास्टर से डेटा को साल्वे में भेजने के लिए किया जाता है। MISO पिन (उर्फ एसडीआई - सीरियल डेटा इन) का उपयोग लार से मास्टर को डेटा प्राप्त करने के लिए किया जाता है। आप डेटा / सिग्नल की गति को समझने के लिए उपरोक्त आकृति में तीर के निशान का भी अनुसरण कर सकते हैं। अंत में एसएस पिन (उर्फ सीएससी-सिलेक्ट) का उपयोग किया जाता है, जब मास्टर से जुड़े एक से अधिक दास मॉड्यूल होते हैं। यह आवश्यक गुलाम का चयन करने के लिए इस्तेमाल किया जा सकता है। एक नमूना सर्किट जहां एसपीआई संचार के लिए मास्टर के साथ एक से अधिक दास जुड़ा हुआ है, नीचे सर्किट में दिखाया गया है।
I2C और SPI संचार के बीच अंतर
हमने PIC के साथ I2C संचार पहले ही सीख लिया है और इसलिए हमें इस बात से परिचित होना चाहिए कि I2C कैसे काम करता है और जहाँ हम उनका उपयोग कर सकते हैं जैसे I2C का उपयोग RTC मॉड्यूल को इंटरफ़ेस करने के लिए किया जा सकता है। लेकिन अब, जब हमें पहले से ही I2C है, तो हमें SPI प्रोटोकॉल की आवश्यकता क्यों है। कारण दोनों I2C और SPI संचार अपने तरीके से फायदे हैं और इसलिए आवेदन विशिष्ट है।
एक हद तक I2C संचार को SPI संचार पर कुछ फायदे माना जा सकता है क्योंकि I2C पिन की कम संख्या का उपयोग करता है और यह बहुत काम आता है जब बड़ी संख्या में दास बस से जुड़े होते हैं। लेकिन I2C की खामी यह है कि डेटा भेजने और प्राप्त करने के लिए एक ही बस है और इसलिए यह तुलनात्मक रूप से धीमी है। तो यह पूरी तरह से आपकी परियोजना के लिए SPI और I2C प्रोटोकॉल के बीच निर्णय लेने के लिए आवेदन पर आधारित है।
X168 कम्पाइलर का उपयोग करके PIC16F877A के साथ SPI:
बुनियादी बातों के लिए, अब हम सीखते हैं कि हम MP16AB87 IDA और XC8 कंपाइलर का उपयोग करके PIC16F877A माइक्रोकंट्रोलर पर SPI संचार का उपयोग कैसे कर सकते हैं । इससे पहले कि हम यह स्पष्ट करें कि यह ट्यूटोरियल केवल X168 संकलक का उपयोग करके PIC16F877a में SPI के बारे में बात करता है, प्रक्रिया अन्य माइक्रोकंट्रोलर के लिए समान होगी लेकिन इसमें थोड़े बदलाव की आवश्यकता हो सकती है। यह भी याद रखें कि PIC18F श्रृंखला जैसे उन्नत माइक्रोकंट्रोलर के लिए संकलक के पास स्वयं कुछ पुस्तकालय हो सकते हैं जिसमें SPI सुविधाओं का उपयोग किया जा सकता है, लेकिन PIC16F877A के लिए ऐसा कुछ भी मौजूद नहीं है ताकि हम अपने दम पर निर्माण कर सकें। यहां बताई गई लाइब्रेरी को नीचे की ओर डाउनलोड के लिए एक हेडर फाइल के रूप में दिया जाएगा जो कि अन्य SPI उपकरणों के साथ संचार करने के लिए PIC16F877A के लिए इस्तेमाल किया जा सकता है।
इस ट्यूटोरियल में हम एक छोटा प्रोग्राम लिखेंगे जो SPI बस से डेटा लिखने और पढ़ने के लिए SPI संचार का उपयोग करता है । फिर हम प्रोटीन सिमुलेशन का उपयोग करके उसी को सत्यापित करेंगे। SPI रजिस्टरों से संबंधित सभी कोड हैडर फ़ाइल के अंदर PIC16f877a_SPI.h कहलाएंगे। इस तरह से हम अपनी सभी आगामी परियोजनाओं में इस हेडर फ़ाइल का उपयोग कर सकते हैं जिसमें SPI संचार आवश्यक है। और मुख्य कार्यक्रम के अंदर हम हेडर फ़ाइल से कार्यों का उपयोग करेंगे। हेडर फ़ाइल के साथ पूरा कोड यहाँ से डाउनलोड किया जा सकता है।
एसपीआई हैडर फ़ाइल स्पष्टीकरण:
हेडर फ़ाइल के अंदर हमें PIC16F877a के लिए SPI संचार को इनिशियलाइज़ करना है। हमेशा की तरह शुरू करने के लिए सबसे अच्छी जगह PIC16F877A डेटशीट है। PIC16F8777a के लिए SPI संचार को नियंत्रित करने वाले रजिस्टर SSPSTAT और SSPCON रजिस्टर हैं। आप डेटाशीट के पृष्ठ 74 और 75 पर उनके बारे में जान सकते हैं।
कई पैरामीटर विकल्प हैं जिन्हें एसपीआई संचार को आरंभ करते समय चुना जाना है। सबसे अधिक इस्तेमाल किया जाने वाला विकल्प है घड़ी की आवृत्ति फ़ॉस्क / 4 पर सेट की जाएगी और मध्य में की जाएगी और घड़ी को आदर्श स्थिति में कम सेट किया जाएगा। इसलिए हम अपनी हेडर फ़ाइल के लिए समान कॉन्फ़िगरेशन का उपयोग कर रहे हैं, आप संबंधित बिट्स को बदलकर आसानी से उन्हें बदल सकते हैं।
SPI_Initialize_Master ()
एसपीआई इनिशियलाइज़ मास्टर फ़ंक्शन का उपयोग मास्टर के रूप में एसपीआई संचार शुरू करने के लिए किया जाता है। इस फ़ंक्शन के अंदर हम संबंधित पिन RC5 और RC3 को आउटपुट पिन के रूप में सेट करते हैं। फिर हम SPI संचार चालू करने के लिए SSPTAT और SSPCON रजिस्टर को कॉन्फ़िगर करते हैं
शून्य SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 0; // सेट गुलाम मोड के लिए आउटपुट के रूप में }
SPI_Initialize_Slave ()
इस फ़ंक्शन का उपयोग SPI संचार के लिए दास मोड में काम करने के लिए माइक्रोकंट्रोलर को सेट करने के लिए किया जाता है। गुलाम मोड के दौरान पिन आरसी 5 को आउटपुट के रूप में सेट किया जाना चाहिए और पिन आरसी 3 को इनपुट के रूप में सेट किया जाना चाहिए। SSPSTAT और SSPCON को दास और स्वामी दोनों के लिए समान रूप से सेट किया गया है।
शून्य SPI_Initialize_Slave () { TRISC5 = 0; // SDO पिन को आउटपुट SSPSTAT = 0b00000000 के रूप में घोषित किया जाना चाहिए ; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 1; // मास्टर मोड के लिए बाहर सेट के रूप में }
SPI_Write (इनकमिंग आवक)
SPI लिखना फ़ंक्शन का उपयोग SPI बस में डेटा लिखने के लिए किया जाता है। यह आने वाले चर के माध्यम से उपयोगकर्ता से जानकारी प्राप्त करता है और फिर इसे बफ़र रजिस्टर में पास करने के लिए उपयोग करता है। SSPBUF को लगातार क्लॉक पल्स में क्लियर किया जाएगा और डेटा को बिट द्वारा बस में भेजा जाएगा।
शून्य SPI_Wite (आवक) { SSPBUF = आवक; // दिए गए डेटा को बफर में लिखें }
SPI_Ready2Read ()
रीड फंक्शन के लिए तैयार एसपीआई का उपयोग यह जांचने के लिए किया जाता है कि क्या एसपीआई बस में डेटा पूरी तरह से प्राप्त हुआ है और यदि इसे पढ़ा जा सकता है। SSPSTAT रजिस्टर में बीएफ नामक एक बिट होता है जो डेटा पूरी तरह से प्राप्त होने के बाद सेट हो जाएगा, इसलिए हम जांचते हैं कि क्या यह बिट सेट है यदि यह सेट नहीं है तो हमें तब तक इंतजार करना होगा जब तक कि यह एसपीआई बस से कुछ भी पढ़ने के लिए सेट न हो जाए।
अहस्ताक्षरित SPI_Ready2Read () { if (SSPSTAT & 0b00000001) 1 लौटाएँ ; और वापसी 0; }
SPI_Read ()
SPI रीड का उपयोग SPI बस के डेटा को माइक्रोकंट्रोलर में पढ़ने के लिए किया जाता है। एसपीआई बस में मौजूद डेटा को एसएसपीबीयूएफ में संग्रहीत किया जाएगा, हमें तब तक इंतजार करना होगा जब तक पूरा डेटा बफ़र में संग्रहीत न हो जाए और तब हम इसे एक चर में पढ़ सकते हैं। हम डेटा रिसेप्शन पूरा होने के बारे में सुनिश्चित करने के लिए बफर को पढ़ने से पहले SSPSTAT रजिस्टर के BF बिट की जांच करते हैं।
char SPI_Read () // प्राप्त डेटा पढ़ें { जबकि (! SSPSTATbits.BF); // BF बिट सेट होने तक होल्ड करें, यह सुनिश्चित करने के लिए कि पूरा डेटा रिटर्न (SSPBUF) पढ़ा जाता है ; // रीड डेटा लौटाएं }
मुख्य कार्यक्रम स्पष्टीकरण:
उपरोक्त अनुभाग में बताए गए कार्य हेडर फ़ाइल में होंगे और उन्हें मुख्य सी फ़ाइल में बुलाया जा सकता है। तो चलो एक छोटा सा प्रोग्राम लिखने के लिए जाँच करें कि क्या SPI संचार काम कर रहा है। हम एसपीआई बस में कुछ डेटा लिखेंगे और यह जांचने के लिए प्रोटीस सिमुलेशन का उपयोग करेंगे कि क्या एसपीआई डिबगर में एक ही डेटा प्राप्त हो रहा है।
जैसा कि हमेशा कॉन्फ़िगरेशन बिट्स को सेट करके प्रोग्राम शुरू करते हैं और फिर हेडर फ़ाइल को जोड़ना बहुत महत्वपूर्ण है जिसे हमने प्रोग्राम में बताया गया है जैसा कि नीचे दिखाया गया है
#शामिल
यदि आपने ऊपर डाउनलोड की गई ज़िप फ़ाइल से प्रोग्राम खोला है, तो डिफ़ॉल्ट रूप से हेडर फ़ाइल आपकी प्रोजेक्ट फ़ाइल की हेडर फ़ाइल निर्देशिका के अंदर मौजूद होगी। इसके अलावा आपको अपने प्रोजेक्ट के अंदर हेडर फ़ाइल को मैन्युअल रूप से जोड़ना होगा, एक बार आपकी प्रोजेक्ट फ़ाइलें जोड़ देने के बाद यह नीचे की तरह दिखाई देगी
मुख्य फ़ाइल के अंदर हमें एसपीआई संचार के लिए मास्टर के रूप में पीआईसी को इनिशियलाइज़ करना है और फिर लूप के भीतर एक अनंत के अंदर हम एसपीआई बस में यादृच्छिक तीन हेक्स मान लिखेंगे यह जांचने के लिए कि क्या हम सिमुलेशन के दौरान समान प्राप्त करते हैं।
शून्य मुख्य () { SPI_Initialize_Master (); जबकि (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
ध्यान दें कि कार्यक्रम में उपयोग किए जाने वाले यादृच्छिक मान 0A, 0F और 15 हैं और वे हेक्स मान हैं इसलिए हमें सिमुलेशन के दौरान ही देखना चाहिए। यह वह कोड है जो सभी किया जाता है, यह सिर्फ एक नमूना है लेकिन हम अन्य MCU या SPI प्रोटोकॉल पर काम कर रहे अन्य सेंसर मॉड्यूल के साथ संवाद करने के लिए समान पद्धति का उपयोग कर सकते हैं।
SPI डिबगर के साथ सिमिंग PIC:
अब जब हमारा कार्यक्रम तैयार हो गया है तो हम इसे संकलित कर सकते हैं और फिर अनुकरण के साथ आगे बढ़ सकते हैं। प्रोटीज में एसपीआई डीबगर नामक एक अच्छी सुविधा है, जिसका उपयोग एसपीआई बस पर डेटा की निगरानी के लिए किया जा सकता है। तो हम उसी का उपयोग करते हैं और नीचे दिखाए गए सर्किट का निर्माण करते हैं।
चूंकि सिमुलेशन में केवल एक एसपीआई डिवाइस है हम एसएस पिन का उपयोग नहीं कर रहे हैं और जब उपयोग नहीं किया जाता है तो इसे ऊपर दिखाए गए अनुसार ग्राउंड किया जाना चाहिए । बस PIC16F877A माइक्रोकंट्रोलर में हेक्स फ़ाइल लोड करें और हमारे प्रोग्राम को अनुकरण करने के लिए प्ले बटन पर क्लिक करें। सिमुलेशन शुरू होने के बाद आपको एक पॉप-अप विंडो मिलेगी जो नीचे दिखाए गए अनुसार एसपीआई बस में डेटा प्रदर्शित करती है
आइए अंदर आने वाले डेटा पर करीब से नज़र डालें और जांचें कि क्या यह वही है जो हमने अपने कार्यक्रम में लिखा था।
डेटा उसी क्रम में प्राप्त होता है जो हमने अपने कार्यक्रम में लिखा था और वही आपके लिए हाइलाइट किया गया है। आप SPI प्रोटोकॉल का उपयोग करके दो PIC माइक्रोकंट्रोलर के साथ संवाद करने के लिए एक प्रोग्राम का अनुकरण करने का भी प्रयास कर सकते हैं । आपको एक PIC को मास्टर के रूप में और दूसरे को दास के रूप में प्रोग्राम करना होगा। इस उद्देश्य के लिए सभी आवश्यक हेडर फाइलें हेडर फाइल में पहले से ही दी गई हैं।
यह सिर्फ एक झलक है कि एसपीआई क्या कर सकता है, यह कई उपकरणों के डेटा को पढ़ और लिख सकता है। हम अपने आगामी ट्यूटोरियल में SPI प्रोटोकॉल के साथ काम करने वाले विभिन्न मॉड्यूलों को शामिल करके SPI के बारे में अधिक जानकारी देंगे।
आशा है कि आप इस परियोजना को समझ गए हैं और इससे कुछ उपयोगी सीखा है। यदि आपको कोई संदेह है, तो उन्हें नीचे टिप्पणी अनुभाग में पोस्ट करें या तकनीकी मदद के लिए मंचों का उपयोग करें।
पूरा मुख्य कोड नीचे दिया गया है; आप यहां से सभी कोड वाली हेडर फाइल डाउनलोड कर सकते हैं