আপনি কীভাবে একটি আরডিনোতে এসপিআই ব্যবহার করবেন?


44

আরডুইনো ইউনো, মেগা 2560, লিওনার্দো এবং অনুরূপ বোর্ডগুলির প্রসঙ্গে:

  • এসপিআই কীভাবে কাজ করে?
  • এসপিআই কত দ্রুত?
  • আমি কীভাবে একজন মাস্টার এবং দাসের মধ্যে সংযোগ স্থাপন করব?
  • আমি কীভাবে এসপিআই ক্রীতদাস করব?

দয়া করে নোট করুন: এটি একটি রেফারেন্স প্রশ্ন হিসাবে তৈরি।


আপনি কি এই সম্পর্কিত প্রশ্নের উত্তর দিতে পারেন arduino.stackexchange.com/questions/60703/…
qwr

উত্তর:


80

এসপিআই পরিচয়

সিরিয়াল পেরিফেরাল ইন্টারফেস বাস (SPI) ইন্টারফেস উচ্চ গতিতে স্বল্প দূরত্বের উপর একাধিক ডিভাইস মধ্যে যোগাযোগের জন্য ব্যবহৃত হয়, এবং।

সাধারণত একটি একক "মাস্টার" ডিভাইস রয়েছে, যা যোগাযোগ শুরু করে এবং ঘড়ি সরবরাহ করে যা ডেটা স্থানান্তর হারকে নিয়ন্ত্রণ করে। এক বা একাধিক ক্রীতদাস থাকতে পারে। একাধিক গোলামের জন্য, প্রত্যেকের নিজস্ব "স্লেভ সিলেক্ট" সিগন্যাল রয়েছে, যা পরে বর্ণিত হয়েছে।


এসপিআই সিগন্যাল

একটি পূর্ণ বর্ধিত এসপিআই সিস্টেমে আপনার কাছে চারটি সিগন্যাল লাইন থাকবে:

  • মাস্টার আউট, স্লেভ ইন ( এমওএসআই ) - যা মাস্টার থেকে দাসের কাছে যাওয়া ডেটা
  • মাস্টার ইন, স্লেভ আউট ( এমআইএসও ) - যা দাস থেকে মাস্টারের কাছে যাওয়া ডেটা
  • সিরিয়াল ক্লক ( এসসিকে ) - যখন এটি পরের বিটকে মাস্টার এবং স্লেভ উভয়ই নমুনা টগল করে
  • স্লেভ সিলেক্ট ( এসএস ) - এটি একটি নির্দিষ্ট দাসকে "সক্রিয়" হতে বলে

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

এই চিত্রটি দেখায় যেভাবে একটি বাইট প্রেরণ হিসাবে ডেটা আদান প্রদান করা হয়:

এসপিআই প্রোটোকল 4 সিগন্যাল দেখাচ্ছে

নোট করুন যে তিনটি সংকেত মাস্টার (এমওএসআই, এসসিকে, এসএস) এর আউটপুট এবং একটি ইনপুট (এমআইএসও) O


টাইমিং

ইভেন্টের ক্রম হ'ল:

  • SS এটি দৃsert়তার সাথে দাসকে সক্রিয় করতে নীচে যায়
  • SCKলাইন নির্দেশ করে ডেটা লাইন নমুনা দিতে হবে টগল
  • (ডিফল্ট ঘড়ির ধাপটি ব্যবহার করে) এর শীর্ষ প্রান্তে মাস্টার এবং স্লেভ উভয়ই ডেটা নমুনা দিয়েছেনSCK
  • উভয় মাস্টার এবং ক্রীতদাস পরবর্তী বিট জন্য প্রস্তুতি চিহ্ন প্রান্ত SCK(ডিফল্ট ঘড়ি ফেজ ব্যবহার করে), পরিবর্তন করে MISO/ MOSIপ্রয়োজনে
  • ট্রান্সমিশন শেষ হয়ে গেলে (সম্ভবত একাধিক বাইট প্রেরণের পরে) তারপরে SSএটিকে ডি-অ্যাড্রেস করতে উচ্চতায় যায়

মনে রাখবেন যে:

  • সর্বাধিক উল্লেখযোগ্য বিট প্রথমে প্রেরণ করা হয় (ডিফল্টরূপে)
  • ডেটা একই তাত্ক্ষণিকভাবে প্রেরণ এবং প্রাপ্ত করা হয় (সম্পূর্ণ দ্বৈত)

একই ঘড়ির নাড়িতে ডেটা প্রেরণ এবং প্রাপ্ত হওয়ার কারণে দাসের পক্ষে তাত্ক্ষণিকভাবে মাস্টারের প্রতিক্রিয়া জানানো সম্ভব নয়। এসপিআই প্রোটোকলগুলি সাধারণত মাস্টারকে একটি সংক্রমণে ডেটা অনুরোধ করতে এবং পরবর্তীকালে একটি প্রতিক্রিয়া পাওয়ার আশা করে।

