एसपीआई या I2C पर विचार करते समय ट्रेडऑफ?


116

SPI या I2C इंटरफ़ेस का उपयोग करने का निर्णय लेते समय मुझे क्या विचार करना चाहिए?

यह एक्सेलेरोमीटर / जाइरो ब्रेकआउट बोर्ड दो मॉडलों में उपलब्ध है, प्रत्येक इंटरफ़ेस के लिए एक। क्या किसी एक Arduino प्रोजेक्ट में एकीकृत करना आसान होगा?

http://www.sparkfun.com/products/11028

यहां छवि विवरण दर्ज करें


13
I2C और SPI के अपने स्ट्रेंथ हैं। I2C सेट-अप करने के लिए अधिक जटिल है, एक बार स्थिर होने पर आप आसानी से विस्तार कर सकते हैं (जब तक कि आपकी बस वायरिंग बहुत लंबी या बड़ी नहीं होती है)। एसपीआई स्थापित करना आसान है .. यदि आवश्यक हो तो आप इसे बहुत आसानी से बिटबैंग कर सकते हैं। विस्तार सभी चिप चयनों के साथ I / O खाती है। अगर मेरे पास I / O और कनेक्टर स्थान की विलासिता है और आपको busses की आवश्यकता नहीं है, तो मैं हमेशा SPI के साथ जाऊंगा।
हंस

I2C अधिक जटिल कैसे है? मैंने दोनों बसों का विभिन्न माइक्रो (छोटे PIC और सभ्य आकार के ARM) पर इस्तेमाल किया है और हर मामले में I2C सेटअप सरल था (यानी लिखने के लिए कम रजिस्टर)। यदि कुछ भी, घड़ी की ध्रुवता और डेटा सैंपलिंग विकल्पों के कारण SPI अधिक जटिल है।
आर्मंडस

6
@ अरमानदास - कोई रास्ता नहीं! SPI में घड़ी / डेटा ध्रुवता के लिए 4 संभावित मोड हैं, और उनमें से दो हावी हैं - लगभग सभी SPI डिवाइस एक घड़ी के गिरने के किनारे पर अपने MISO आउटपुट को अपडेट करते हैं और एक घड़ी के बढ़ते किनारे पर अपने MOSI इनपुट को पढ़ते हैं। आप डेटा शीट को देखकर कुछ मिनटों में पता लगा सकते हैं, और फिर आपका काम हो गया। यदि आप गलती से गलत मोड चुनते हैं, तो ऑसिलोस्कोप के निशान को देखने के बाद आप जल्दी से इसका पता लगा लेंगे। SPI डेटा त्रुटियां दुर्लभ हैं और I2C द्वारा किए जाने वाले तरीके से आपको अजीब स्थिति में नहीं लाती हैं।
जेसन एस

6
मैं कहता हूं कि I2c रास्ता अधिक जटिल है क्योंकि मुझे एक बार एआरएम प्रॉसीजर में एक I2C ड्राइवर लिखना पड़ा था। मैंने एनएक्सपी दस्तावेजों की राज्य मशीन का पालन किया, और यह लगभग 20 राज्यों में लंबा था। मुझे स्वीकार करने में मदद करने के लिए एक अच्छा समय लगा, जब अंतिम बाइट को पढ़ा / लिखा गया था, आदि मैंने एसपीआई के साथ इन मुद्दों में से कोई भी कभी नहीं किया है, बस घड़ी और डेटा प्राप्त करना है।
हंस

1
@JonL, अच्छी तरह से, मैं केवल एक ही हूं जिसने अब तक एक पूर्ण उत्तर दिया है, क्योंकि मैं विशेष ब्रेकआउट बोर्ड के मुद्दे पर चर्चा करने वाला एकमात्र व्यक्ति हूं जो ओपी उपयोग करना चाहता है, और इंगित करता है कि यह उपलब्ध नहीं है दोनों एसपीआई और I2C, लेकिन केवल I2C - तो वह है वह इस विशेष बोर्ड का उपयोग करना चाहता है, तो I2C उपयोग करने के लिए। अन्य लोग केवल इंटरफ़ेस (SPI या I2C) से निपटते हैं, जो कि इंटरफ़ेस से आसान है, जिसे मैंने कवर भी किया है।
tcrosley

जवाबों:


97

सारांश

  • एसपीआई तेज है।
  • यदि आपके माइक्रोकंट्रोलर में I2C नियंत्रक नहीं है, तो I2C अधिक जटिल और उपयोग में आसान नहीं है।
  • I2C को केवल 2 लाइनों की आवश्यकता होती है।

I2C एसडीए लाइन पर द्विदिश डेटा के साथ एक बस प्रणाली है। SPI अलग-अलग लाइनों (MOSI और MISO) में डेटा के साथ एक पॉइंट-टू-पॉइंट कनेक्शन है।

अनिवार्य रूप से एसपीआई में शिफ्ट रजिस्टर की एक जोड़ी होती है, जहां आप एक शिफ्ट रजिस्टर में डेटा क्लॉक करते हैं जबकि दूसरे से डेटा क्लॉक करते हैं। आमतौर पर डेटा को बाइट में हर बार 8 घड़ी दालों को उत्तराधिकार में लिखा जाता है, लेकिन यह एक एसपीआई आवश्यकता नहीं है। आप चाहें तो शब्द की लंबाई 16 बिट या 13 बिट भी कर सकते हैं। जबकि I2C में सिंक्रोनाइज़ेशन एसपीआई में स्टार्ट सीक्वेंस द्वारा किया जाता है, यह एसएस द्वारा उच्च किया जाता है (एसएस सक्रिय कम है)। आप खुद तय करें कि यह कितनी घड़ी की दाल है। यदि आप 13 बिट शब्दों का उपयोग करते हैं, तो एसएस 13 घड़ी की दालों के बाद बिट्स में अंतिम घेरने का काम करेगा।
चूंकि द्विदिश डेटा दो अलग-अलग लाइनों पर है, इसलिए इसे इंटरफ़ेस करना आसान है।

