FT2232H चिप (MPSSE मोड) पर आधारित I2C इंटरफ़ेस का कार्यान्वयन

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

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

दो I2C चैनलों के स्वतंत्र संचालन का समर्थन किया जाता है (FT232H के लिए एक चैनल)। एएन 113 में एक स्विचिंग सर्किट का एक उदाहरण दिया गया है - एक उदाहरण के रूप में, एफटी 2232 एच और गैर-वाष्पशील मेमोरी चिप 24LC256 के बीच संचार का उपयोग किया जाता है। केवल दो सिग्नल I2C इंटरफ़ेस से सीधे संबंधित हैं: SCL (घड़ी संकेत, जिसे आंकड़ा में SCC कहा जाता है) और SDA (प्रेषित डेटा)। विनिर्देश के अनुसार, इन संकेतों में से प्रत्येक द्वि-दिशात्मक हो सकता है, हालांकि, अक्सर बस में केवल एक मास्टर डिवाइस (मास्टर) होता है, और यही वह घड़ी संकेत सेट करता है। किसी भी स्थिति में, डेटा द्विदिश है - संचरित डेटा के प्रत्येक 8 बिट्स के लिए, 1 पुष्टिकरण बिट निम्न है।


सॉफ्टवेयर स्तर पर, I2C बस के साथ काम करना दो तरह से संभव है:

उपलब्ध बोर्डों में से एक का उपयोग करके अनुसंधान किया गया था। IN2 बस पर दास डिवाइस के रूप में INA219 बिजली मीटर का उपयोग किया गया था। चूंकि बोर्ड को उस समय हाथ में लिया गया था, जो एफटी 2232 एच और आईएनए 219 चिप्स के बीच एफपीजीए था ( जैसा कि मैं भाग्यशाली था, मुझे थोड़ी देर बाद पता चला )। प्रारंभ में, मैंने इसका उपयोग केवल 3-तार वाले FT2232H इंटरफ़ेस को दो-तार I2C बस इंटरफ़ेस में परिवर्तित करने के लिए करने की योजना बनाई थी - एक सामान्य उपकरण में, सर्किट के कारण ऐसा रूपांतरण होता है, ऊपर दिए गए आंकड़े को देखें।


जैसा कि पहले ही उल्लेख किया गया है, जब संचारित जानकारी के प्रत्येक 8 बिट्स के लिए डेटा संचारित करते हैं, तो पुष्टि (ACK) इस प्रकार है - संकेत प्राप्त डिवाइस से राज्य 0 में स्थानांतरित किया जाता है। यदि संचारण डिवाइस इस पुष्टि को देखता है, तो इसका मतलब है कि उन्होंने इसे सुना और जारी रख सकते हैं। यदि कोई पुष्टि नहीं है, तो जारी रखने के लिए जारी रखना बेकार है और विनिमय को रोका जा सकता है।
शोध की प्रक्रिया में, यह पाया गया कि LibMPSSE-I2C पुस्तकालय में एक त्रुटि है जो ज्यादातर मामलों में बस पर एक से अधिक बाइट पढ़ने की क्षमता को अवरुद्ध करता है। त्रुटि FT2232H की ओर से बस में पहली बार बाइट की ACK पुष्टि जारी करने से पहले घड़ी संकेत पर एक गड़बड़ की उपस्थिति से प्रकट होती है। गड़बड़ लंबाई 12 मेगाहर्ट्ज (लगभग 8 एनएस) की आवृत्ति की 1 अवधि है। यह गड़बड़ बस में गुलाम डिवाइस द्वारा घड़ी संकेत के रूप में माना जाता है जब एसीके ध्वज अभी तक सेट नहीं किया गया है। उसके बाद, दास डिवाइस लेनदेन को समाप्त कर देता है। इस तरह के लेनदेन का एक उदाहरण, जिसमें डिवाइस से दो बाइट्स पढ़ने का प्रयास किया जाता है, आंकड़े में दिखाया गया है (डेटा कैप्चर 120 मेगाहर्ट्ज की आवृत्ति पर किया गया था, एक गड़बड़ समय नमूने 20968-20967 पर मौजूद है)। ऑल्टर FPGAs के लिए बिल्ट-इन सिग्नलटैग लॉजिक एनालाइज़र का उपयोग करके टाइमिंग आरेख प्राप्त किए गए थे ( यहाँ मैं क्लैप्टेड FPGA में पहली बार खुश था )। चित्रों से पता चलता है कि DI लाइन पर डिवाइस से पहली बाइट पढ़ी जाती है, फिर डिवाइस बंद हो जाता है (मास्टर से गलत पुष्टि प्राप्त होती है) और दूसरी बाइट के बजाय 0xFF को पढ़ा जाता है।


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


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

