OR के रूप में साझा बस अधिनियम बनाना


10

अधीर के लिए, आप पृष्ठभूमि को छोड़ सकते हैं।

पृष्ठभूमि

मैं माइक्रोकंट्रोलर्स का एक सेट प्रोग्रामिंग कर रहा हूं जो एसपीआई के साथ संवाद करता है। एक मास्टर और nदास हैं जो बस को साझा करते हैं। कोई चिप चयन नहीं है। (यह एक बुरा डिज़ाइन नहीं है, लेकिन nबड़ा है और nअतिरिक्त लाइनों के लिए पर्याप्त जगह नहीं है )।

इसलिए दासों की जिम्मेदारी है कि वे अपने MISO को उच्च प्रतिबाधा में रखें और उनमें से अधिकांश पर बोलें। यह केवल उनकी आईडी के प्रदूषित होने पर प्रतिक्रिया देकर किया जाता है।

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

इस समस्या को हल करने के लिए, मैंने बाइनरी खोज की एक विविधता तैयार की, जहां दास सामूहिक रूप से प्रतिक्रिया देते हैं और मास्टर न्यूनतम आईडी को जल्दी से ढूंढने में सक्षम है। उस आईडी के साथ दास को भाग नहीं लेने के लिए कहा जाता है और एल्गोरिथ्म दोहराता है। (विवरण महत्वहीन)।

हालांकि एक समस्या है। सामूहिक प्रतिक्रिया को सभी प्रतिक्रियाओं का तार्किक या (या तार्किक और) होना चाहिए। मुझे बताया गया है कि लाइन को इस तरह से कॉन्फ़िगर किया जा सकता है कि MISO बस तार्किक या के रूप में कार्य कर सके। मुझे बताया गया है:

  • पुल-अप और के रूप में मास्टर पर MISO सेट करें
  • हर गुलाम को ओपन-ड्रेन के रूप में MISO सेट करें।

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

नोट: उच्च-प्रतिबाधा के रूप में मास्टर पर MISO को कॉन्फ़िगर करना और प्रत्येक को पुश-पुल के रूप में दास करना, मैं उनमें से प्रत्येक से व्यक्तिगत रूप से बात कर सकता हूं, भले ही उनमें से कई एक ही बस में हों। मेरा मतलब है, मुझे संदेह है कि यह लाइन की समस्या है।

सवाल

मेरा सवाल है, अगर यह बिल्कुल संभव है, और यदि ऐसा है, तो मैं मास्टर और दासों के इनपुट और आउटपुट पिन को कैसे कॉन्फ़िगर कर सकता हूं ताकि साझा MISO लाइन तार्किक या (या तार्किक और) के रूप में कार्य करे?


संपादित करें

  1. यह नकारात्मक-सच्चे तर्क (मूल रूप से एक) के साथ एक हो जाता है।

  2. मास्टर पर पुल-अप पिन 1 लिखने के साथ एकल दास के साथ समस्या का समाधान किया गया था। पहले इसमें 0 की प्रारंभिक अवस्था थी।

संपादित करें २

एसटी गुलाम ने एमआईएसओ के मेरे जीपीआई कॉन्फ़िगरेशन को ओपन-ड्रेन के रूप में ओवरराइड किया और जब इसे लिखा गया था तो यह उच्च बल दे रहा था। मैंने SPI को साइलेंट करने और इस विशेष मामले में MISO को मैन्युअल रूप से आउटपुट करने का संकल्प लिया।


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

@ बूब, हाँ। वे बहुत धीमे हैं। वैसे भी, अगर मेरे सवाल का जवाब "यह असंभव है", तो हमें बस थोड़ा सा मैनुअल काम करना होगा, लेकिन फिर भी एसपीआई के साथ अंतिम उत्पाद बहुत बेहतर है।
शहबाज

1
यह अफ़सोस की बात है कि आप पते के रूप में 32 बिट्स का उपयोग कर रहे हैं क्योंकि यदि आप 24 बिट्स (16,772,216 रूपांतरों) का उपयोग कर रहे थे, तो आप "खोज" कमांड भेज सकते थे और 16,772,216 घड़ियों का इंतजार कर सकते थे और आपके पास आपकी सभी दास जानकारी हो सकती थी। 10Mbps पर 2 सेकंड से कम समय लगेगा और यह पता लगाने के लिए कोई संघर्ष नहीं होगा। हे हो - तुम मुझे सोच रहे हो तो उसके लिए +1।
एंडी उर्फ