NN+3N+2

जैसे tcrosley का कहना है कि SPI I2C की तुलना में बहुत अधिक आवृत्ति पर काम कर सकता है।

I2C थोड़ा अधिक जटिल है। चूंकि यह एक बस है जिसे आपको उपकरणों को संबोधित करने का एक तरीका चाहिए। आपका संचार एक अद्वितीय प्रारंभ अनुक्रम के साथ शुरू होता है: डेटा लाइन (एसडीए) कम खींची जाती है जबकि घड़ी (एससीएल) उच्च होती है, बाकी संचार डेटा केवल घड़ी के कम होने पर बदलने की अनुमति होती है। यह प्रारंभ अनुक्रम प्रत्येक संचार को सिंक्रनाइज़ करता है।
चूंकि संचार में शामिल है, किसी भी संख्या के उपकरणों के लिए (127 तक) केवल दो पंक्तियों की आवश्यकता होती है।

संपादित करें
यह स्पष्ट है कि डेटा लाइन द्विदिश है, लेकिन यह ध्यान देने योग्य है कि यह क्लॉक लाइन के लिए भी सही है। दास बस गति को नियंत्रित करने के लिए घड़ी को खींच सकते हैं । यह I2C को स्तर-स्थानांतरण या बफरिंग के लिए कम सुविधाजनक बनाता है। (मानक मोड में SPI लाइनें सभी यूनिडायरेक्शनल हैं।)

प्रत्येक बाइट (पता या डेटा) भेजे जाने के बाद रिसीवर को एसडीए पर एक पल्स पल्स रखकर रसीद स्वीकार करनी होती है। यदि आपके माइक्रोकंट्रोलर में I2C इंटरफ़ेस है तो यह स्वचालित रूप से ध्यान रखा जाएगा। यदि आपका माइक्रोकंट्रोलर इसका समर्थन नहीं करता है, तो आप इसे अभी भी बिट-बैंग कर सकते हैं, लेकिन आपको प्रत्येक स्वीकार या डेटा पढ़ने के लिए आउटपुट से I / O पिन को स्विच करना होगा, जब तक कि आप पढ़ने के लिए I / O पिन का उपयोग नहीं करते हैं लिखने के लिए एक।

400kHz मानक I2C में SPI की तुलना में बहुत धीमी है। उच्च गति वाले I2C उपकरण हैं जो 1MHz पर काम करते हैं, 20MHz SPI की तुलना में अभी भी बहुत कम हैं।


7
मैं अभी तक एक माइक्रोकंट्रोलर से नहीं मिला हूं जो I2C के सभी कोने मामलों को संभालता है ताकि उचित त्रुटि का पता लगाने और पुनर्प्राप्ति को एक तरह से संभालने की आवश्यकता हो जो I2C विशेषज्ञ होने के बिना उपयोग करने योग्य है। मुझे हमेशा एक "स्मार्ट" I2C परिधीय से वापस नीचे गिरना पड़ता है, जब एसडीए को कम रखा जा रहा है, तो मिस-क्लॉक केस को संभालने के लिए अस्थायी रूप से बिटबैंगिंग करना, जो पूरी तरह से दर्द है ।/
जेसन एस

(लेकिन +1 चूंकि मैं आपके बाकी जवाब से सहमत हूं)
जेसन एस

उस काम के आसपास भी I2C डिवाइस 3.4MHz पर काम कर रहे हैं, लेकिन मैं अनिश्चित हूं कि क्या इन्हें धीमे उपकरणों के साथ जोड़ा जा सकता है (जैसा कि सभी उपकरणों को बस को संबोधित करने में सक्षम होने की आवश्यकता है)। मेरा यह भी मानना ​​है कि 3.4MHz I2C का समय थोड़ा अलग है।
हंस

@ हंस - एचएस I2C अधिक सामान्य 400kbit उपकरणों के साथ नीचे की ओर संगत प्रतीत होता है। सच कहूं, (पूरी तरह से अनुसंधान के बिना) मैंने कभी भी एक माइक्रोकंट्रोलर नहीं देखा है जो एचएस (अभी तक) का समर्थन करता है, इसलिए मैं इसका उल्लेख नहीं करना चाहता था।
स्टीवनव

@stevenvh: कुछ नियंत्रकों के दो-तार कार्यान्वयन (जैसे सरू पीएसओसी) के लिए आवश्यक है कि एससीके कम से कम एक या दो चक्र के लिए एक आंतरिक घड़ी के लिए कम हो इससे पहले कि वे इसे लेट जाए, और यह बुरी तरह से खराब नहीं होगा। मुझे नहीं पता कि वे सिस्टम क्लॉक पल्स के बिना I2C की शुरुआत की स्थिति का पता लगा सकते हैं और उसे क्लॉक-स्ट्रेच कर सकते हैं, लेकिन इस तरह के व्यवहार का मतलब है कि जब ऐसी चिप कम सिस्टम क्लॉक स्पीड पर चल रही हो, तो बस में सभी I2C ट्रांजेक्शन धीरे से दौड़ना)। यहां तक ​​कि 400 मेगाहर्ट्ज ऑपरेशन 3MHz पर चलने वाले PSOC के लिए बहुत तेज है।
सुपरकैट

39

(संपादित करें: स्पष्ट होने के लिए, निम्नलिखित में से कई चिंताओं को I2C / SPI उपकरणों के बोर्ड-इन-बोर्ड उपयोग के कारण संकेत अखंडता के साथ करना है, क्योंकि ओलिन सही ढंग से इंगित करता है।)

जब तक आपके पास बाधाएं नहीं होती हैं, जो आपको कम तारों की ओर दृढ़ता से धकेलती हैं (हमारे पास एक प्रोजेक्ट था जिसमें एक सीरमयुक्त रूप से सील कनेक्टर था जो प्रत्येक अतिरिक्त संपर्क महंगा था), जब संभव हो तो I2C से बचें, और एसपीआई के साथ रहें।

