Arduino - सीरियल पेरिफेरल इंटरफ़ेस

एक सीरियल पेरीफेरल इंटरफेस (SPI) बस धारावाहिक संचार के लिए एक प्रणाली है, जो आमतौर पर तीन तक चार कंडक्टरों का उपयोग करती है। एक कंडक्टर का उपयोग डेटा प्राप्त करने के लिए किया जाता है, एक डेटा भेजने के लिए, एक सिंक्रनाइज़ेशन के लिए और एक वैकल्पिक रूप से संवाद करने के लिए एक डिवाइस का चयन करने के लिए किया जाता है। यह एक पूर्ण द्वैध कनेक्शन है, जिसका अर्थ है कि डेटा एक साथ भेजा और प्राप्त किया जाता है। I2C संचार प्रणाली में अधिकतम बॉड दर इससे अधिक है।

बोर्ड एसपीआई पिंस

एसपीआई निम्नलिखित चार तारों का उपयोग करता है -

  • SCK - यह मास्टर द्वारा संचालित धारावाहिक घड़ी है।

  • MOSI - यह मास्टर द्वारा संचालित मास्टर आउटपुट / स्लेव इनपुट है।

  • MISO - यह मास्टर इनपुट / स्लेव आउटपुट गुरु द्वारा संचालित है।

  • SS - यह गुलाम-चयन तार है।

निम्नलिखित कार्यों का उपयोग किया जाता है। आपको SPI.h को शामिल करना होगा।

  • SPI.begin() - SCK, MOSI और SS को आउटपुट पर सेट करके SPI बस को इनिशियलाइज़ करता है, SCK और MOSI को कम, और SS को हाई करता है।

  • SPI.setClockDivider(divider)- सिस्टम घड़ी के सापेक्ष एसपीआई घड़ी विभक्त लगाना। AVR आधारित बोर्डों पर, उपलब्ध डिवाइडर 2, 4, 8, 16, 32, 64 या 128 हैं। डिफ़ॉल्ट सेटिंग SPI_CLOCK_DIV4 है, जो SPI घड़ी को सिस्टम क्लॉक की आवृत्ति के एक-चौथाई के लिए सेट करती है (5 Mhz) बोर्ड 20 मेगाहर्ट्ज पर)।

  • Divider - यह (SPI_CLOCK_DIV2, SPI_CLOCK_DIV4, SPI_CLOCK_DIV8, SPI_CLOCK_DIV16, SPI_CLOCK_DIV32, SPI_CLOCK_DIV64, SPI_CLOCK_DIV128) हो सकता है।

  • SPI.transfer(val) - एसपीआई स्थानांतरण एक साथ भेजने और प्राप्त करने पर आधारित होता है: प्राप्त डेटा को प्राप्तवैल में लौटा दिया जाता है।

  • SPI.beginTransaction(SPISettings(speedMaximum, dataOrder, dataMode)) - speedMaximum घड़ी, dataOrder (MSBFIRST या LSBFIRST), dataMode (SPI_MODE0, SPI_MODE1, SPI_MODE2, या SPI_MODE3) है।

हमने एसपीआई में ऑपरेशन के चार तरीके इस प्रकार हैं -

  • Mode 0 (the default) - घड़ी आम तौर पर कम (CPOL = 0) होती है, और डेटा को निम्न से उच्च (अग्रणी किनारे) (CPHA = 0) पर संक्रमण के लिए नमूना लिया जाता है।

  • Mode 1 - घड़ी आम तौर पर कम (CPOL = 0) होती है, और डेटा को उच्च से निम्न (अनुगामी किनारे) (CPHA = 1) के संक्रमण पर नमूना लिया जाता है।

  • Mode 2 - घड़ी आम तौर पर उच्च (CPOL = 1) होती है, और डेटा को उच्च से निम्न (अग्रणी किनारे) (CPHA = 0) पर संक्रमण के लिए नमूना लिया जाता है।

  • Mode 3 - क्लॉक सामान्य रूप से उच्च (CPOL = 1) है, और डेटा को निम्न से उच्च (अनुगामी किनारे) (CPHA = 1) पर संक्रमण के लिए नमूना लिया जाता है।

  • SPI.attachInterrupt(handler) - एक दास डिवाइस को मास्टर से डेटा प्राप्त होने पर फंक्शन कहा जाता है।

अब, हम दो Arduino UNO बोर्डों को एक साथ जोड़ेंगे; एक गुरु के रूप में और दूसरा दास के रूप में।

  • (एसएस): पिन १०
  • (MOSI): पिन 11
  • (MISO): पिन १२
  • (SCK): पिन 13

जमीन आम है। निम्नलिखित दोनों बोर्डों के बीच संबंध का आरेखात्मक प्रतिनिधित्व है -

आइए एसपीआई के उदाहरणों को मास्टर और एसपीआई को दास के रूप में देखें।

मास्टर के रूप में एस.पी.आई.

उदाहरण

#include <SPI.h>

void setup (void) {
   Serial.begin(115200); //set baud rate to 115200 for usart
   digitalWrite(SS, HIGH); // disable Slave Select
   SPI.begin ();
   SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
}

void loop (void) {
   char c;
   digitalWrite(SS, LOW); // enable Slave Select
   // send test string
   for (const char * p = "Hello, world!\r" ; c = *p; p++) {
      SPI.transfer (c);
      Serial.print(c);
   }
   digitalWrite(SS, HIGH); // disable Slave Select
   delay(2000);
}

SLAVE के रूप में एसपीआई

उदाहरण

#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;

void setup (void) {
   Serial.begin (115200);
   pinMode(MISO, OUTPUT); // have to send on master in so it set as output
   SPCR |= _BV(SPE); // turn on SPI in slave mode
   indx = 0; // buffer empty
   process = false;
   SPI.attachInterrupt(); // turn on interrupt
}
ISR (SPI_STC_vect) // SPI interrupt routine { 
   byte c = SPDR; // read byte from SPI Data Register
   if (indx < sizeof buff) {
      buff [indx++] = c; // save data in the next index in the array buff
      if (c == '\r') //check for the end of the word
      process = true;
   }
}

void loop (void) {
   if (process) {
      process = false; //reset the process
      Serial.println (buff); //print the array on serial monitor
      indx= 0; //reset button to zero
   }
}