I2C भारी बाधा लोड के तहत विफलता को पढ़ता / लिखता है


10

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

अपडेट करें:

प्रोसेसर STM32 है। व्यवधान ADC के कारण हैं, मैं पढ़ने की घटनाओं के दौरान व्यवधान को अक्षम नहीं कर सकता इसलिए मुझे एक समाधान खोजना होगा जहां मैं i2c संचार को अधिक स्थिर बना सकता हूं। STM32 मास्टर है और दास एक और डिवाइस (एक्सेलेरोमीटर) है।

Update2:

जब मैं एक लॉजिक एनालाइज़र को एक छोटी फ्लाइंग केबल के साथ घड़ी से जोड़ता हूं, तो समस्या गायब हो जाती है। दिलचस्प बात यह है कि कोई रुकावट लोड नहीं है, पढ़ा हुआ काम अच्छी तरह से होता है, जब कोई रुकावट लोड होती है, तो वे नहीं करते हैं। हालाँकि, अगर मैं घड़ी को जांच संलग्न करता हूं, तो रुकावट लोड के तहत लेखन कार्य पढ़ें। मुझे लगता है, कहीं न कहीं समाई मुद्दा है।


1
आपका प्रश्न बहुत ही सामान्य है क्योंकि यह सब आपके सिस्टम के डिजाइन पर निर्भर करता है। I2C कैसे वास्तव में बस पर उपकरणों पर निर्भर करता है। क्या आप उन्हें अनदेखा कर सकते हैं और बाद में आ सकते हैं? एक FPGA में, आप अपने लिए बहुत देखभाल करने और इससे बचने के लिए तर्क डिजाइन कर सकते हैं। फिर, हमें माइक्रोकंट्रोलर और आपके पास और क्या चीजें हैं, इसके बारे में अधिक जानकारी चाहिए। आमतौर पर एक अच्छा समाधान यहां आरटीओएस का उपयोग करना और कार्यों को ठीक से डिजाइन करना है।
गुस्तावो लिटोव्स्की

देखने के लिए दो चीजें, वोल्टेज आपके आई 2 सी मास्टर और गुलाम, या ईएमआई या कैपेसिटेंस मुद्दों पर पावरप्ले में गाती है। रुकावट लोड के लिए, क्या आपका मतलब है कि आपका मास्टर एक बाधा को संभालने के लिए रोक रहा है? कुछ चिप्स अनंत घड़ी फैलाने की अनुमति नहीं देंगे।
राहगीर

@GustavoLitovsky आप सही हैं, लेकिन 80% CPU चक्र ADC की बाधा उत्पन्न कर रहे हैं और गैर ISR विंडो के दौरान पढ़ने के लिए पर्याप्त समय नहीं है। तो रीड को बाधित किया जाएगा चाहे मैं कितनी अच्छी तरह से ओएस सिस्टम को डिजाइन करूं।
Ktc

@Passerby आप सही हो सकते हैं। समस्या गायब हो गई जब मैंने लॉजिक एनालाइज़र की जांच को क्लॉक लाइन से जोड़ा।
Ktc

पुल-अप के लिए आपका वर्तमान मूल्य क्या है। क्या आपने उन्हें एक अलग मूल्य में बदलने की कोशिश की है? (पहले अनुमान के लिए 10k या 4k7 या 2k आज़माएं)
टॉम एल

जवाबों:


9

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

पहला: आपको इंटरप्ट्स में जितना संभव हो उतना कम करने की ज़रूरत है, केवल डेटा को पढ़ें और संग्रहीत करें, कोई भी प्रसंस्करण न करें जो आप ISR के बाहर कर सकते हैं, गणित सीपीयू चक्रों का एक बहुत ले सकते हैं और सीपीयू कुछ और नहीं कर सकता है जबकि उस रुकावट में।

दूसरा: चीजों को स्वचालित करने के लिए डीएमए की जांच करें, इसलिए आपकी रुकावट लगभग एक पृष्ठभूमि स्वचालित प्रक्रिया बन जाती है।