SPI हार्डवेयर और सॉफ्टवेयर के आधार पर निपटने में काफी आसान है। हार्डवेयर में, दो साझा डेटा लाइनें हैं, मास्टर इन स्लेव आउट (MISO या SOMI) और मास्टर आउट स्लेव इन (MOSI या SIMO), मास्टर द्वारा साझा की गई एक साझा घड़ी, और प्रति डिवाइस एक चिप का चयन करें। CS लाइन कम हो जाती है, क्लॉक साइकिल और अनिवार्य रूप से इनपुट बिट्स में शिफ्ट हो जाती है और आउटपुट बिट्स को शिफ्ट कर देती है, जब तक ट्रांजैक्शन खत्म नहीं हो जाता, जिस समय CS लाइन हाई हो जाती है। जब उनकी CS लाइन उच्च होती है, तो गुलाम उपकरण संवाद नहीं करते हैं: वे CLK और MOSI लाइनों को अनदेखा करते हैं, और अपने MISO पिन को उच्च-प्रतिबाधा अवस्था में डाल देते हैं ताकि कोई दूसरा उसका उपयोग न कर सके।

यदि आपके पास कई एसपीआई उपकरणों का उपयोग करने वाला एक माइक्रोकंट्रोलर है, और इसमें एक अंतर्निहित एसपीआई परिधीय है, तो माइक्रोकंट्रोलर के सीएस आउटपुट को एक डीमुटीप्लेक्सर (जैसे 74HC138) पर भेजें और एसपीआई लेनदेन के लिए डिवाइस का चयन करने के लिए पता लाइनों को नियंत्रित करें; आप आउटपुट के लिए उन्हें पंक्तिबद्ध करने के लिए एक रजिस्टर में शब्दों को लिखते हैं, और सीएस पिन उच्च होने के बाद उन्हें वापस पढ़ते हैं।

क्योंकि SPI सिग्नल सभी यूनिडायरेक्शनल हैं, उन्हें बफर किया जा सकता है, डिजिटल आइसोलेटर्स के साथ एक आइसोलेशन बैरियर के पार इस्तेमाल किया जा सकता है, और LVDS जैसे लाइन ड्राइवरों का उपयोग करके बोर्ड से बोर्ड पर भेजा जा सकता है। केवल एक चीज जिसके बारे में आपको चिंता करने की ज़रूरत है वह है राउंड-ट्रिप प्रचार विलंब, जो आपकी अधिकतम आवृत्ति को सीमित करेगा।


I2C एक पूरी तरह से अलग कहानी है। हालांकि यह तारों के दृष्टिकोण से बहुत सरल है, केवल दो तारों एससीएल और एसडीए के साथ, इन दोनों लाइनों को द्विदिश लाइनों को साझा किया जाता है जो बाहरी पुलअप के साथ खुले-नाली उपकरणों का उपयोग करते हैं। I2C के लिए एक प्रोटोकॉल है जो एक उपकरण पते को संचारित करके शुरू होता है, ताकि यदि प्रत्येक का अपना पता हो तो कई उपकरणों का उपयोग किया जा सके।

एक हार्डवेयर दृष्टिकोण से, सिस्टम में I2C का उपयोग करना बहुत मुश्किल है, जिसमें कोई महत्वपूर्ण शोर है। I2C लाइनों को बफर या अलग करने के लिए, आपको विदेशी आईसी का सहारा लेना होगा - हां, वे मौजूद हैं, लेकिन कई नहीं हैं: हमने एक प्रोजेक्ट पर एक का उपयोग किया और महसूस किया कि आप एक आइसोलेटर का उपयोग कर सकते हैं, लेकिन आप नहीं कर सकते श्रृंखला में दो का उपयोग करें - यह छोटी वोल्टेज की बूंदों का उपयोग यह पता लगाने के लिए करता है कि किन चीजों का ड्राइविंग अंत था, और दो श्रृंखला की बूंदें दो बहुत थीं।

I2C के तर्क स्तर थ्रेसहोल्ड Vcc पर निर्भर करते हैं इसलिए आपको वास्तव में सावधान रहना होगा यदि आप एक ही सिस्टम में 3V / 3.3V और 5V उपकरणों का उपयोग करते हैं।

कोई भी संकेत जो एक या दो फुट से अधिक की केबल का उपयोग करता है, उसे केबल समाई के बारे में चिंता करना पड़ता है। 100pf / मीटर की क्षमता मल्टीस्टोरी केबल के लिए सामान्य से बाहर नहीं है। इसके कारण आपको बस को धीमा करना पड़ता है, या कम पुलअप प्रतिरोधों का उपयोग करना पड़ता है, जो अतिरिक्त समाई को ठीक से संभालने और समय की आवश्यकताओं को पूरा करने में सक्षम हो।

तो मान लें कि आपके पास एक प्रणाली है जो आपको लगता है कि आपने अच्छी तरह से डिज़ाइन की है, और आप अधिकांश सिग्नल अखंडता के मुद्दों से निपट सकते हैं, और शोर दुर्लभ है (लेकिन अभी भी मौजूद है)। आपको किस बात की चिंता है?