আরডুইনোতে এসপিআই লাইব্রেরি ব্যবহার করে, একটি একক স্থানান্তর করা কোডের মতো দেখায়:

 byte outgoing = 0xAB;
 byte incoming = SPI.transfer (outgoing);

কোডের উদাহরণ

কেবল প্রেরণের উদাহরণ (যে কোনও ডেটা উপেক্ষা করে):

#include <SPI.h>

void setup (void)
  {
  digitalWrite(SS, HIGH);  // ensure SS stays high
  SPI.begin ();
  } // end of setup

void loop (void)
  {
  byte c;

  // enable Slave Select
  digitalWrite(SS, LOW);    // SS is pin 10

  // send test string
  for (const char * p = "Fab" ; c = *p; p++)
    SPI.transfer (c);

  // disable Slave Select
  digitalWrite(SS, HIGH);

  delay (100);
  } // end of loop

কেবলমাত্র আউটপুট এসপিআইয়ের জন্য তারগুলি

উপরের কোডটি (যা কেবল প্রেরণ করে) কোনও আউটপুট সিরিয়াল শিফট রেজিস্টার চালাতে ব্যবহৃত হতে পারে। এগুলি কেবলমাত্র আউটপুটযুক্ত ডিভাইস, সুতরাং আমাদের আগত কোনও ডেটা নিয়ে চিন্তা করার দরকার নেই। তাদের ক্ষেত্রে এসএস পিনকে "স্টোর" বা "ল্যাচ" পিন বলা যেতে পারে।

এসপিআই প্রোটোকল 3 সিগন্যাল দেখায়

এর উদাহরণগুলি হল 74HC595 সিরিয়াল শিফট রেজিস্টার এবং বিভিন্ন এলইডি স্ট্রিপ, কেবলমাত্র একটি দম্পতির উল্লেখ করার জন্য। উদাহরণস্বরূপ, এই এমএএক্স 7219 চিপ দ্বারা চালিত এই 64 পিক্সেলের এলইডি ডিসপ্লে:

64 পিক্সেল এলইডি ডিসপ্লে

এই ক্ষেত্রে আপনি দেখতে পাবেন যে বোর্ড নির্মাতা কিছুটা আলাদা সিগন্যালের নাম ব্যবহার করেছেন:

  • ডিআইএন (ডেটা ইন) হ'ল মসি (মাস্টার আউট, স্লেভ ইন)
  • সিএস (চিপ নির্বাচন) এসএস (স্লেভ নির্বাচন)
  • সিএলকে (ক্লক) হ'ল এস সি কে (সিরিয়াল ক্লক)

বেশিরভাগ বোর্ড একই ধরণের অনুসরণ করবে। কখনও কখনও ডিআইএন হ'ল ডিআই (ডেটা ইন)।

এখানে আরেকটি উদাহরণ দেওয়া হল, এবার একটি 7-সেগমেন্টের এলইডি ডিসপ্লে বোর্ড (এছাড়াও MAX7219 চিপের উপর ভিত্তি করে):

7-সেগমেন্ট এলইডি ডিসপ্লে

এটি অন্যান্য বোর্ডের মতো ঠিক একই সংকেত নামগুলি ব্যবহার করে। এই উভয় ক্ষেত্রেই আপনি দেখতে পাচ্ছেন যে বোর্ডটির কেবলমাত্র তারের জন্য 5 টি তার প্রয়োজন, এসপিআইয়ের জন্য তিনটি, আরও শক্তি এবং স্থল।


ঘড়ির ধাপ এবং মেরুতা

আপনি এসপিআই ক্লকটি নমুনা করতে পারেন এমন চারটি উপায় রয়েছে।

এসপিআই প্রোটোকলটি ঘড়ির ডালের পোলারিটিতে বিভিন্নতার জন্য অনুমতি দেয়। সিপিএল হ'ল ক্লক পোলারিটি, এবং সিপিএইচএ হ'ল ক্লক ফেজ।

  • মোড 0 (ডিফল্ট) - ঘড়িটি সাধারণত কম থাকে (সিপিএল = 0), এবং ডেটা নিম্ন থেকে উচ্চ (শীর্ষস্থানীয় প্রান্ত) (সিপিএইচ = 0) এ স্থানান্তরের ক্ষেত্রে নমুনাযুক্ত হয় CP
  • মোড 1 - ঘড়িটি সাধারণত কম থাকে (সিপিওএল = 0), এবং উচ্চ থেকে নিম্নে (প্রান্তিক প্রান্তে) স্থানান্তরিত হওয়ার সময় ডেটা নমুনা দেওয়া হয় (সিপিএইচ = 1)
  • মোড 2 - ঘড়িটি সাধারণত উচ্চ (সিপিওএল = 1) বেশি থাকে এবং উচ্চ থেকে নিম্নে (অগ্রণী প্রান্ত) স্থানান্তরিত হওয়ার সময় ডেটা নমুনা দেওয়া হয় (সিপিএইচ = 0)
  • মোড 3 - ঘড়িটি সাধারণত উচ্চ (সিপিওএল = 1) বেশি থাকে এবং নিম্ন থেকে উচ্চে (প্রান্তিক প্রান্তে) স্থানান্তরিত করার সময় ডেটা নমুনা দেওয়া হয় (সিপিএইচ = 1)

