SPI Arduino pinMode (), बग के साथ कारण संघर्ष?


9

निम्नलिखित न्यूनतम उदाहरण पर विचार करें, जहां मैंने pinModeSPI फ़ंक्शन को कॉल करने से पहले सेट किया है:

#include <SPI.h>

void setup() {
  pinMode(10, OUTPUT);
  SPI.begin(10);
  SPI.setDataMode(10,SPI_MODE1);
}

void loop() {
  delay(1000);
  SPI.transfer(10,1);
}

अब जब SPI.transfer(10,1)कॉल किया जाता है loop(), तो मैं हमेशा देखता हूं कि गुलाम चयनित पिन 1.65V तक नीचे जाता है, लेकिन 0 के रूप में नहीं होना चाहिए! (नीचे चित्र देखें)

SPI फ़ंक्शन को कॉल करने से पहले पिन मोड सेट करें

अगर हम फोन नहीं करते हैं pinMode(), तो इस तरह से:

#include <SPI.h>

void setup() {
  SPI.begin(10);
  SPI.setDataMode(10,SPI_MODE1);
}

void loop() {
  delay(1000);
  SPI.transfer(10,1);
}

हमें वह मिलता है जिसकी हम उम्मीद करते हैं जब हम फोन करेंगे SPI.transfer:

पिन मोड सेट नहीं है

क्या वह बग है या आपके पास उस व्यवहार के लिए कोई स्पष्टीकरण है?

आपके समय और रुचि के लिए अग्रिम धन्यवाद!


यह नहीं होना चाहिए SPI.setDataMode(10, SPI_MODE1);? इसके अलावा केवल दूसरा ही उपयोगी है, जैसा कि begin()कॉल सेटडाटाकोड। स्रोत कोड को देखकर ऐसा लगता है कि SPI लाइब्रेरी आपके द्वारा निर्दिष्ट पिन को परिवर्तित नहीं करती है (हालांकि मुझे ARM का पता नहीं है)।
गेरबन

Ja आप सही कह रहे हैं, दुर्घटना से मैं setDataMode () को दो बार कॉल कर रहा हूं। कल मैं SPI.setDataMode (10, SPI_MODE1) के प्रभाव का परीक्षण करूंगा; लेकिन क्यों पिनमोड () को कॉल करने से यह प्रभाव अभी भी स्पष्ट नहीं है या? @ गेरबेन
newandlost

@ गेरबेन मैंने
न्यूडलॉस्ट

जवाबों:


1

यह आंतरिक पुल अप रोकनेवाला के साथ करने के लिए कुछ हो सकता है। SAM3X / A डेटशीट के अनुसार,

आई / ओ लाइन के विन्यास की परवाह किए बिना पुल-अप रोकनेवाला का नियंत्रण संभव है।

रीसेट के बाद, सभी पुल-अप सक्षम हैं।

यदि आप सभी शामिल फ़ाइलों के माध्यम से खुदाई करते हैं, तो आप पाते हैं:

../Arduino/hardware/arduino/samd/cores/arduino/wiring_digtal.c

लाइन 124 pinMode(uint32_t ulPin, uint32_t ulMode)फ़ंक्शन को परिभाषित करता है । INPUT बनाम INPUT_PULLUP बनाम OUTPUT के स्विच / केस स्टेटमेंट की जांच आप निम्नलिखित देखें:

  1. INPUT एक रजिस्टर को सेट करता है reg = PORT_PINCFG_INEN
  2. INPUT_PULLUP एक ​​रजिस्टर को सेट करता है reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
  3. 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) को कॉल करते हैं तो आप पुलअप रेज़िस्टेंट इनेबल हो जाएंगे। पिन को इनपुट पर सेट करने से पुलअप सक्षम हो जाएगा, जिसके बाद आप पिन को आउटपुट पर सेट कर सकते हैं और बिट स्पष्ट रहेगा।

हालाँकि, पूरी बहस सरल तथ्य के साथ नीचे आती है कि अगर आप पिनमोड () को बिल्कुल नहीं कहते हैं , तो समस्या नहीं होती है ...

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