त्रुटि स्थितियों का एक गुच्छा है जिसे आपको संभालने के लिए तैयार रहना होगा:

  • दास डिवाइस किसी विशेष बाइट को स्वीकार नहीं करता है। आपको इसका पता लगाना होगा और संचार अनुक्रम को रोकना और पुनः आरंभ करना होगा। (एसपीआई के साथ, आप आमतौर पर आपके द्वारा भेजे गए डेटा को वापस पढ़ सकते हैं यदि आप यह सुनिश्चित करना चाहते हैं कि यह त्रुटि के बिना प्राप्त हुआ था।)

  • आप गुलाम डिवाइस से डेटा की एक बाइट पढ़ रहे हैं, और घड़ी लाइन पर शोर के कारण डिवाइस "सम्मोहित" है: आपने उस बाइट को पढ़ने के लिए अपेक्षित 8 घड़ियां भेजी हैं, लेकिन शोर के कारण, गुलाम डिवाइस यह सोचता है को 7 घड़ियां मिली हैं, और अभी भी डेटा लाइन पर 0 को प्रसारित कर रहा है। यदि डिवाइस को 8 वीं घड़ी प्राप्त हुई थी, तो उसने डेटा लाइन को उच्च जारी किया होगा ताकि मास्टर एसीके या एनएकेटी बिट को प्रसारित करने के लिए डेटा लाइन को बढ़ा या कम कर सके, या मास्टर एक स्टॉप (पी) स्थिति को प्रसारित कर सके। लेकिन दास अभी भी डेटा लाइन को कम पकड़े हुए है, एक और घड़ी के लिए व्यर्थ इंतजार कर रहा है। यदि एक मास्टर अतिरिक्त घड़ियों की कोशिश करने के लिए तैयार नहीं है, तो I2C बस गतिरोध में फंस जाएगी। जबकि मैंने कई माइक्रोकंट्रोलर्स का उपयोग किया है जो सामान्य ACK / NACK स्थितियों को संभालते हैं,

  • वास्तव में भयानक मामला तब होता है जब एक मास्टर एक दास डिवाइस को डेटा लिख ​​रहा होता है, और दूसरा दास डिवाइस के पते की गलत व्याख्या करता है और सोचता है कि प्रेषित डेटा इसके लिए है। हमारे पास I2C डिवाइस (I / O विस्तारक) हैं जो कभी-कभी रजिस्टरों को इस वजह से गलत तरीके से सेट करते हैं। इस मामले का पता लगाना लगभग असंभव है, और शोर से मजबूत होने के लिए, आपको समय-समय पर सभी रजिस्टरों को सेट करना होगा, ताकि यदि आप इस त्रुटि में भाग लेते हैं, तो कम से कम समय की अवधि के बाद इसे ठीक किया जाएगा। (एसपीआई की यह समस्या कभी नहीं होती है - यदि आप सीएस लाइन पर गड़बड़ करते हैं, तो यह कभी भी लंबे समय तक नहीं रहेगा और आपको गलती से गलत स्लेव डिवाइस द्वारा डेटा नहीं मिलेगा।)

अगर त्रुटि का पता लगाया गया (CRC कोड) प्रोटोकॉल में इन स्थितियों में से बहुत कुछ ठीक से संभाला जा सकता है, लेकिन कुछ उपकरणों में यह है।


मुझे लगता है कि मुझे इन स्थितियों को संभालने के लिए अपने I2C मास्टर डिवाइस में जटिल सॉफ़्टवेयर का निर्माण करना होगा। मेरी राय में, यह सिर्फ तब तक इसके लायक नहीं है जब तक कि वायरिंग पर अड़चनें मुझे I2C का उपयोग करने के लिए मजबूर न करें और एसपीआई को नहीं।


5
IIC के प्रति आपकी धार्मिक नापसंदगी का यहां कोई स्थान नहीं है। IIC और SPI दोनों ही अच्छे हैं कि वे क्या करते हैं और प्रत्येक का अपना स्थान है। IIC के लिए आपकी अधिकांश आपत्तियां इसके अनुचित उपयोग से आती हैं। IIC को केवल ऑन-बोर्ड के रूप में सोचा जाना चाहिए, हालांकि यह बुद्धिमान आपूर्ति को नियंत्रित करने के लिए बिजली आपूर्ति उद्योग में नियमित रूप से उपयोग किया जाता है। यदि आप खुद को IIC बफ़र्स चाहते हैं, तो यह एक मजबूत संकेत है IIC सही समाधान नहीं है। हालांकि, IIC सभी एक ही बोर्ड पर कम गति वाले उपकरणों के लिए बहुत अच्छी तरह से काम करता है।
ओलिन लेथ्रोप

2
I2C के तर्क स्तर की सीमाएं Vcc पर निर्भर करती हैं इसलिए आपको वास्तव में सावधान रहना होगा यदि आप एक ही सिस्टम में 3V / 3.3V और 5V उपकरणों का उपयोग करते हैं । नहीं, यह गलत है। IIC लॉजिक थ्रेसहोल्ड फिक्स्ड वोल्टेज पर हैं। आप तुच्छ रूप से 5 V और 3.3 V सिस्टम को केवल 3.3 V तक खींचकर मिश्रण कर सकते हैं।
ओलिन लेथ्रोप

5
यह I2C का धार्मिक नापसंद नहीं है, यह I2C का व्यावहारिक नापसंद है। आप इसके बारे में सही हैं कि यह ऑन-बोर्ड सिस्टम के साथ बहुत आसान है; जब यह समझ में आता है तो मैं इसका उपयोग करूंगा, लेकिन यह सॉफ़्टवेयर लागत को जोड़ता है, और बहुत सारे हार्डवेयर इंजीनियर बस एक I2C डिवाइस को एक बोर्ड पर बिना ट्रेडऑफ़्स पर चर्चा किए बिना चिपका देते हैं जो अधिक सॉफ़्टवेयर सिरदर्द का कारण बनते हैं।
जेसन एस

3
IIC विद्युत को लागू करने के लिए थोड़ा आसान है, और SPI फर्मवेयर में शायद थोड़ा आसान है। दोनों हालांकि दोनों मामलों में बहुत आसान और सीधे आगे हैं।
ओलिन लेथ्रोप

2
@ ओलिन - पूर्व में निर्धारित 1.5 V थ्रेशोल्ड का उपयोग किया जा रहा है, लेकिन कल्पना के नवीनतम संस्करण के अनुसार थ्रेसहोल्ड वास्तव में 0.3 Vcc और 0.7 Vcc हैं। कल्पना के इस उद्धरण में विरासत उपकरणों के लिए 1.5 वी का उल्लेख है।
स्टीवनव