এগুলি এই গ্রাফিকটিতে চিত্রিত হয়েছে:

এসপিআই ক্লক পর্ব এবং মেরুতা

পর্যায়টি এবং মেরুকাজের সঠিকতা পেতে আপনার ডিভাইসের জন্য ডেটাশিটটি উল্লেখ করা উচিত। সাধারণত একটি ডায়াগ্রাম থাকবে যা দেখায় কীভাবে ঘড়ির নমুনা দেওয়া যায়। উদাহরণস্বরূপ, 74HC595 চিপের জন্য ডেটাশিট থেকে:

74HC595 ঘড়ি

আপনি দেখতে পাচ্ছেন যে ঘড়িটি স্বাভাবিকভাবে কম (সিপিএল = 0) থাকে এবং এটি শীর্ষস্থানীয় প্রান্তে (সিপিএলএ = 0) নমুনাযুক্ত তাই এটি এসপিআই মোড 0 0

আপনি এই জাতীয় কোডের মধ্যে ঘড়ির পোলারিয়াটি এবং ধাপটি পরিবর্তন করতে পারেন (অবশ্যই কেবল একটি চয়ন করুন):

SPI.setDataMode (SPI_MODE0);
SPI.setDataMode (SPI_MODE1);
SPI.setDataMode (SPI_MODE2);
SPI.setDataMode (SPI_MODE3);

এই পদ্ধতিটি আরডুইনো আইডিইর ১.6.০ সংস্করণে অবচয় করা হয়েছে। সাম্প্রতিক সংস্করণগুলির জন্য আপনি SPI.beginTransactionকলটিতে ঘড়ির মোড পরিবর্তন করেন :

SPI.beginTransaction (SPISettings (2000000, MSBFIRST, SPI_MODE0));  // 2 MHz clock, MSB first, mode 0

ডাটা অর্ডার

ডিফল্টটি প্রথমে সর্বাধিক তাৎপর্যপূর্ণ বিট হয় তবে আপনি হার্ডওয়ারকে প্রথমে এর মতো কমপক্ষে উল্লেখযোগ্য বিট প্রক্রিয়া করতে বলতে পারেন:

SPI.setBitOrder (LSBFIRST);   // least significant bit first
SPI.setBitOrder (MSBFIRST);   // most significant bit first

আবার, এটি আরডুইনো আইডিইর পরে 1.6.0 সংস্করণে অবচয় করা হয়েছে। সাম্প্রতিক সংস্করণগুলির জন্য আপনি SPI.beginTransactionকলটিতে বিট অর্ডারটি পরিবর্তন করেছেন :

SPI.beginTransaction (SPISettings (1000000, LSBFIRST, SPI_MODE2));  // 1 MHz clock, LSB first, mode 2

দ্রুততা

এসপিআই-এর জন্য ডিফল্ট সেটিংস হ'ল চারটি দ্বারা বিভক্ত সিস্টেম ক্লক গতি ব্যবহার করা, অর্থাৎ, প্রতি 250 এনএসে একটি এসপিআই ক্লক নাড়ি, 16 মেগাহার্জ সিপিইউ ঘড়ি ধরে। আপনি setClockDividerএই জাতীয় ব্যবহার করে ঘড়ির বিভাজক পরিবর্তন করতে পারেন :

SPI.setClockDivider (divider);

যেখানে "বিভাজক" এর মধ্যে একটি:

  • SPI_CLOCK_DIV2
  • SPI_CLOCK_DIV4
  • SPI_CLOCK_DIV8
  • SPI_CLOCK_DIV16
  • SPI_CLOCK_DIV32
  • SPI_CLOCK_DIV64
  • SPI_CLOCK_DIV128

দ্রুততম হার হ'ল 16 মেগাহার্জ সিপিইউ ঘড়ি ধরে ধরে প্রতি 125 এনএসে একটি বিভাজন 2 বা একটি এসপিআই ক্লক পালস। সুতরাং এক বাইট প্রেরণ করতে এটি 8 * 125 এনএস বা 1 ডিগ্রি নিতে পারে।