एक विस्तृत अध्ययन ने लिबपीएससीएसई-I2C लाइब्रेरी द्वारा उत्पन्न MPSSE नियंत्रक के लिए कमांड बनाने में एक समस्या दिखाई। निम्नलिखित कमांड का एक सेट है जो बस पर 2 बाइट्स पढ़ने के लिए उपयोग किया जाता है (स्टॉप बिट अंत में सेट नहीं है)। हाइलाइट किए गए आदेश समस्या का स्थान और इसे हल करने का तरीका दिखाते हैं (1 पर स्विच करने पर रोक लगाते हैं और ACK ध्वज के लिए आपूर्ति की गई घड़ी के चरण को बदलते हैं):
0x80, 0x03, 0x13, 0x80, 0x03, 0x13, 0x80, 0x03, 0x13, 0x80, 0x03, 0x13, 0x80, 0x03, 0x13, // SDA, SCL high 0x80, 0x03, 0x13, 0x80, 0x03, 0x13, 0x80, 0x03, 0x13, 0x80, 0x03, 0x13, 0x80, 0x03, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, // SDA low: START 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x01, 0x13, 0x80, 0x00, 0x13, // SDA, SCL low 0x80, 0x02, 0x13, // SDA high, SCL low 0x13, 0x07, 0x81, // Write address 0x80, 0x00, 0x11, // SDA, SCL low 0x22, 0x00, // Read ACK from slave 0x80, 0x00, 0x11, // SDA, SCL low 0x22, 0x07, // Read 8 bits 0x80, 0x02, 0x13, // SDA high, SCL low //0x80, 0x00, 0x13, // Optional fix (use instead prev. command) to avoid SDA to go High //0x12, 0x00, 0x00, // Write 1 bit: ACK - error here in LibMPSSE-I2C 0x13, 0x00, 0x00, // Write 1 bit: ACK - fixed version ************************************* 0x80, 0x00, 0x11, 0x22, 0x07, 0x80, 0x02, 0x13, 0x12, 0x00, 0x00 


इस प्रकार, समस्या स्थानीयकृत है, एक समाधान पाया जाता है और सभी पीड़ितों को 3 प्रवाह में विभाजित किया जाता है:
  1. ऊपर वर्णित लंबित स्पष्टीकरण के संबंध में एफडीडीआई के साथ संवाद करें।
  2. बाइनरी लाइब्रेरी को उस स्थान की तलाश में विस्थापित किया जाता है, जहां संबंधित टीमें बनाई जाती हैं और इसे नियंत्रित करती हैं।
  3. वे LibMPSSE-I2C लाइब्रेरी का उपयोग किए बिना लिखते हैं, सीधे ऊपर की तरह नियंत्रण अनुक्रम भेजते हैं, जिससे लाइब्रेरी को दरकिनार करते हुए एमपीएसएसई मोड की प्रोग्रामिंग होती है।

शोध प्रक्रिया में, एफटीडीआई द्वारा प्रदान किए गए उदाहरणों के आधार पर, दो परीक्षण सॉफ्टवेयर प्रोजेक्ट बनाए गए थे। LibMPSSE-I2C लाइब्रेरी पर आधारित परियोजना को i2c_direct (मुख्य फ़ाइल i2c_direct.cn) कहा जाता है। स्वतंत्र रूप से MPSSE मोड प्रोग्रामिंग परियोजना I2CTEST है (मुख्य फ़ाइल I2CTEST.cpp है)। जो लोग चाहते हैं उन्हें पोस्ट की पहली तस्वीर में rarjpeg जैसे संग्रह में स्रोत फ़ाइलों के उदाहरण मिलेंगे।

संदर्भ:
AN108 MPSSE और MCU होस्ट बस इम्यूलेशन मोड्स के लिए कमांड प्रोसेसर
I11 बस के लिए AN113 Interfacing FT2232H हाई-स्पीड डिवाइस
AN177 उपयोगकर्ता गाइड LibMPSSE-I2C के लिए
इंटरफ़ेस का उदाहरण FT2232H I2C बस के लिए हाई-स्पीड डिवाइस (D2XX के माध्यम से)
LibMPSSE-I2C उदाहरण

Source: https://habr.com/ru/post/In207214/


All Articles