16

स्पार्कफुन में डिवाइस के लिए ब्रेकआउट बोर्ड वास्तव में केवल I2C संस्करण (MPU-6500) के लिए है। MPU-6000 संस्करण में एक ही चिप पर SPI और I2C दोनों इंटरफेस हैं, और मुझे नहीं लगता कि SparkFun में उस चिप के साथ एक बोर्ड है। इसलिए मेरा मानना ​​है कि यदि आप उस विशेष बोर्ड का उपयोग करना चाहते हैं तो आप I2C का उपयोग करने तक सीमित हैं। लेकिन मैं निम्नलिखित कारणों से आपकी स्थिति में वैसे भी I2C का उपयोग करने की सिफारिश करने जा रहा था।

सामान्य तौर पर, आप पाएंगे कि I2C बस SPI बस की तुलना में हार्डवेयर दृष्टिकोण से उपयोग करना आसान है। I2C एक 2 तार बस (SCL / SDA) है:

SCL – Serial clock.
SDA – Serial data (bidirectional).

SPI एक 4 वायर बस (SCLK / MOSI / MISO / CS) है:

SCLK– Serial clock.
MOSI – Master-out, Slave-in. Data from the CPU to the peripheral.
MISO – Master-in, Slave out. Data from the peripheral back to the CPU.
CS – Chip select.

आपके पास एक I2C बस से जुड़े कई उपकरण हो सकते हैं। प्रत्येक डिवाइस में चिप के लिए पता (एस) का अपना सेट होता है। पते को वास्तव में बस पर हर कमांड के पहले बाइट के रूप में प्रसारित किया जाता है (साथ में रीड / राइट बिट)। यह, कुछ अन्य ओवरहेड के साथ, समान कार्यक्षमता के लिए I2C बस बनाम SPI पर अधिक बिट्स भेजने की आवश्यकता होती है।

विभिन्न वर्गों के उपकरणों (मेमोरी, आई / ओ, एलसीडी, आदि) में अलग-अलग पता सीमाएं हैं। कुछ उपकरण, जो आमतौर पर एक सिस्टम में एक से अधिक बार उपयोग किए जाते हैं (जैसे कि PCF8574 I / O विस्तारक), एक या एक से अधिक पता लाइनों (PCF8574 के लिए AD0-2) का उपयोग करें, जो निम्न बिट्स को निर्दिष्ट करने के लिए उच्च या निम्न से बंधा जा सकता है पते की। MPU-6500 में एक ऐसी पता पंक्ति (AD0) है, इसलिए उनमें से दो का उपयोग एक ही प्रणाली में किया जा सकता है।

एक SPI बस में आपके पास कई डिवाइस हो सकते हैं, लेकिन प्रत्येक डिवाइस की अपनी चिप-चयन (CS) लाइन होनी चाहिए। इसलिए 4-तार वर्णन एक मिथ्या नाम है - यह वास्तव में एक तीन तार इंटरफ़ेस + प्रति उपकरण एक अतिरिक्त तार है। मैं बोर्डों के Arduino श्रृंखला के साथ अनुभवी नहीं हूं, लेकिन मेरा मानना ​​है कि यह Arduino पर SPI को अधिक कठिनाई का उपयोग कर सकता है, क्योंकि अगर आपको बहुत अधिक चिप चयन लाइनों की आवश्यकता होती है, तो यह विभिन्न ढालों द्वारा उपयोग किए जाने वाले सामान्य पिन असाइनमेंट के साथ बोझिल होना शुरू हो जाएगा। ।

मेरा मानना ​​है कि अधिकांश Arduino बोर्ड 5 वोल्ट पर चलते हैं, कुछ नए 3.3v पर चल रहे हैं। MPU-6500 3.3v पर चलता है। यदि 5v सीपीयू पर I2C बस के लिए न्यूनतम इनपुट "उच्च" वोल्टेज 3v या उससे कम है, तो आप SCL और SDA लाइनों पर 3.3v पर 10K पुलअप प्रतिरोधों को प्रदान करके स्तर रूपांतरण के मुद्दों से बच सकते हैं, क्योंकि बस खुली है। एकत्र करनेवाला। सुनिश्चित करें कि CPU पर कोई 5v इंटरनल पुलअप अक्षम हैं।

हालाँकि मैंने ATmega2560 (उदाहरण के रूप में ADK 5v Arduino का उपयोग करके) के लिए डेटाशीट की जाँच की, और इसका न्यूनतम इनपुट 'उच्च "वोल्टेज 0.7 * Vcc, या 3.5v है जो 3.3v से अधिक है। इसलिए आपको किसी प्रकार के सक्रिय स्तर की आवश्यकता है। रूपांतरण। TI PCA9306 , जिसमें चिप के 5v और 3.3v दोनों तरफ पुलअप प्रतिरोधों की आवश्यकता होती है, एकल मात्रा में सिर्फ 78 सेंट की लागत होती है।

फिर I2C पर SPI क्यों चुना? मुख्य रूप से इसलिए क्योंकि एसपीआई को कुछ मामलों में 10 मेगाहर्ट्ज तक बहुत तेजी से चलाया जा सकता है। I2C आम तौर पर 400 KHz तक सीमित है। लेकिन यह वास्तव में MPU-6050/6000 एक्सेलेरोमीटर के लिए एक मुद्दा नहीं है, क्योंकि यह I2C के लिए 400 KHz पर चलता है, और SPI के लिए केवल 1 MHz - इतना अंतर नहीं है।


3
I2C पर SPI लेने का एक और कारण: सभी लाइनें यूनिडायरेक्शनल हैं, जो लेवल शिफ्टर्स जैसी चीजों को थोड़ा आसान बनाती हैं।
चिन्हित करता है