तीसरा: यदि I2C महत्वपूर्ण है, तो THAT को एक बाधा में भी डालें, लेकिन सुनिश्चित करें कि आप प्राथमिकताओं को पूरा करते हैं!

चौथा: अपनी I2C दिनचर्या क्यों विफल हो रही है, I2C खुद बहुत रुक-रुक कर समय, ठहराव और इंतजार आदि के लिए खड़ा हो सकता है, इसलिए आपकी दिनचर्या को इसे अनुमति देने के लिए संशोधन की आवश्यकता हो सकती है।

पांचवां: देखें कि क्या आप "चेन" को बाधित कर सकते हैं, तो आप पा सकते हैं कि आप ADC को और अधिक कुशलता से पढ़ सकते हैं, या ADC को एक अलग मोड में रख सकते हैं, जहाँ यह आपके लिए अधिक काम करता है, बीच में आने से पहले (ईजी के सभी रीडिंग उपलब्ध होने की प्रतीक्षा करें) तब सभी एक हिट में पढ़ें, 8 अलग-अलग एडीसी चैनल के लिए 8 अलग-अलग व्यवधानों के बजाय पढ़ता है)।

छठा: एक आस्टसीलस्कप या लॉजिक एनालाइज़र का उपयोग करें, और बोर्ड पर मौजूद IO पिन को यह पता लगाने के लिए कि प्रत्येक बिट कोड में आप कितना समय बिता रहे हैं, यह देखने के लिए कि क्या आप इसे गति दे सकते हैं। (जब आप किसी फ़ंक्शन / ISR में प्रवेश करते हैं, तो पिन को हाई सेट करें, इसे बाहर निकलने पर फिर से कम सेट करें)।

सातवाँ: यह तय करें कि क्या आपको वास्तव में एडीसी को पढ़ने की ज़रूरत है, क्या धीमी गति से काम करना बदतर हो जाएगा? यह काउंटर-सहज है, लेकिन कभी-कभी धीमी गति से चलने वाला वास्तव में अच्छे परिणाम देता है, जो आपके लिए सिग्नल के औसत का काम करता है और स्पाइक्स / ट्रांजिस्टर पर कटौती करता है जो समस्याओं का कारण बन सकता है या हटाने के लिए अतिरिक्त प्रसंस्करण की आवश्यकता हो सकती है। हमने प्रक्रिया में सीपीयू समय का एक भार मुक्त करते हुए, इसे केवल 1/4 गति से चलाकर एक मोटर नियंत्रण पीआईडी ​​दिनचर्या में सुधार किया।


सुझाव के लिए धन्यवाद। समस्या किसी तरह हार्डवेयर की ओर इशारा करती है।
Ktc

4

एक बस गुलाम जो अन्य चीजों के साथ व्यस्त है, समय को खरीदने के लिए स्ट्रेच को देखने की क्षमता रखता है जब तक कि वह संचार के अंत तक ले जाने में सक्षम न हो। यह ACK / NACK क्लॉक पल्स को तुरंत नहीं भेजता है, संचार को एक मध्यवर्ती स्थिति में रखता है जब तक कि वह जवाब देने के लिए तैयार न हो।

इस तरह की स्थिति से निपटने के लिए क्लॉक स्ट्रेचिंग उपयुक्त तरीका है। ऐसा उपकरण जो अन्य खराब चीजों को फैला नहीं करता है और करता है (बस हैंग / रिस्टार्ट, NACKs एक वैध पता या कमांड, आदि) समस्याग्रस्त हो सकता है, और चीजों को छांटने के लिए मास्टर पर अतिरिक्त बोझ डालता है (इसे कमांड्स को दोहराना है , NACKs का ट्रैक रखें, आदि)


आप सही हैं लेकिन समस्या मेजबान है। मेजबान अन्य चीजों के साथ व्यस्त है, दास नहीं। इतना निश्चित नहीं कि मैं एक घड़ी का खिंचाव कर सकता हूं।
Ktc