এই পদ্ধতিটি আরডুইনো আইডিইর ১.6.০ সংস্করণে অবচয় করা হয়েছে। সাম্প্রতিক সংস্করণগুলির জন্য আপনি SPI.beginTransactionকলটিতে স্থানান্তর গতি পরিবর্তন করেন :

SPI.beginTransaction (SPISettings (4000000, MSBFIRST, SPI_MODE0));  // 4 MHz clock, MSB first, mode 0

তবে পরীক্ষামূলক পরীক্ষাটি দেখায় যে বাইটগুলির মধ্যে দুটি ঘড়ির ডাল থাকা প্রয়োজন, সুতরাং বাইটকে যে সর্বোচ্চ হারে আটকানো যায় তার প্রতিটি হারের পরিমাণ 1.125 eachs (2 এর একটি ক্লক বিভাজক সহ) is

সংক্ষিপ্তসার হিসাবে, প্রতিটি বাইটকে প্রতি সেকেন্ডের 1 / 1.125 of বা তাত্ত্বিক সর্বাধিক স্থানান্তর হার বা এসএস লো সেট করার মতো ওভারহেড বাদ দিয়ে (১12 মেগাহার্টজ ঘড়ি সহ) সর্বোচ্চ ১.১২৫ ডিগ্রি প্রতি এক (১ M মেগাহার্টজ ঘড়ি সহ) পাঠানো যেতে পারে so উপর).


আরডুইনোতে সংযুক্ত হচ্ছে

আরডুইনো ইউনো

10 থেকে 13 ডিজিটাল পিনের মাধ্যমে সংযুক্ত হচ্ছে:

আরডুইনো ইউনো এসপিআই পিনগুলি

আইসিএসপি শিরোনামের মাধ্যমে সংযুক্ত হচ্ছে:

আইসিএসপি পিনআউটস - ইউনো

আইসিএসপি শিরোনাম

আরডুইনো আতমেগা 2560

50 থেকে 52 ডিজিটাল পিনের মাধ্যমে সংযুক্ত হচ্ছে:

আরডুইনো মেগা 2560 এসপিআই পিন

আপনি উপরের ইউনোর মতো আইসিএসপি শিরোনামও ব্যবহার করতে পারেন।

আরডুইনো লিওনার্দো

লিওনার্দো এবং মাইক্রো ইউনো এবং মেগা থেকে ভিন্ন, ডিজিটাল পিনগুলিতে এসপিআই পিনগুলি প্রকাশ করে না। ইউনোর জন্য উপরে বর্ণিত আইসিএসপি শিরোনাম পিনগুলি ব্যবহার করা আপনার একমাত্র বিকল্প।


একাধিক দাস

একজন মাস্টার একাধিক ক্রীতদাসের সাথে যোগাযোগ করতে পারেন (তবে একসাথে কেবলমাত্র একজন)। এটি একটি দাসের জন্য এসএসকে জোর দিয়ে এবং অন্য সকলের জন্য ডি-জোর করে does এস.এস দৃ has়ভাবে দাসদের (সাধারণত এর অর্থ LOW) জোর করে তার MISO পিনটিকে আউটপুট হিসাবে কনফিগার করে যাতে সেই দাস, এবং সেই দাস একাই, মাস্টারকে প্রতিক্রিয়া জানাতে পারে। অন্য দাসরা এসএস যুক্ত না করা হলে যে কোনও আগত ঘড়ি ডাল উপেক্ষা করে। সুতরাং প্রতিটি গোলামের জন্য আপনার এর জন্য আরও একটি অতিরিক্ত সংকেত প্রয়োজন:

একাধিক এসপিআই ক্রীতদাস

এই গ্রাফিকটিতে আপনি দেখতে পাচ্ছেন যে এমআইএসও, এমওএসআই, এসসিকে উভয় দাসের মধ্যে ভাগ করা হয়েছে, তবে প্রতিটি দাসের নিজস্ব এসএস (দাস নির্বাচন) সংকেত রয়েছে।


প্রোটোকল

এসপিআই স্পেকটি প্রোটোকলগুলিকে সুনির্দিষ্ট করে না, তাই ডেটা বলতে কী বোঝায় তাতে একমত হওয়া স্বতন্ত্র মাস্টার / স্লেভ পেয়ারিংয়ের উপর নির্ভর করে। আপনি একই সাথে বাইটগুলি প্রেরণ এবং গ্রহণ করতে পারবেন, প্রাপ্ত বাইট প্রেরিত বাইটের সরাসরি প্রতিক্রিয়া হতে পারে না (কারণ তারা একসাথে একত্রিত হচ্ছে)।

