(संपादित करें: स्पष्ट होने के लिए, निम्नलिखित में से कई चिंताओं को 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 का उपयोग करने के लिए मजबूर न करें और एसपीआई को नहीं।