@Andyaka, 24 बिट्स भी खराब नहीं हो सकते हैं (लेकिन 32 बिट्स निश्चित रूप से बेहतर हैं)। अगर मैं आपको सही तरीके से समझाऊं, तो इसका मतलब है कि प्रत्येक दास 1 के साथ अपनी आईडी घड़ी पर प्रतिक्रिया करता है और मास्टर देखता है कि कौन सी घड़ियां उत्पन्न हुईं? यह बुरा नहीं है, सिवाय बाइट्स में प्रतिक्रिया के। इसलिए प्रत्येक दास 8 बिट्स के साथ प्रतिक्रिया करता है, और जब तक कि मैं बस के रूप में कार्य नहीं कर सकता या, अभी भी एक गुलाम से प्रतिक्रिया दूसरे गुलाम द्वारा प्रतिक्रियाओं के भीतर "खो" जाती है (एक दास से 1 सब से 0 एस द्वारा नीचे खींच लिया जाता है बाकी)।
शहबाज

@ शहबाज यदि आपके पास दास के कोड पर नियंत्रण है तो आप इसे "विशेष" बना सकते हैं जहां दास केवल अपने आवंटित समय पर 1 बिट के साथ प्रतिक्रिया करता है। हाँ, तुम्हें मेरी मुसकान का जंजाल मिल गया।
एंडी उर्फ

जवाबों:


5

आपका SPI-without-select वही है जो माइक्रोचिप उनके MCP23017 चिप्स (और अन्य) पर उपयोग करता है। उस दृष्टिकोण के साथ कुछ भी गलत नहीं है।

हां, आप जो चाहते हैं वह संभव है, लेकिन आपको दासियों को खुले में शौच से मुक्त होना चाहिए। यदि आप उन्हें खुले-नाली के रूप में व्यवहार करने के लिए नहीं प्राप्त कर सकते हैं, तो प्रत्येक आउटपुट के साथ श्रृंखला में एक (schottky) डायोड डालकर धोखा दे सकते हैं।

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

लेकिन आपके दृष्टिकोण का एक गंभीर दोष यह है कि गति अब वृद्धि के समय तक सीमित है, पुल-अप रोकनेवाला द्वारा संचालित। यह एक पुश-पुल आउटपुट द्वारा संचालित होने की तुलना में धीमा होगा, और संभवतः उस गति को सीमित कर देगा जिस पर आप बस को संचालित कर सकते हैं।

यदि आपके पास प्रत्येक गुलाम पर स्पेयर करने के लिए दो पिन हैं, तो आप उन्हें डेज़ी-चेन कर सकते हैं, और डेज़ी श्रृंखला में उनके स्थान के आधार पर एक गणना योजना है।


हां मैं उल्लेख करना भूल गया था मुझे यह भी बताया गया था कि मुझे गति कम करने की आवश्यकता थी (जो मैंने लगभग 20 गुना (4Mpbs से 128Kbps तक) किया था)। हालांकि यह एक प्रारंभिक चरण है और मेरा एल्गोरिथ्म धीमी गति से निपट सकता है (यह अभी भी काफी तेज है)। दुर्भाग्य से, मुझे संदेह है कि अब हम हार्डवेयर को फिर से डिज़ाइन करेंगे। लागत केवल इस चरण को अनदेखा करने और मास्टर को यह बताने से अधिक है कि क्या अपेक्षा की जाती है।
शहबाज

प्रश्न पर वापस, मैंने पहले से ही दासों को खुले-नाली के रूप में कॉन्फ़िगर किया है। मुझे मास्टर को कैसे कॉन्फ़िगर करना चाहिए?
शहबाज

1
मास्टर के MISO पिन पर कुछ खास नहीं, सिवाय पुलअप के। मुझे संदेह है कि आप पुल-अप डिज़ाइन के साथ 128Kbps तक पहुंच जाएंगे, लेकिन YMMV। कुछ गहराई से I2C दस्तावेज़ पढ़ने में मदद मिल सकती है, यह एक तार या पुल-अप बस है, इसलिए वहां लागू हर चाल आपकी मदद कर सकती है।
राउटर वैन ऊइजेन