সুতরাং এক প্রান্তে একটি অনুরোধ প্রেরণ করা আরও যুক্তিসঙ্গত হবে (উদাঃ 4 এর অর্থ "ডিস্ক ডিরেক্টরিটি তালিকাভুক্ত করা যেতে পারে") এবং তারপরে সম্পূর্ণ প্রতিক্রিয়া না পাওয়া পর্যন্ত স্থানান্তরগুলি (সম্ভবত কেবল বাইরে থেকে জিরো প্রেরণ করা) করবেন। প্রতিক্রিয়াটি একটি নতুন লাইন বা 0x00 অক্ষর দিয়ে শেষ হতে পারে।

আপনার স্লেভ ডিভাইসের জন্য প্রোটোকল সিকোয়েন্সগুলি কী প্রত্যাশা করে তা দেখার জন্য ডেটাশিটটি পড়ুন।


কীভাবে এসপিআই ক্রীতদাস করা যায়

পূর্ববর্তী উদাহরণটি আরডুইনোকে মাস্টার হিসাবে দেখায়, দাস ডিভাইসে ডেটা প্রেরণ করে। এই উদাহরণটি দেখায় যে আরডুইনো কীভাবে ক্রীতদাস হতে পারে।

হার্ডওয়্যার সেটআপ

একে অপরের সাথে সংযুক্ত নিম্নলিখিত পিনগুলির সাথে দুটি আরডুইনো ইউনো একসাথে সংযুক্ত করুন:

  • 10 (এসএস)
  • ১১ (মোশি)
  • 12 (এমআইএসও)
  • ১৩ (এসসিকে)

  • + 5 ভি (প্রয়োজনে)

  • জিএনডি (সিগন্যাল ফেরতের জন্য)

আরডুইনো মেগায়, পিনগুলি 50 (এমআইএসও), 51 (এমওএসআই), 52 (এসসিকে), এবং 53 (এসএস) রয়েছে।

যাই হোক না কেন, মোশি এক প্রান্তে অন্য প্রান্তে মোসির সাথে সংযুক্ত থাকে, আপনি সেগুলি চারপাশে স্যুপ করে না (এটি আপনার মোশি নেই <-> মিসো)। সফ্টওয়্যারটি এমওএসআইর এক প্রান্ত (মাস্টার এন্ড) আউটপুট হিসাবে এবং অন্য প্রান্তটি (স্লেভ এন্ড) একটি ইনপুট হিসাবে কনফিগার করে।

মাস্টার উদাহরণ

#include <SPI.h>

void setup (void)
{

  digitalWrite(SS, HIGH);  // ensure SS stays high for now

  // Put SCK, MOSI, SS pins into output mode
  // also put SCK, MOSI into LOW state, and SS into HIGH state.
  // Then put SPI hardware into Master mode and turn SPI on
  SPI.begin ();

  // Slow down the master a bit
  SPI.setClockDivider(SPI_CLOCK_DIV8);

}  // end of setup


void loop (void)
{

  char c;

  // enable Slave Select
  digitalWrite(SS, LOW);    // SS is pin 10

  // send test string
  for (const char * p = "Hello, world!\n" ; c = *p; p++)
    SPI.transfer (c);

  // disable Slave Select
  digitalWrite(SS, HIGH);

  delay (1000);  // 1 seconds delay
}  // end of loop

দাস উদাহরণ

#include <SPI.h>

char buf [100];
volatile byte pos;
volatile bool process_it;

void setup (void)
{
  Serial.begin (115200);   // debugging

  // turn on SPI in slave mode
  SPCR |= bit (SPE);

  // have to send on master in, *slave out*
  pinMode (MISO, OUTPUT);

  // get ready for an interrupt
  pos = 0;   // buffer empty
  process_it = false;

  // now turn on interrupts
  SPI.attachInterrupt();

}  // end of setup


// SPI interrupt routine
ISR (SPI_STC_vect)
{
byte c = SPDR;  // grab byte from SPI Data Register

  // add to buffer if room
  if (pos < sizeof buf)
    {
    buf [pos++] = c;

    // example: newline means time to process buffer
    if (c == '\n')
      process_it = true;

    }  // end of room available
}  // end of interrupt routine SPI_STC_vect

// main loop - wait for flag set in interrupt routine
void loop (void)
{
  if (process_it)
    {
    buf [pos] = 0;
    Serial.println (buf);
    pos = 0;
    process_it = false;
    }  // end of flag set

}  // end of loop

দাস সম্পূর্ণরূপে বাধা-চালিত, সুতরাং এটি অন্যান্য স্টাফগুলি করতে পারে। আগত এসপিআই ডেটা বাফারে সংগ্রহ করা হয়, এবং যখন একটি "উল্লেখযোগ্য বাইট" (এই ক্ষেত্রে একটি নতুন লাইন) আসে তখন একটি পতাকা সেট হয়। এটি ক্রীতদাসকে ডেটা চালিয়ে যাওয়া এবং প্রক্রিয়াজাতকরণ শুরু করতে বলে।

