পিনমোড (), বাগ সহ এসপিআই আরডুইনো দ্বন্দ্ব?


9

নিম্নলিখিত ন্যূনতম উদাহরণটি বিবেচনা করুন, যেখানে আমি pinModeএসপিআই ফাংশনগুলি কল করার আগে সেট করেছিলাম :

#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 হিসাবে এটি হওয়া উচিত নয়! (নীচের চিত্র দেখুন)

এসপিআই ফাংশন কল করার আগে পিন মোড সেট

আমরা যদি কল না করি 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 গ্রন্থাগার পিন আপনার নির্দিষ্ট করা পরিবর্তন নেই দেখে মনে হচ্ছে (যদিও আমি এআরএম জানি না)।
গারবেন

জা তুমি ঠিক বলেছ, দুর্ঘটনাক্রমে আমি সেটডাটামোড () দু'বার কল করছি। আগামীকাল আমি SPI.setDataMode (10, SPI_MODE1) এর প্রভাব পরীক্ষা করব; তবে কেন পিনমোড () কল করার ফলে এই প্রভাবটি এখনও পরিষ্কার নয় বা? @ গ্রাবেন
নিউ ওয়ান্ডলস্ট

@ গ্রাবেন আমি আমার পোস্টটি পরিবর্তন করেছি
and

উত্তর:


1

এটি অভ্যন্তরীণ পুল আপ রেজিস্টারের সাথে কিছু করতে পারে। এসএএম 3 এক্স / এ ডাটাশিট অনুসারে,

আই / ও লাইনের কনফিগারেশন নির্বিশেষে পুল-আপ প্রতিরোধকের নিয়ন্ত্রণ সম্ভব

পুনরায় সেট করার পরে, সমস্ত পুল-আপ সক্ষম হয়।

আপনি যদি অন্তর্ভুক্ত সমস্ত ফাইল খনন করেন তবে:

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

লাইন 124 pinMode(uint32_t ulPin, uint32_t ulMode)ফাংশনটি সংজ্ঞায়িত করে । INPUT বনাম INPUT_PULLUP বনাম OUTPUT এর জন্য স্যুইচ / কেস স্টেটমেন্ট পরীক্ষা করে নিচের বিষয়গুলি দেখুন:

  1. ইনপুট এতে একটি রেজিস্টার সেট করে 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_t এ নিক্ষিপ্ত হন)। সুতরাং, আমরা ধরে নিতে পারি যে জোর দেওয়া অবস্থায় যে কোনও বিট নিয়ন্ত্রণ ইনপুট / আউটপুট সক্রিয় রয়েছে, যেমন পুলআপ বিট। উদাহরণ স্বরূপ:

 PORT_PINCFG_INEN   = b'00000001';
 PORT_PINCFG_PULLEN = b'00000010';
~PORT_PINCFG_INEN   = b'11111110';

রিসেটের পরে যদি পুল-আপগুলি সক্ষম হয়, তবে আমরা এটি পুনরায় সেট করতে পারি:

 reg = b'xxxxxx1x';

উপরের পয়েন্ট (3) দৃ strongly়ভাবে নির্দেশ দেয় যে নির্দেশটি হ'ল:

 reg = b'xxxxxx1x' & 'b11111110';
   so
 reg = b'xxxxxx10'; // pull-up is enabled!

অতএব, আপনি যদি অন্য কোনও কিছুর আগে পিনমোড (এক্স, আউটপুট) কল করেন তবে আপনি পুলআপ প্রতিরোধক সক্ষম হয়ে শেষ করবেন। একটি ইনপুটটিতে পিনটি সেট করা পুলআপ সক্ষম বিটটি সাফ করবে, এর পরে আপনি পিনটিকে একটি আউটপুটে সেট করতে পারবেন এবং বিটটি পরিষ্কার থাকবে।

যাইহোক, পুরো arguement সহজ সত্য যে আপনি যদি pinMode () কল না দিয়ে নিচে পড়ে এ সব , সমস্যা ঘটবে না ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.