I2C एड्रेस क्लैश को कैसे हल करें?


39

मैं पिंस के एक ही सेट पर कई I2C स्लेव डिवाइसेस को माइक्रो कंट्रोलर से कनेक्ट करना चाहता हूं लेकिन I2C डिवाइसेस सभी एक ही एड्रेस को साझा करते हैं। हार्डवेयर में पते तय होते हैं।

क्या कई उपकरणों को एक ही पते से जोड़ने का कोई तरीका है?

शायद किसी प्रकार के विन्यास योग्य पते के साथ प्रत्येक डिवाइस के साथ I2C एड्रेस ट्रांसलेशन मॉड्यूल।

जवाबों:


24

ऐसा करने के लिए I2C में कुछ भी नहीं बनाया गया है, आम तौर पर दास उपकरणों में कुछ एक्सटर्नल पिंस होंगे जो इस समस्या से बचने के लिए पते के एक जोड़े को टॉगल करने के लिए 0 या 1 पर सेट हो सकते हैं। वैकल्पिक रूप से मैंने कुछ निर्माताओं के साथ निपटाया है जिनमें एक भाग के लिए 4 या 5 भाग संख्याएँ हैं, एकमात्र अंतर इसका I2C पता है।

अधिकांश उपकरणों में विशिष्ट हार्डवेयर होता है जो I2C संचार को संभालता है, जो कि दास ACK हार्डवेयर में होता है इसलिए आप वास्तव में इसके आसपास हैक नहीं कर सकते हैं।

अनुवाद मॉड्यूल के लिए, आप 2 I2C बसों के साथ कुछ $ 0.50 PIC खरीद सकते हैं और उन्हें पता अनुवादक के रूप में कार्य करने के लिए कुछ त्वरित कोड लिख सकते हैं।


धन्यवाद। हाँ, इन उपकरणों में एक पते का चयन होता है, लेकिन केवल दो पते के बीच और मैं 5+ डिवाइस कनेक्ट करना चाहता हूं, इसलिए मैं अभी भी झड़पों को समाप्त करूंगा। मैं एक तस्वीर का उपयोग करने के बारे में नहीं सोचा था। वह काम करना चाहिए। क्या इस तरह की बात करने वाले शेल्फ से कुछ भी नहीं है?
साइमन पी स्टीवंस

11
NXP I2C के लिए मल्टीप्लेक्सर्स / स्विच का एक गुच्छा बनाता है, आप उन में से कुछ को रिग करने में सक्षम हो सकते हैं: उदाहरण के लिए ics.nxp.com/products/i2cmuxes जिसे आप अपने मामले में 3 उप शाखाओं में बना सकते हैं, प्रत्येक पर 2 डिवाइस के साथ , और अपने लक्ष्य को प्राप्त करने के लिए NXP के स्विच में से एक का उपयोग करें।
मार्क

महान, यह ठीक उसी तरह की चीज है जिसकी मुझे तलाश थी। मुझे अभी नाम नहीं पता था। धन्यवाद।
साइमन पी स्टीवंस

यह उत्तर 7 साल पुराना है, इसलिए मेरा मानना ​​है कि यह उस समय सबसे अच्छा हो सकता था जब इसे पेश किया गया था। हालांकि, अब आने वाले अन्य लोगों के लिए, बहुत से नए उत्तर (वर्तमान में सूची में कम रैंक वाले) नए घटकों के आधार पर संभावित बेहतर दृष्टिकोण प्रदान करते हैं जो अब बाजार पर हैं।
ब्रिक

6

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

एक ही पते के साथ कई I2C डिवाइस

निष्क्रिय उपकरणों के लिए एसडीए लाइन पर प्रतिरोधक बस के लिए पुल-अप के रूप में कार्य करते हैं, इसलिए सटीक मूल्य इस बात पर निर्भर करेगा कि आपके पास कितने उपकरण हैं और आपको अपने बस के लिए किस पुल-अप की आवश्यकता है। इसलिए यदि आप 10K प्रतिरोधों का चयन करते हैं, तो 3 निष्क्रिय डिवाइस एक 3K3 पुलअप देता है।

Schottky डायोड यह सुनिश्चित करता है कि डिवाइस अभी भी एसडीए लाइन को काफी कम खींच सकता है जब डेटा को होस्ट में वापस संचारित कर रहा है।


मैं सराहना करता हूं कि आपने इसका अनुसरण किया है और इसे पोस्ट किया है। यह एक बहुत सरल समाधान है, मुझे यकीन है कि यह दूसरों के लिए उपयोगी होगा।
साइमन पी स्टीवंस

एक अच्छा आला जो कुछ अनुप्रयोगों पर इस्तेमाल किया जा सकता है । मुझे बहुत पसंद है।
हैरी स्वेन्सन

5

यदि I2C उपकरणों में से कोई भी घड़ी स्ट्रेचिंग (हैंडशेकिंग) का उपयोग नहीं करता है, और यदि आप I2C मास्टर को बिट-बैंग कर रहे हैं, तो एक साधारण हैक में घड़ी और डेटा पिन स्वैप करने वाले कुछ डिवाइस हैं। एक बाइट के प्रसारण के दौरान, जिस डिवाइस में घड़ी और डेटा पिन की अदला-बदली होती है, वह प्रत्येक "0" बिट को एक गैर-ईवेंट के रूप में देखेगा (डेटा बिना किसी घड़ी के उठता और गिरता है) और प्रत्येक "1" बिट को I2C स्टॉप के रूप में देखेगा और प्रारंभ करें (जब डेटा कम हो रहा है, तो डेटा बढ़ने और गिरने से गिरता है, इसके बाद घड़ी गिरती है)। एक उपकरण के लिए जानबूझकर रुकने और शुरू होने की स्थिति को दूसरे द्वारा डेटा बिट्स के रूप में देखा जा सकता है, लेकिन जब तक कि एक डिवाइस में "1" बिट्स के बीच अत्यधिक संख्या में स्टार्ट और स्टॉप की स्थिति नहीं होती, तब तक यह संभव नहीं होगा कि कोई भी डिवाइस "गलती से" हो जाए


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