क्या आप जहाज पर I2C हार्डवेयर का उपयोग कर रहे हैं या GPIO लाइनों के बाहर प्रोटोकॉल को बिट-बैंग कर रहे हैं? मानक में परिभाषित कोई विशिष्ट I2C टाइमआउट अंतराल नहीं है, इसलिए दास को एक पैकेट को खत्म करने के लिए अनिश्चित काल तक इंतजार करना चाहिए।
एडम लॉरेंस

मैं STM32 IC2 API का उपयोग करता हूं। कृपया अद्यतन देखें, यह समाई समस्या की तरह दिखता है।
Ktc

1

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

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

  • बाधित हैंडलर लंबे समय तक नहीं होना चाहिए। रुकावट वेक्टर से जितना संभव हो उतना कम करने की कोशिश करें। इंटरप्ट करने के लिए चरम न्यूनतर दृष्टिकोण है कि बस बाधा हैंडलर रूटीन के भीतर से एक ध्वज सेट करें और कहें, मुख्य लूप वहां से सभी भारी भार उठाते हैं। आपके विशिष्ट एप्लिकेशन और फ़र्मवेयर वास्तुकला की आवश्यकता उतनी सरल नहीं हो सकती है। लेकिन, यह वास्तव में यह देखने के लिए सार्थक है कि इंटरप्ट के भीतर से वास्तव में कितना कुछ किया जाना है।

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

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

संपादित करें: समस्या के इस उदाहरण के बारे में कुछ विशिष्ट नोट्स, प्रश्न पर आपकी टिप्पणी से:

  • एडीसी को पढ़ने के लिए उपयोग किए जाने वाले 80% सीपीयू का होना आमतौर पर एक सार्थक बात नहीं है। यदि आप इस पर कार्रवाई नहीं कर सकते हैं या डेटा को बचा भी सकते हैं तो डेटा एकत्र करना बेकार है।
  • यहां तक ​​कि अगर आप किसी तरह से (उपयोगी) डेटा एकत्र कर रहे हैं, तो एडीसी इंटरप्ट इतना लंबा नहीं होना चाहिए कि डेटा खो जाने के लिए I2C परिधीय को लंबे समय तक पूरी तरह से दबा सके। I2C अधिकतम 100 / 400KHz पर चलता है। आपको I2C पर घड़ी के घबराने की तुलना में कुछ अधिक गंभीर दिखने के लिए वास्तव में लंबे समय तक बाधित करने के लिए वास्तव में लंबे अंतराल की आवश्यकता होगी।

धन्यवाद। हमारे सिस्टम को इस प्रकार के जटिल और लंबे ISR की आवश्यकता है, यह एक लंबी कहानी है। हालांकि आप सही हैं, I2C को इस बाधा लोड के तहत भी बनाए रखना चाहिए और यह नहीं हो सकता। मुझे संदेह है कि समस्या हार्डवेयर में है, अपडेट देखें।
Ktc

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

0

किसी दिए गए सिस्टम में, घड़ी और डेटा बसों में प्रवेश करने का शोर हो सकता है। तथ्य यह है कि आपके तर्क anlayser समस्या को दूर करता है यह दिखाता है। व्यावहारिक और त्वरित कार्यान्वयन के लिए, बस अपने अवलोकन द्वारा दिए गए क्यू का पालन करें। 400kbit / sec कार्यान्वयन के साथ एक i2c बस पर, इसी तरह के अवलोकन के आधार पर, मैंने घड़ी और डेटा बिंदुओं से ग्राउंड के लिए 12pf के साथ 2M पैरेंट को जोड़ा और पाया कि समस्या हल हो गई है। यह विशिष्ट i2c संचार के लिए आवश्यक ब्याज बैंड के बाहर शोर को निकालता / फ़िल्टर करता है। कृपया कोशिश करें और सलाह दें।

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