3
I2C एसपीआई की तुलना में आसान है ?! I2C के बारे में केवल एक चीज जो आसान है वह है कनेक्टिविटी अगर आप बस एक साथ सब कुछ हुक कर सकते हैं। अन्यथा I2C में सिग्नल अखंडता मुश्किल है, और I2C में मजबूत सॉफ्टवेयर कार्यान्वयन मुश्किल है।
जेसन एस

2
@ जैसन, मैंने I2C का उपयोग करके दर्जनों एम्बेडेड सॉफ़्टवेयर प्रोजेक्ट पूरे किए हैं, और आपके पोस्ट में आपके द्वारा बताई गई लॉक-अप समस्याओं में कभी नहीं चला है। मैं आपके बुरे अनुभवों के कारण इसे पसंद नहीं कर सकता। वर्तमान में मेरे पास ऑडियो को आउटपुट करने के लिए I2C DAC का उपयोग करके बाज़ार में एक उत्पाद है, साथ ही साथ SPI पर SD कार्ड से डेटा के अगले बफ़र को पढ़ रहा है। बहुत अच्छा काम करता है। मैं DAC और SD कार्ड दोनों के लिए SPI का उपयोग नहीं कर सका क्योंकि मुझे बस सामग्री मिल रही थी और ऑडियो टूट गया। माइक्रो (कम अंत वाला) में केवल एक एसपीआई और एक I2C पोर्ट होता है।
tcrosley 5

1
मैं प्रभावित हूँ कि आप एक I2C DAC को ऑडियो आउटपुट कर सकते हैं! (क्या अधिकतम घड़ी दर है?) यदि आप ऑनबोर्ड आईसी का उपयोग कम रन के साथ कर रहे हैं, तो लॉकअप में चलने की संभावना बहुत कम है, लेकिन यह अभी भी मौजूद है। (इसके अलावा अगर आप सिर्फ I2C पर डेटा लिख ​​रहे हैं तो आप इसमें कभी नहीं चलेंगे। इसके लिए आपको एक ऐसी डिवाइस से पढ़ना होगा जो हमेशा के लिए इंतजार करने के लिए तैयार हो। यह एक लापता / अतिरिक्त घड़ी है।)
जेसन एस