5

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

बस स्विच में आमतौर पर एक अजीब विशेषता होती है, जो I2C के लिए कोई फर्क नहीं पड़ता क्योंकि यह खुले-नाली उपकरणों का उपयोग करता है: 0 (Vss) के पास वोल्टेज को एक साथ बांधने पर एक बस स्विच में प्रतिरोध कम होता है, लेकिन वोल्टेज के दृष्टिकोण के अनुसार प्रतिरोध नाटकीय रूप से बढ़ जाता है। बिजली की आपूर्ति Vdd। (ऐसा इसलिए है क्योंकि वे मूल रूप से बिजली की आपूर्ति पर गेट वोल्टेज के साथ MOSFETs हैं, जब वे चालू करते हैं, तो जैसे कि स्विच किए गए वोल्टेज Vdd के पास आते हैं, उपलब्ध Vgs बहुत कम है)


1
लिंक टूट गया है। Fairchildsemi.com/product-technology/bus-switches बेहतर काम करता है।
फ्लोरिसला

4

मेरे पास दो TCS3414 रंग-प्रकाश सेंसर थे जिनकी मैं तुलना करना चाहता था (FN और CS पैकेज, जिनके अलग-अलग फ़िल्टर हैं)। I2C पता हार्डवेयर्ड है। यह देखने के बाद कि I2C SCL (घड़ी) और SDA (डेटा) लाइनों के संदर्भ में कैसे काम करता है, ऐसा लगता था कि SDA लाइन को बंद करने से चिप को स्टार्ट या स्टॉप बिट होने से रोका जा सकेगा और इस प्रकार यह निष्क्रिय हो जाएगा। इसलिए प्रत्येक डिवाइस पर एसडीए लाइन को चालू या बंद करने के लिए एक सीएमओएस एनालॉग स्विच (4066 बी) का उपयोग किया। यह दोनों उपकरणों के बीच स्विच करने के लिए ठीक काम किया। मुझे पता है कि यह एक हैक है, और PCA9548 ज्यादा बेहतर होगा, लेकिन मेरे पास एक भी काम नहीं था।


वास्तव में, यह बिल्कुल भी हैक नहीं है, और मैं तर्क देता हूं कि इसे स्वीकार किया जाना चाहिए। मैंने इसे कई वाणिज्यिक उत्पादों में उपयोग किया है, और मैं एक बेहतर समाधान के बारे में नहीं सोच सकता (जब तक कि आपके पास कोई GPIO उपलब्ध नहीं है और इस तरह I2C- विशिष्ट muxes जैसे शुद्ध I2C समाधान की आवश्यकता है)। अच्छे ol 'एनालॉग मक्स में काफी बैंडविड्थ होती है और यह क्रेजी-सस्ते होते हैं।
जे कार्लसन

4

अब एक जवाब है- रैखिक टेक में एलटीसी 4316/17/18 पता अनुवादकों की श्रृंखला है। वे अपेक्षाकृत नए हैं, और उपलब्धता अनिश्चित है।


बहुत ही रोचक घटक। अधिकांश I2C उपकरणों में 2 निश्चित पते हैं और यह LTC4316 एक उचित लागत में संभावित रूप से पते को दोगुना कर सकता है।
मेहरड़

4

कई निर्माता I2C बस मल्टीप्लेक्स- और स्विच आईसी की पेशकश करते हैं।

एक mux एक समय में एक चैनल को सक्रिय कर सकता है; एक स्विच कई लोगों को समानांतर में सक्षम कर सकता है।

उदाहरण के लिए एनएक्सपी , टीआई और मैक्सिम का प्रसाद देखें ।

प्रयोग के लिए, Adafruit का TCA9548a बोर्ड है

यदि आपके पास समान पते वाले 8 लक्ष्य चिप्स हैं, तो 8-से-एक MUX का चयन करें। किसी भी लक्ष्य चिप्स तक पहुँचने से पहले, सही I2C बस को सक्रिय करने के लिए MUX कॉन्फ़िगर करें।

लाभ

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

-1

एक सरल डिमक्स चिप का उपयोग करें (उदाहरण के लिए 74HC139 afaik) और I2C CLK पिन को इनपुट से कनेक्ट करें (क्योंकि I2C CLK पिन केवल आउटपुट है)। वांछित आउटपुट को नियंत्रित करने के लिए GPIO पिन का उपयोग करें। फिर I2C डेटा पिन को सभी दासों के बीच साझा किया जा सकता है।


6
SCL केवल आउटपुट नहीं है । यदि कोई इसे धीमा करना चाहता है, तो दास घड़ी को खींच सकता है ।
स्टीवनव

आप एक एनालॉग मल्टीप्लेक्सर (जो द्विदिश है) का उपयोग कर सकते हैं, लेकिन एक डिकोडर स्टीवन द्वारा बताए गए कारण के लिए काम नहीं कर सकता है। यदि आप मल्टीप्लेक्सर का उपयोग करते हैं, तो आपको यह सुनिश्चित करने के लिए दास पक्ष पर एक कमजोर पल्प की आवश्यकता होगी कि इसे निष्क्रिय रखा जाए। बस के निष्क्रिय होने पर केवल मल्टीप्लेक्स चयन को बदलें।
केविन व्हाइट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.