এসপিআই ব্যবহার করে মাস্টারকে স্লেভের সাথে সংযুক্ত করার উদাহরণ

আরডুইনো এসপিআইয়ের মাস্টার এবং ক্রীতদাস


দাসের কাছ থেকে কীভাবে প্রতিক্রিয়া পাবেন

উপরের কোডটি অনুসরণ করে যা এসপিআই মাস্টারের কাছ থেকে কোনও দাসের কাছে ডেটা প্রেরণ করে, নীচের উদাহরণে দাসকে ডেটা প্রেরণ, এটির সাথে কিছু করার পরে এবং প্রতিক্রিয়া দেখায় return

মাস্টার উপরের উদাহরণের মতো। তবে একটি গুরুত্বপূর্ণ বিষয় হ'ল আমাদের কিছুটা দেরি করা দরকার (20 মাইক্রোসেকেন্ডের মতো কিছু)। অন্যথায় দাসের কাছে আগত ডেটার প্রতিক্রিয়া জানাতে এবং এটি দিয়ে কিছু করার সুযোগ নেই।

উদাহরণটি "কমান্ড" প্রেরণ করে। এই ক্ষেত্রে "ক" (কিছু যুক্ত করুন) বা "এস" (কিছু বিয়োগ) করুন। এটি দেখানোর জন্য যে দাসটি ডেটা সহ আসলে কিছু করছে।

লেনদেন শুরুর জন্য স্লেভ-সিলেক্ট (এসএস) বলার পরে, মাস্টার কমান্ডটি পাঠান, তারপরে যে কোনও সংখ্যক বাইট এবং তারপরে এসএসকে লেনদেনটি বন্ধ করার জন্য উত্সাহ দেয়।

একটি খুব গুরুত্বপূর্ণ বিষয় হ'ল দাস একই মুহূর্তে আগত বাইটের প্রতিক্রিয়া জানাতে পারে না। প্রতিক্রিয়াটি পরবর্তী বাইটে থাকতে হবে। কারণ যে বিটগুলি প্রেরণ করা হচ্ছে এবং যে বিটগুলি প্রাপ্ত হচ্ছে তা একই সাথে প্রেরণ করা হচ্ছে। চারটি সংখ্যায় কিছু যুক্ত করার জন্য আমাদের পাঁচটি স্থানান্তর দরকার:

transferAndWait ('a');  // add command
transferAndWait (10);
a = transferAndWait (17);
b = transferAndWait (33);
c = transferAndWait (42);
d = transferAndWait (0);

প্রথমে আমরা 10 নম্বরে কর্মের জন্য অনুরোধ করছি তবে আমরা পরবর্তী স্থানান্তর (17 এর জন্য একটি) না হওয়া পর্যন্ত কোনও প্রতিক্রিয়া পাই না। যাইহোক "একটি" টি 10 ​​এর জবাবে সেট করা হবে Finally অবশেষে আমরা 42 এর উত্তর পেতে একটি "ডামি" নম্বর প্রেরণ করব।

মাস্টার (উদাহরণ)

  #include <SPI.h>

  void setup (void)
    {
    Serial.begin (115200);
    Serial.println ();

    digitalWrite(SS, HIGH);  // ensure SS stays high for now
    SPI.begin ();

    // Slow down the master a bit
    SPI.setClockDivider(SPI_CLOCK_DIV8);
    }  // end of setup

  byte transferAndWait (const byte what)
    {
    byte a = SPI.transfer (what);
    delayMicroseconds (20);
    return a;
    } // end of transferAndWait

  void loop (void)
    {

    byte a, b, c, d;

    // enable Slave Select
    digitalWrite(SS, LOW);

    transferAndWait ('a');  // add command
    transferAndWait (10);
    a = transferAndWait (17);
    b = transferAndWait (33);
    c = transferAndWait (42);
    d = transferAndWait (0);

    // disable Slave Select
    digitalWrite(SS, HIGH);

    Serial.println ("Adding results:");
    Serial.println (a, DEC);
    Serial.println (b, DEC);
    Serial.println (c, DEC);
    Serial.println (d, DEC);

    // enable Slave Select
    digitalWrite(SS, LOW);

    transferAndWait ('s');  // subtract command
    transferAndWait (10);
    a = transferAndWait (17);
    b = transferAndWait (33);
    c = transferAndWait (42);
    d = transferAndWait (0);

    // disable Slave Select
    digitalWrite(SS, HIGH);

    Serial.println ("Subtracting results:");
    Serial.println (a, DEC);
    Serial.println (b, DEC);
    Serial.println (c, DEC);
    Serial.println (d, DEC);

    delay (1000);  // 1 second delay
    }  // end of loop

