i2c बस गति मुद्दे
मैं एक FRP चिप के साथ संवाद करने के लिए INTERRUPT मोड में मेरी चिप पर एक MSP430F6736A eUSCI_B0 i2c परिधीय का उपयोग कर रहा हूं।
मैं यह जानने की कोशिश कर रहा हूं कि रोहम FEDR44V100A fram 1Mb चिप के साथ "मज़बूती से" संवाद करने के लिए मुझे अपनी i2c घड़ी को 130KHz तक क्यों छोड़ना है।
स्पष्ट करने के लिए, जब मैं i2c घड़ी को 400KHz पर सेट करता हूं, तो FRAM चिप 'कभी-कभी' सिर्फ 0s (सबसे अच्छा मामला, या यादृच्छिक डेटा सबसे खराब स्थिति) को वापस भेजती है, फिर भी जब मैं i2c घड़ी को 130KHz पर सेट करता हूं, तो सब कुछ शानदार तरीके से काम करता है। मैं यह मान रहा हूं कि यह FRAM चिप है जो खराब डेटा भेज रही है और i2c पोर्ट खराब डेटा प्राप्त नहीं कर रहा है क्योंकि मैं त्रुटि को "लगातार" पुन: उत्पन्न नहीं कर सकता ताकि तर्क विश्लेषक पर कब्जा कर सके।
FRAM डेटाशीट से, चिप 1MHz तक क्लॉक स्पीड पर काम कर सकती है। मेरा MSP430 16.77MHz पर काम कर रहा है
एससीएल और एसडीए पर वृद्धि का समय 200nS से कम है। i2c बस पर पुल प्रतिरोधों 2K हैं
i2c के लिए सेटअप है:
UCB0CTLW0 |= UCMST | UCMODE_3 | UCSSEL__SMCLK;
UCB0BRW_L = 128; .................this is for 130KHz
UCB0BRW_L = 40;....................this is for 400KHz
UCB0BRW_H = 0;
UCB0I2COA0 = 0;
UCB0I2CSA = theSalveAddress;
प्रासंगिक समय में UCB0IE के बीच के बिट्स सेट / क्लियर किए गए हैं।
मैं इंगित कर सकता हूं कि मुझे 400KHz पर माइक्रोचिप 47L16 EERAM चिप से संवाद करने में कोई समस्या नहीं थी जो समस्या को झूठ (100%) ROHM चिप के साथ इंगित करेगा ... लेकिन क्यों? किसी भी संकेत के रूप में मैं क्या करने की कोशिश कर सकता हूं और गति को बेहतर बनाने के लिए सराहना की जाएगी, जैसा कि किसी भी सुझाव के रूप में संचार इस कम गति पर क्यों होना है।
अग्रिम में धन्यवाद।
सर्किट...
129KHz पर घड़ी की लहर ।।
382KHz पर घड़ी की लहर ।।
जवाब
मुझे अपनी समस्या का हल मिल गया।
जब मैंने माइक्रोचिप EERAM चिप का इस्तेमाल किया, तो मैंने पाया कि मुझे TxBUF में एक डमी बाइट को तुरंत Tx इंटरप्ट सेट करने से पहले रखना होगा , जैसे:
UCB0TXBUF = 0x55;
UCB0IE = UCTXIE0;
अगर मैंने ऐसा नहीं किया, तो जिस चिप को मैं लिखना चाहता था, उसमें पते की पहली बाइट नहीं भेजी गई थी।
हालाँकि , उस लाइन ने FRAM चिप के साथ समस्या का कारण बना, कभी-कभी , 0x55 को वास्तव में 1 बाइट के रूप में प्रेषित किया गया था जिस चिप को मैं लिखना चाहता था।
मैं स्पष्ट नहीं हूं कि ऐसा कभी-कभी ही क्यों हुआ । यह एक लॉजिक एनालाइज़र का उपयोग करके 2 सेकंड के संचार को बार-बार हथियाने के लिए पाया गया था और मैंने 0x55 पर ध्यान दिया जब इसे एक अलग मूल्य पर प्रसारित किया जाना चाहिए था (साथ ही इस तथ्य के लिए कि 3 बाइट्स पते के लिए प्रेषित किए गए थे और केवल 2 नहीं थे)।
इसके अलावा, आईएसआर में भी UCB0TXBUF = 0xFF;टीएक्स अवरोध को हटाने से ठीक पहले लाइन थी, जैसे कि:
UCB0TXBUF = 0xff; // to prevent UCB0IFG from having TXBuf empty flag
UCB0IE &= ~UCTXIE0; // disable TX intr
मैंने अब इसे बदल दिया है और अब व्यवधान को निष्क्रिय करने के बाद IFG सेटिंग को साफ़ कर देता है जैसे:
UCB0IE &= ~UCTXIE0;
UCB0IFG &= ~UCTXIFG0;
तो उन सभी को धन्यवाद जिन्होंने मदद करने की कोशिश की, यह बहुत सराहना की है।
पीएस मैं अब 1 मेगाहर्ट्ज पर सफलतापूर्वक संचार कर रहा हूं।