यह आंतरिक पुल अप रोकनेवाला के साथ करने के लिए कुछ हो सकता है। SAM3X / A डेटशीट के अनुसार,
आई / ओ लाइन के विन्यास की परवाह किए बिना पुल-अप रोकनेवाला का नियंत्रण संभव है।
रीसेट के बाद, सभी पुल-अप सक्षम हैं।
यदि आप सभी शामिल फ़ाइलों के माध्यम से खुदाई करते हैं, तो आप पाते हैं:
../Arduino/hardware/arduino/samd/cores/arduino/wiring_digtal.c
लाइन 124 pinMode(uint32_t ulPin, uint32_t ulMode)
फ़ंक्शन को परिभाषित करता है । INPUT बनाम INPUT_PULLUP बनाम OUTPUT के स्विच / केस स्टेटमेंट की जांच आप निम्नलिखित देखें:
- INPUT एक रजिस्टर को सेट करता है
reg = PORT_PINCFG_INEN
।
- INPUT_PULLUP एक रजिस्टर को सेट करता है
reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
- OUTPUT एक रजिस्टर को सेट करता है
reg &= ~PORT_PINCFG_INEN
।
प्रत्येक मामले में 'रजिस्टर' समान है। मैं अपने जीवन के लिए यह नहीं जान सकता कि PORT_PINCFG_INEN या PORT_PINCFG_PULLEN किस मान के रूप में परिभाषित किए गए हैं, लेकिन उन्हें इसमें कोई संदेह नहीं है कि केवल 8-बिट मास्क (वे 'रजिस्टर' के लिए असाइन किए जाने पर uint8_s पर डाली जाती हैं)। इस प्रकार, हम मान सकते हैं कि जो भी बिट इनपुट / आउटपुट को नियंत्रित करता है, वह सक्रिय होता है, जैसा कि पुलअप बिट होता है। उदाहरण के लिए:
PORT_PINCFG_INEN = b'00000001';
PORT_PINCFG_PULLEN = b'00000010';
~PORT_PINCFG_INEN = b'11111110';
यदि रीसेट के बाद पुल-अप सक्षम हो जाता है, तो हम कह सकते हैं कि रीसेट पर:
reg = b'xxxxxx1x';
बिंदु (3) ऊपर से तात्पर्य है कि निर्देश है:
reg = b'xxxxxx1x' & 'b11111110';
so
reg = b'xxxxxx10'; // pull-up is enabled!
इसलिए, यदि आप किसी और चीज से पहले पिनमोड (X, OUTPUT) को कॉल करते हैं तो आप पुलअप रेज़िस्टेंट इनेबल हो जाएंगे। पिन को इनपुट पर सेट करने से पुलअप सक्षम हो जाएगा, जिसके बाद आप पिन को आउटपुट पर सेट कर सकते हैं और बिट स्पष्ट रहेगा।
हालाँकि, पूरी बहस सरल तथ्य के साथ नीचे आती है कि अगर आप पिनमोड () को बिल्कुल नहीं कहते हैं , तो समस्या नहीं होती है ...
SPI.setDataMode(10, SPI_MODE1);
? इसके अलावा केवल दूसरा ही उपयोगी है, जैसा किbegin()
कॉल सेटडाटाकोड। स्रोत कोड को देखकर ऐसा लगता है कि SPI लाइब्रेरी आपके द्वारा निर्दिष्ट पिन को परिवर्तित नहीं करती है (हालांकि मुझे ARM का पता नहीं है)।