ক্রীতদাসের জন্য কোডটি মূলত বিঘ্নিত রুটিনে প্রায় সবকিছু করে (এসপিআই ডেটার আগত যখন বলা হয়)। এটি আগত বাইট নেয়, এবং স্মরণ করা "কমান্ড বাইট" অনুসারে যোগ বা বিয়োগ করে। নোট করুন যে পরবর্তী সময়ে লুপের মাধ্যমে প্রতিক্রিয়াটি "সংগ্রহ" করা হবে। এই কারণেই চূড়ান্ত উত্তর পেতে মাস্টারকে একটি চূড়ান্ত "ডামি" স্থানান্তর পাঠাতে হবে।

আমার উদাহরণে আমি এসএস কখন উপরে যায় তা সনাক্ত করতে প্রধান লুপটি ব্যবহার করছি এবং সংরক্ষিত কমান্ডটি সাফ করব। এইভাবে, যখন পরবর্তী লেনদেনের জন্য এসএসকে আবার কম টেনে আনা হয়, প্রথম বাইটটি কমান্ড বাইট হিসাবে বিবেচিত হয়।

আরও নির্ভরযোগ্যভাবে, এটি একটি বাধা দিয়ে করা হবে। এটি হ'ল আপনি এসএসকে শারীরিকভাবে কোনও একটি বাধা ইনপুটগুলির সাথে সংযুক্ত করবেন (উদাঃ, ইউনোতে, পিন 10 (এসএস) সাথে পিন 2 (একটি বিঘ্নিত ইনপুট) সংযুক্ত করুন বা পিন 10-এ একটি পিন-পরিবর্তন ইন্টারপ্ট ব্যবহার করবেন।

তারপরে এসএসটি কম বা উচ্চতর টানা হচ্ছে তখন বাধাটি লক্ষ্য করা যায়।

দাস (উদাহরণ)

// what to do with incoming data
volatile byte command = 0;

void setup (void)
  {

  // have to send on master in, *slave out*
  pinMode(MISO, OUTPUT);

  // turn on SPI in slave mode
  SPCR |= _BV(SPE);

  // turn on interrupts
  SPCR |= _BV(SPIE);

  }  // end of setup


// SPI interrupt routine
ISR (SPI_STC_vect)
  {
  byte c = SPDR;

  switch (command)
    {
    // no command? then this is the command
    case 0:
      command = c;
      SPDR = 0;
      break;

    // add to incoming byte, return result
    case 'a':
      SPDR = c + 15;  // add 15
      break;

    // subtract from incoming byte, return result
    case 's':
      SPDR = c - 8;  // subtract 8
      break;

    } // end of switch

  }  // end of interrupt service routine (ISR) SPI_STC_vect

void loop (void)
  {

  // if SPI not active, clear current command
  if (digitalRead (SS) == HIGH)
    command = 0;
  }  // end of loop

উদাহরণ আউটপুট

Adding results:
25
32
48
57
Subtracting results:
2
9
25
34
Adding results:
25
32
48
57
Subtracting results:
2
9
25
34

যুক্তি বিশ্লেষক আউটপুট

এটি উপরের কোডটিতে প্রেরণ এবং গ্রহণের মধ্যে সময় দেখায়:

এসপিআইয়ের মাস্টার এবং স্লেভ টাইমিং


আইডিই 1.6.0 এর পরে নতুন কার্যকারিতা

আইডিইর ১.6.০ সংস্করণ এসপিআইয়ের কাজ করার পদ্ধতিটি কিছুটা হলেও পরিবর্তন করেছে। এসপিআই ব্যবহার করার SPI.begin() আগে আপনাকে এখনও করা দরকার । এটি এসপিআই হার্ডওয়্যার সেট আপ করে। তবে এখন, আপনি যখন একটি স্লেভ সাথে যোগাযোগ শুরু চলেছেন আপনি আরো কি করতে SPI.beginTransaction()সঠিক সঙ্গে (এই ক্রীতদাস জন্য) SPI সেট আপ করার জন্য:

  • ঘড়ির গতি
  • বিট অর্ডার
  • ঘড়ির ধাপ এবং মেরুতা

আপনি যখন দাসের সাথে যোগাযোগের কাজ শেষ করেন, আপনি কল করেন SPI.endTransaction()। উদাহরণ স্বরূপ:

SPI.beginTransaction (SPISettings (2000000, MSBFIRST, SPI_MODE0));
digitalWrite (SS, LOW);        // assert Slave Select
byte foo = SPI.transfer (42);  // do a transfer
digitalWrite (SS, HIGH);       // de-assert Slave Select
SPI.endTransaction ();         // transaction over

এসপিআই কেন ব্যবহার করবেন?

আমি একটি প্রাথমিক প্রশ্ন যুক্ত করব: আপনি / কখন এসপিআই ব্যবহার করবেন? মাল্টি-মাস্টার কনফিগারেশনের প্রয়োজন বা খুব বেশি সংখ্যক ক্রীতদাস I2C- এর দিকে স্কেলটি ঝুঁকবে।