बहुत बहुत धन्यवाद। मैं बस को धीमा करने की कोशिश करूंगा कि आगे क्या होता है। मुझे लगता है कि मुझे अंततः अध्ययन करना और समझना होगा कि ये पुल-अप, ओपन-ड्रेन और अन्य वास्तव में क्या मतलब है। (सॉफ्टवेयर इंजीनियर यहाँ!)
शाहबाज़

1
बस पर एक आस्टसीलस्कप रखो और जांचें कि क्या होता है। उदय का समय बहुत धीमा हो सकता है, लेकिन वहाँ भी बज सकता है।
राउटर वैन ओइजेन सेप

4
  • पुल-अप और के रूप में मास्टर पर MISO सेट करें
  • हर गुलाम को ओपन-ड्रेन के रूप में MISO सेट करें।

मैंने यह कोशिश की है, लेकिन एक भी दास के साथ, यह कॉन्फ़िगरेशन काम नहीं करता है (आस्टसीलस्कप लाइन पर एक निरंतर शून्य दिखाता है)।

आपको यह जांचने की आवश्यकता है कि पुल-अप मोड में मास्टर i / o पिन के बराबर प्रतिरोध क्या है।

आमतौर पर, पुल-अप मोड में बहुत अधिक प्रतिरोध होता है, शायद 50 khhms या इससे अधिक। इसका उद्देश्य ईएमआई या अन्य शोर के कारण पिन को गड़बड़ करने से रोकना है, या बहुत धीमी गति से नियंत्रण संकेतों के लिए डिफ़ॉल्ट सेट करना है, और साथ ही ऐसा करने में बहुत अधिक शक्ति बर्बाद नहीं करना है।

जैसा कि राउटर ने बताया, एक खुली-नाली बस में गति को पुल-अप रोकनेवाला द्वारा सीमित किया जाता है। उच्च अवरोधक मान बस को धीमा बनाते हैं। I2C में विशिष्ट मूल्य (जो 100 या 400 kHz हो जाता है) 1 से 5 kOhms हैं। आप एक समान गति प्राप्त करने के लिए एक समान पुल-अप प्रतिरोध चाहते हैं।

मुझे लगता है कि आपको इस योजना को बनाने के लिए मास्टर के i / o पिन पुल-अप के बजाय एक बाहरी पुल-अप रोकनेवाला (1 से 5 kOhms या ऐसा करने के लिए) का उपयोग करने की आवश्यकता है।


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

यदि आपके पास मास्टर माइक्रो पर एक मुफ्त i / o पिन है, तो आप इसे 5 kOhms के माध्यम से बस से जोड़ सकते हैं। फिर बस एन्यूमरेशन के दौरान इसे हाई करें और सामान्य कम्युनिकेशन के दौरान इसे हाई-जेड में बदल दें।
द फोटॉन

1

काम करने के लिए एक वायर्ड-और बस के लिए, बस में नोड्स को खुले-नाली होने की आवश्यकता होती है, अर्थात उन्हें प्रसारित करना होगा

  • दृढ़ता से नीचे खींचकर तर्क कम, और
  • बस से डिस्कनेक्ट करके तर्क उच्च।

इसके अलावा, बस को कमजोर रूप से ऊपर खींचा जाना चाहिए।

अजीब व्यवहार जिसे आप एक एकल गैर-ट्रांसमिटिंग मास्टर के साथ देखते हैं और एकल ट्रांसमिटिंग दास को या तो मास्टर द्वारा दृढ़ता से खींचकर या कमजोर रूप से खींचने वाले दास द्वारा समझाया जा सकता है।

आपको यह निर्धारित करने की आवश्यकता है कि उपरोक्त में से क्या हो रहा है।