1
@JasonS, ऑडियो केवल आवाज की गुणवत्ता है, 8KHz - मैं प्रत्येक 16-बिट नमूने के आउटपुट के लिए 128 का उपयोग कर रहा हूं। I2C भी अपने स्वयं के व्यवधान पर चलता है। खाली समय का उपयोग एसडी कार्ड से डेटा पढ़ने के लिए किया जाता है। लेखन को लेकर लॉकअप के बारे में अच्छी बात कभी नहीं हुई। एडीसी को छोड़कर, मैंने आमतौर पर आउटपुट उपकरणों के लिए I2C का उपयोग किया है। हालाँकि - क्या आपको Wii रिमोट और Wii Nunchuck (जो एक 3 'केबल से अधिक है) के बीच 400 KHz पर I2C के बीच रीड-ओनली इंटरफ़ेस (2 बटन, एक्सेलेरोमीटर और जॉयस्टिक) पता था? वेब पर बहुत सारी जानकारी इस उपकरण इंटरफ़ेस को हैक कर रही है।
tcrosley

15

सामान्य तौर पर, एसपीआई एक तेज बस है - घड़ी की आवृत्ति मेगाहर्ट्ज की एक सीमा में हो सकती है। हालांकि, एसपीआई को द्वि-दिशात्मक संचार के लिए कम से कम 3 लाइनों की आवश्यकता होती है और बस में प्रत्येक डिवाइस के लिए एक अतिरिक्त दास का चयन करना होता है।

I2C को केवल 2 लाइनों की आवश्यकता होती है, भले ही आपके पास कितने उपकरण हों (सीमा के भीतर, निश्चित रूप से)। गति, हालांकि, kHz की सीमा में है (100-400kHz विशिष्ट है)।

आजकल अधिकांश माइक्रोकंट्रोलर, दोनों बसों के लिए हार्डवेयर समर्थन रखते हैं, इसलिए दोनों का उपयोग करना समान रूप से सरल है।


4
@ जेसन: आपको लगता है कि IIC के खिलाफ कुछ पूर्वाग्रह हैं, लेकिन इसके कारण अन्य लोगों को मारना अनुचित है। IIC और SPI दोनों "आसान" हैं, जिनमें से प्रत्येक की अपनी झुर्रियाँ हैं। एसपीआई को अतिरिक्त लाइनें चाहिए, जो आसान नहीं हो सकती हैं। IIC थोड़ा अधिक जटिल है, लेकिन सभी फर्मवेयर कार्यान्वयन करना अभी भी आसान है, जो मैंने कई बार किया है। यह सब इतना कोड नहीं लेता है। दोनों का अपना स्थान है और दोनों ही काफी आसान हैं, किसी के लिए भी यह कारक नहीं है कि वे क्या कर रहे हैं।
ओलिन लेथ्रोप

5
@ जेसन: मैंने अभी-अभी जाँच की है, और 8 बिट PICs पर IIC के फर्मवेयर कार्यान्वयन के लिए मेरा सामान्य IIC कोड केवल 311 पंक्तियाँ हैं, और शायद उनमें से आधे से अधिक टिप्पणियां हैं। प्रारंभ, पुट, गेट, स्टॉप आदि के लिए रूटीन के स्तर पर आईआईसी बस में आपको एक प्रक्रियात्मक इंटरफ़ेस मिलता है। एक मॉड्यूल जिसे एक साधारण EEPROM ड्राइव करने के लिए 272 लाइनें हैं, फिर से 1/2 टिप्पणी शायद, और जिसमें कुछ उच्च स्तर का प्रबंधन शामिल है जैसे डिफ़ॉल्ट डेटा, UART डिबग इंटरफ़ेस, आदि। यह सब इतना तुच्छ है कि यह तर्क देता है कि क्या यह 10 निर्देश कम लेता है की तुलना में एसपीआई व्यर्थ है।
ओलिन लेथ्रोप

2
@Andrew Kohlsmith - I2C is designed for on-board applications.- जाहिर तौर पर I2C डिवाइस निर्माता आपसे असहमत हैं। TMP100 को लें । उत्पाद पृष्ठ स्पष्ट रूप से बताता है: TMP75 केThe TMP100 and TMP101 are ideal for extended temperature measurement in a variety of communication, computer, consumer, environmental, industrial, and instrumentation applications. लिए एक ही सही है
कॉनर वुल्फ

5
@FakeName तुम गलत हो; मैंने 13 साल इंडस्ट्रियल पावर इलेक्ट्रॉनिक्स में बिताए। (शुरू और निगरानी तीन चरण mtors एक बहुत शोर का माहौल है) यह SPI के बारे में अधिक विश्वसनीय नहीं है, यह योजना के बारे में सभी विफलता मोड के साथ प्रणाली को डिजाइन करने और हिसाब करने के लिए है, और पुनर्प्राप्ति विकल्प को सिस्टम में बनाया गया है जहां जरूरत है। मैंने कभी नहीं, कभी भी एक शोर स्पाइक को मेरे I2C (या उस मामले के लिए एसपीआई) को मार डाला था, लेकिन मैंने कभी भी मेरे लिए सब कुछ करने के लिए I2C नियंत्रक पर विशेष रूप से भरोसा नहीं किया। यह योजना और डिजाइन की बात है, एक बस के बेहतर होने की नहीं।
akohlsmith

2
@akohlsmith: सिंगल-मास्टर सिंगल-स्लेव I2C को "बिट-बैंग" मास्टर के साथ मजबूत होना चाहिए। यदि कई दास हैं और दो अलग-अलग तरीकों से "भ्रमित" हो जाते हैं, तो बस अपरिवर्तनीय रूप से लॉक हो सकती है (जैसे यदि दो या अधिक मेमोरी चिप्स जो कि जीरो से भरे हुए हैं, दोनों को लगता है कि मास्टर उन्हें पढ़ने की कोशिश कर रहा है, लेकिन उनके बिटर्स सिंक से बाहर हैं, तो प्रत्येक केवल एसडीए को समय के दौरान जारी करेगा जब दूसरा इसे जोर दे रहा है, और कुछ भी नहीं कर सकता है मास्टर बस को मुक्त करेगा जब तक कि यह "गुलाम" को सभी दासों को
पछाड़ने के

12

SPI को I2C की तुलना में बहुत तेज चलाया जा सकता है (कुछ SPI डिवाइस 60MHz से अधिक चलते हैं; मुझे नहीं पता कि "आधिकारिक" I2C कल्पना 1MHz से अधिक डिवाइस की अनुमति देता है)। या तो प्रोटोकॉल का उपयोग कर एक दास डिवाइस के कार्यान्वयन के लिए हार्डवेयर समर्थन की आवश्यकता होती है, जबकि दोनों "सॉफ़्टवेयर बिट-बैंग" मास्टर्स के आसान कार्यान्वयन की अनुमति देते हैं। अपेक्षाकृत न्यूनतम हार्डवेयर के साथ, एक I2C-अनुरूप दास का निर्माण कर सकता है, जो सही ढंग से काम करेगा, भले ही मेजबान मनमाने ढंग से अतिरिक्त हैंडशेकिंग तारों की आवश्यकता के बिना एक समय में 500us तक बस को अनदेखा करने का निर्णय ले सके। विश्वसनीय एसपीआई ऑपरेशन, हालांकि, हार्डवेयर समर्थन के साथ भी , आम तौर पर आवश्यकता होती है कि एक या तो एक हैंडशेक तार जोड़ें, या फिर यह कि मेजबान "मैन्युअल रूप से" प्रत्येक बाइट के बाद देरी को दास के सबसे खराब स्थिति वाले प्रतिक्रिया समय के बराबर जोड़ दे।

अगर मेरे पास मेरे शराबी, नियंत्रकों के SPI समर्थन में हैंडशेकिंग और वेक-अप क्षमताओं के साथ नियंत्रकों के बीच 8-पारदर्शी पारदर्शी द्विदिश डेटा हस्तांतरण प्रदान करने के लिए कुछ सरल अतिरिक्त विशेषताएं होंगी, तो कुल तीन यूनिडायरेक्शनल तारों (घड़ी और MOSI) का उपयोग करते हुए -गुरु से दास-दास्य]; मिस्सो [दास से दास-बाहर]। तुलनात्मक रूप से, "स्टॉक" एसपीआई पोर्ट के साथ माइक्रोकंट्रोलर्स के बीच कुशल और विश्वसनीय संचार, जब दोनों प्रोसेसर स्वतंत्र रूप से समय की मनमानी लंबाई के लिए देरी हो सकती है, शुरू करने के लिए बहुत अधिक तारों (चिप-चयन, घड़ी, एमआईएसओ, और एमओएसआई) के उपयोग की आवश्यकता होती है। इसके साथ ही, दास से किसी प्रकार के तार को स्वीकार करते हैं। यदि दास अतुल्यकालिक रूप से डेटा भेजना शुरू कर सकता है (जैसे कि किसी ने एक बटन को धक्का दिया), तो किसी को "वेकअप" के रूप में किसी अन्य तार का उपयोग करना चाहिए

I2C मेरी "बेहतर" SPI की सभी क्षमताओं को प्रदान नहीं करता है, लेकिन यह अंतर्निहित हैंडशेकिंग क्षमताओं की पेशकश करता है, जिसमें SPI की कमी होती है, और कई कार्यान्वयनों में इसे जागृत प्रदान करने के लिए kludged किया जा सकता है, भले ही मास्टर हो सॉफ्टवेयर बिट-बैंग। अंतर-प्रोसेसर संचार के लिए, इसलिए मैं एसपीआई पर I2C की दृढ़ता से सिफारिश करूंगा, सिवाय इसके कि जब एसपीआई आपूर्ति कर सकता है तो उच्च गति की आवश्यकता हो, और अतिरिक्त पिन का उपयोग स्वीकार्य हो। अंतर-प्रोसेसर संचार के लिए जहां कम पिन गणना की आवश्यकता होती है, UARTs के पास उनकी सिफारिश करने के लिए बहुत कुछ है।


I2C का एक उच्च गति संस्करण है जो 1MHz की अनुमति देता है; सामान्य I2C 400kHz है।
प्रतिरोध

@ सिद्धांत: मुझे पता है कि सामान्य I2C 400kHz था, लेकिन संस्करणों को 1MHz तक निर्दिष्ट किया गया था। मुझे नहीं पता कि क्या तेजी से संस्करण निर्दिष्ट किए गए हैं।
सुपरैट

विनिर्देश के अनुसार 400kbps (kHz नहीं, मैंने वहां गलत इकाइयों का उपयोग किया) फास्ट-मोड है, 1Mbps फास्ट-मोड प्लस है, और 3.4Mbps तक का हाई-स्पीड मोड है। अल्ट्रा-फास्ट 5Mbps तक जाता है, लेकिन यूनिडायरेक्शनल है।
प्रतिरोध

@ धन्यवाद: धन्यवाद। मैंने उन बाद के संस्करणों के बारे में नहीं सुना था। Irect यूनिडायरेक्शनल ’से आपका क्या तात्पर्य है? मुझे पता है कि SPI स्लेव-टू-मास्टर संचार की गति मास्टर-टू-स्लेव की तुलना में तेजी से जा सकती है क्योंकि दास को मास्टर के बाद अपनी घड़ी प्राप्त करने की गारंटी है, लेकिन मैं I2C के लिए एक समान अवधारणा के बारे में निश्चित नहीं हूं। एक कड़ी मिल गई?
सुपरकाट

यहां युक्ति खोजें । पृष्ठ 23 पर यह कहता है कि अल्ट्रा-फास्ट का उपयोग उन उपकरणों के लिए किया जा सकता है जो डेटा वापस नहीं भेजते (केवल लिखते हैं), यहां तक ​​कि एसीके भी नहीं।
प्रतिरोध

8

इस सवाल का यहाँ के उत्कृष्ट उत्तरों में अच्छी तरह से पता लगाया गया है, लेकिन शायद आई 2 सी को देखने का एक और बिंदु है मैं एक चिप निर्माता के दृष्टिकोण से पेश कर सकता हूं।

I 2 C का इलेक्ट्रिकल इंटरफ़ेस एक ओपन कलेक्टर है । अब सांस लें और निहितार्थ के बारे में सोचें। I 2 C का उपयोग करते हुए , मैं एक चिप डिजाइन कर सकता हूं जो बस के ऑपरेटिंग वोल्टेज के लिए पूरी तरह से अज्ञेयवादी है। अगर मुझे ऐसा करने की आवश्यकता हो तो मुझे एसडीए लाइन को खींचने की जरूरत है, और एससीएल और एसडीए के वोल्टेज की तुलना कुछ जमीन से संदर्भित थ्रेशोल्ड वोल्टेज से करें, जिसे मैं चुन सकता हूं। और अगर मैं सामान्य उच्च पक्ष संरक्षण संरचनाओं को छोड़ देता हूं और उन्हें अन्य संरचनाओं के साथ बदल देता हूं, तो मैं एक चिप बना सकता हूं जो पूरी तरह से बाकी सिस्टम से खुद का जीवन जी सकता है - एससीएल, एसडीए कभी भी मेरी चिप को चालू नहीं करता है और मैं निश्चित रूप से उन पिंस के लिए किसी भी वर्तमान फ़ीड नहीं होगा। यही कारण है कि यह वास्तविक समय की घड़ियों और उस जैसे अन्य कम बिजली के सामान के लिए इतनी अच्छी बस है।


4

एक बात जो मैंने अन्य उत्तरों में नहीं देखी है वह यह है कि I2C एक ही बस में कई मास्टर्स का समर्थन करता है। यदि आपको द्विदिश संचार की आवश्यकता है और मतदान-आधारित पद्धति का उपयोग नहीं करना चाहते हैं, तो I2C को काम मिल जाएगा।

अधिक दूरी पर, CAN में समान क्षमता हो सकती है और अधिक मजबूत होती है। लेकिन CAN एक अतुल्यकालिक प्रोटोकॉल है जिसमें हार्डवेयर समर्थन और ट्रांसीवर की आवश्यकता होती है, इसलिए यह कम-लागत प्रणाली में एक विकल्प नहीं हो सकता है।


अच्छा बिंदु (मल्टी मास्टर पर), मैंने एसपीआई उपकरणों को भी बाधित पिंस के साथ देखा है, जबकि एक डिवाइस अभी भी मास्टर है, दोनों तुरंत (द्वि-दिशात्मक) संचार को बाधित कर सकते हैं। दूरस्थ उपकरणों के लिए, निश्चित रूप से अधिक ठोस और बेहतर विकल्प हैं (जैसे कि CAN)।
पॉल

0

जब भी सिंक घड़ी बढ़ रही हो, SPI प्रोटोकॉल का उपयोग करें और अपने बिट्स को सीधे डिवाइस पर लिखें। एक्सनोर लॉजिक सर्किट का उपयोग मेमोरी से "होममेड" पते को मिलान करने के लिए किया जा सकता है ताकि वांछित डिवाइस का चयन किया जा सके जैसे कि यह i2 डिवाइस था।

I2c डिवाइस के प्रारूप के अंदर आधिकारिक सर्किट को एकीकृत कर रहा है, मानक ... आदि जटिल और अलग-अलग हैं, एक स्पाई के साथ आप स्क्रीन पर एक वीडियो प्रदर्शित करने के लिए एक स्पाई मेमोरी का उपयोग कर सकते हैं, लेकिन i2c नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.