এটি একটি চমৎকার প্রশ্ন। আমার উত্তরগুলি হ'ল:

  • কিছু ডিভাইস (বেশ কয়েকটি) কেবল এসপিআই স্থানান্তর পদ্ধতি সমর্থন করে। উদাহরণস্বরূপ, 74HC595 আউটপুট শিফট রেজিস্টার, 74HC165 ইনপুট শিফট রেজিস্টার, MAX7219 এলইডি ড্রাইভার এবং আমি দেখেছি বেশ কয়েকটি এলইডি স্ট্রিপ। সুতরাং, আপনি এটি ব্যবহার করতে পারেন কারণ লক্ষ্য ডিভাইস কেবল এটি সমর্থন করে।
  • এসপিআই হ'ল এটিমেগ 328 (এবং অনুরূপ) চিপগুলিতে উপলব্ধ দ্রুততম পদ্ধতি। উপরে বর্ণিত দ্রুততম হার প্রতি সেকেন্ডে ৮৮৮,৮৮৮ বাইট। আই 2 সি ব্যবহার করে আপনি প্রতি সেকেন্ডে প্রায় 40,000 বাইট পেতে পারেন। আই 2 সি এর ওভারহেড বেশ যথেষ্ট, এবং আপনি যদি সত্যই দ্রুত ইন্টারফেস করার চেষ্টা করছেন, এসপিআই পছন্দসই পছন্দ। বেশ কয়েকটি চিপ পরিবার (যেমন, এমসিপি 23017 এবং এমসিপি 23 এস 17) আসলে আমি 2 সি এবং এসপিআই উভয়কেই সমর্থন করে যাতে আপনি প্রায়শই গতি এবং একক বাসে একাধিক ডিভাইস রাখার ক্ষমতা চয়ন করতে পারেন।
  • এসপিআই এবং আই 2 সি ডিভাইসগুলি উভয়ই আটমেগা 328-তে হার্ডওয়্যারে সমর্থিত যাতে আপনি ধারণা করেই এসআইপি এর মাধ্যমে একই সাথে আই 2 সি এর মাধ্যমে একটি স্থানান্তর করতে পারেন যা আপনাকে গতি বাড়িয়ে তুলবে।

উভয় পদ্ধতিরই রয়েছে নিজস্ব জায়গা। আই 2 সি আপনাকে একটি ডিভাইসে অনেকগুলি ডিভাইস সংযোগ করতে দেয় (দুটি তার, প্লাস গ্রাউন্ড) সুতরাং আপনার পছন্দসই পছন্দ হবে যদি আপনার যথেষ্ট পরিমাণে ডিভাইসগুলি জিজ্ঞাসাবাদ করার প্রয়োজন হয়, সম্ভবত মোটামুটি কমই। তবে আপনার যেখানে দ্রুত আউটপুট করা প্রয়োজন (যেমন, একটি এলইডি স্ট্রিপ) বা দ্রুত ইনপুট (যেমন, একটি এডিসি রূপান্তরকারী) এর জন্য এসপিআইয়ের গতি আরও প্রাসঙ্গিক হতে পারে।


তথ্যসূত্র


আপনি কি অদ্ভুততা coverাকতে যাচ্ছেন যা ডিউটির এসপিআই? যেখানে এসপিআই বন্দরের কনফিগারেশন ব্যবহৃত এসএস পিনের সাথে আবদ্ধ থাকে এবং সেখানে এসআইপিআই বন্দরে (আইআইআরসি) ৪ টি হার্ডওয়্যার এসএস পিন নির্ধারিত হয়?
মাজনকো

বাছাই সম্পর্কে অন্যান্য বিষয়: কখনও কখনও আপনার কাছে সত্যই কোনও বিকল্প নেই কারণ আপনি যে সেন্সরটি ব্যবহার করতে চান / প্রয়োজন তা কেবল আই 2 সি হিসাবে উপলভ্য।
ইগর স্টপপা

Are you going to cover the weirdness that is the Due's SPI?- ডিউডের এসপিআই সম্পর্কে আমি কিছুই জানি না (সামগ্রিক প্রোটোকলটি একইরকম মনে করা বাদ দিয়ে)। আপনাকে এর উত্তরটি যুক্ত করে একটি উত্তর যুক্ত করতে স্বাগতম।
নিক গ্যামন

এই উত্তরের অডিওবুক কখন প্রকাশিত হবে এবং আপনি নিজেই এটি
পড়বেন

1
@AMADANONInc। সম্ভবত একটি গানের ভিডিও? নাকি অ্যানিমেশন? আমি নিশ্চিত না যে আমার অস্ট্রেলিয়ান উচ্চারণটি বোধগম্য হবে কিনা। : পি
নিক গ্যামন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.