दास को उच्च-प्रतिबाधा मोड में डालें और 10k रोकनेवाला के माध्यम से जमीन से कनेक्ट करें। यदि लाइन वोल्टेज में काफी बदलाव नहीं होता है, तो मास्टर मजबूती से खींच रहा है और आपको इसे ठीक करने की आवश्यकता है। अन्यथा, दास के साथ एक ही प्रक्रिया करें (इस समय अवरोधक को Vcc से कनेक्ट करें); यदि लाइन वोल्टेज काफी बढ़ जाता है, तो दास कमजोर रूप से नीचे खींच रहा है (इसे ठीक करें)। अन्यथा, अपने आस-पास के क्षेत्र में समय-स्थान की विकृतियों की तलाश करें।


इलेक्ट्रॉनिक्स में मेरी अज्ञानता का बहाना है, लेकिन अगर गुलाम दृढ़ता से नीचे खींचता है, तो क्या यह बस के रूप में कार्य नहीं करता है? मैं यह कह रहा हूँ कि जो दास चाहते हैं वे उच्च काट रहे हैं और जो कम चाहते हैं वे नीचे खींच रहे हैं, इसलिए समग्र परिणाम नीचे है, नहीं?
शाहबाज

@ शहबाज, मेरा बुरा, बेशक बस तार-तार हो जाएगा और, मैंने जवाब तय कर दिया। यदि आप वायर्ड-या चाहते हैं, तो बस ध्रुवीयता को उल्टा कर दें (मास्टर कमजोर रूप से नीचे खींचते हैं, दास दृढ़ता से खींचते हैं)।
14

विकिपीडिया में पढ़ना, मुझे एहसास हुआ कि वे इसे वायर्ड-एंड या वायर्ड के रूप में संदर्भित करते हैं या नकारात्मक-सच्चे तर्क के साथ।
शहबाज

1

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


यदि दो दास सक्रिय रूप से उच्च और निम्न ड्राइव करते हैं, तो मुझे बस से पढ़ने की क्या उम्मीद है?
शहबाज

एक को कभी भी उच्च ड्राइविंग करने की कोशिश करने वाले एक दास से बचना चाहिए, जबकि दूसरा कम चला रहा है। एक गुलाम को बस को तब चलाना चाहिए जब या तो (1) यह जानता है कि ऐसा करने वाली एकमात्र चीज होगी, या (2) यह जानता है कि यह और बाकी सभी जो बस चला रहे हैं, वह इसे अपनी निष्क्रिय मूर्ति के विपरीत चला रहे हैं। राज्य।
सुपरकट

फिर इसका क्या मतलब है? ... प्रत्येक चयनित दास सक्रिय रूप से उच्च और निम्न दोनों स्तरों पर ड्राइव करता है, जिससे बस में जाने की अनुमति मिल सके ...
शहबाज

@ शहबाज: जब किसी दास के पास कहने के लिए कुछ होता है, तो उसे सक्रिय रूप से बस को "1" बिट्स और निम्न को "0" बिट्स प्रसारित करने के लिए ड्राइव करना चाहिए। जब किसी दास के पास कहने के लिए कुछ नहीं होता है, तो उसे बस को नहीं चलाना चाहिए। ध्यान दें कि दास सक्रिय रूप से बस को उच्च ड्राइव करते हैं जब वे "1" बिट भेजना चाहते हैं बस बस को उच्च ड्राइव करने के लिए एक निष्क्रिय पुल-अप पर निर्भर होने की तुलना में बहुत तेज़ी से संचालित करने की अनुमति देगा।
सुपरकाट

@ शहबाज: सुपरकैट क्या कहना चाह रही है, वह यह है कि एन्यूमरेशन अवस्था में, एक अवरोधक को लाइन खींचनी चाहिए, और दासों को केवल "0" या कुछ भी नहीं (ओपन ड्रेन आउटपुट) भेजना चाहिए, लेकिन बाद में, सामान्य संचार में, केवल एक एकल दास को एक समय में सक्रिय होना चाहिए, और सक्रिय दास को "0" या "1" (सामान्य आउटपुट) भेजना चाहिए। इस प्रकार पुल-अप रोकनेवाला और लाइन समाई केवल गणना के दौरान बिट दर को सीमित करता है। बाद में, सामान्य संचार में, बिट दर अधिक हो सकती है, जैसा कि सक्रिय ड्राइविंग अनुमति देता है।
लास्ज़्लो वल्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.