elektrik port üyelik servisleri elektrik port üyelik servisleri

Arduino SPI Haberleşme Nedir?

Mikrodenetleyiciler arasındaki iletişim için kullanılan seri haberleşme yöntemlerinden biri olan SPI haberleşme, endüstri 4.0 ile daha önemli bir konuma geldi. Bu yazımızda Arduino SPI Haberleşme konusuna değindik.



A- A+
05.09.2021 tarihli yazı 11918 kez okunmuştur.

Serial Peripheral Interface (SPI) Nedir?

Serial Peripheral Interface (SPI), mikrodentleyiciler tarafından kısa bir mesafelerde bir veya daha fazla çevresel aygıtla hızlı bir şekilde iletişim kurmak için kullanılan senkronize bir seri veri protokolüdür. İki mikrodenetleyici arasındaki iletişim için kullanılır.

Bir SPI bağlantıda, her zaman çevresel aygıtları kontrol eden bir master vardır. Tipik olarak tüm cihazlarda ortak olan üç hat vardır:


MISO (Master In Slave Out): Master’a veri gönderen Slave hattı.
MOSI (Master Out Slave In): Çevre birimlere veri gönderen Master hattı.
SCK (Serial Clock): MAster tarafından üretilen veri iletimini senkronize eden saat darbeleri.

Her cihaza özel olan hat:


SS (Slave Select): Master’ın belirli aygıtları etkinleştirmek ve devre dışı bırakmak için kullanabileceği her aygıttaki pin. 
 
►İlginizi Çekebilir: Arduino Pinleri ve Fonksiyonları

Bir cihazın Slave Select pini LOW olduğunda, master ile iletişim kurar. HIGH olduğunda, master’ı görmezden gelir. Bu, aynı MISO, MOSI ve CLK hatlarını paylaşan birden fazla SPI cihazına sahip olmanızı sağlar.

Yeni bir SPI cihazı için kod yazarken dikkat edilmesi gerekenler:


Cihazınızın kullanabileceği maksimum SPI hızı nedir? Bu, SPISettings'deki ilk parametre tarafından kontrol edilir. 15 MHz değerinde bir çip kullanıyorsanız 15000000 kullanın. Arduino, SPISettings ile kullandığınız sayıya eşit veya daha düşük olan en iyi hızı otomatik olarak kullanacaktır.

Veriler önce Most Significant Bit (MSB) mi yoksa Least Significant Bit (LSB) mi kaydırılır? Bu, MSBFIRST veya LSBFIRST gibi ikinci SPISettings parametresi tarafından kontrol edilir. Çoğu SPI yongası, MSB ilk veri sırasını kullanır.

Data Clock HIGH veya LOW olduğunda boşta mı? Örnekler, clock darbelerinin yükselen veya düşen kenarında mı? Bu modlar SPISettings'deki üçüncü parametre tarafından kontrol edilir.



SPI standarları gevşektir ve her cihaz bunu biraz farklı şekilde uygular.  Bu, kodu yazarken cihazın veri sayfasına dikkat edilmesi gerektiği anlamına gelir.

Genel olarak dört iletim modu vardır. Bu modlar data clock sinyalinin yükselen veya düşen kenarlarında verilerin içeri ve dışarı kaydırlıp kaydırılmadığını veya clock yüksek veya düşük olduğunda boşta olup olmadığını kontrol eder.

Bu dört mod, bu tabloya göre polarite ve fazı birleştirilir:


 
►İlginizi Çekebilir: Manchester Kodlaması Nedir?

SPI parametrelerinizi aldıktan sonra, SPI portunu kullanmaya başlamak için SPI.beginTransaction() kullanın. SPI bağlantı noktası, tüm ayarlarınızla yapılandırılacaktır. SPISettings'i kullanmanın en basit ve en verimli yolu doğrudan SPI.beginTransaction() içindedir.  Örneğin:
 
SPI.beginTransaction(SPISettings(140000000, MSBFIRST, SPI_MODE0));
 
Diğer kitaplıklar kesintilerden SPI kullanıyorsa, siz SPI.endTransaction()'ı çağırana kadar SPI'ye erişmeleri engellenir. SPI ayarları işlemin başında uygulanır ve SPI.endTransaction() SPI ayarlarını değiştirmez. Siz veya bir kitaplık, ikinci kez startTransaction'ı çağırmadıkça, ayar korunur. Programınız SPI kullanan diğer kitaplıklarla birlikte kullanılıyorsa, en iyi uyumluluk için SPI.endTransaction()'ı çağırmadan önceki süreyi en aza indirmeye çalışmalısınız.



Çoğu SPI cihazında, SPI.beginTransaction()'dan sonra, slave seçim pinini LOW yazacaksınız, veri aktarmak için istediğiniz sayıda SPI.transfer()'i arayacaksınız, ardından SS pinini HIGH yazacaksınız ve son olarak SPI.endTransaction()'ı çağıracaksınız.
 

Bağlantılar

Aşağıdaki tablo, farklı Arduino kartlarında SPI çizgilerinin hangi pinlerde olduğunu gösteriri:

Arduino UNO SPI Pinleri

Aşağıdaki resimde Arduino UNO üzerinde bulunan SPI pinleri gösterilmektedir.

 

Arduino’da SPI Kullanımı

İki arduino arasındaki SPI iletişim için programlamaya başlamadan önce Arduino IDE’de kullanılan SPI kütüphanesini öğrenmemiz gerekiyor.
Kütüphane <SPI.h>, SPI iletişimi için aşağıdaki fonksiyonları programa dahil etmiştir.


SPI.begin()
SCK, MOSI, MISO ve SS ‘yi çıkışlara ayarlayarak, SCK ve MOSI ‘yi LOW ve SS’yi  HIGH çekerek SPI veriyolunu başlatır.

SPI.setClockDivider(divider)
SPI saat bölücüyü sistem saatine göre ayarlamak için kullanılır. Kullanılabilir bölücüler 2, 4, 8, 16, 32, 64 veya 128'dir.
Dividers:
  • SPI_CLOCK_DIV2
  • SPI_CLOCK_DIV4
  • SPI_CLOCK_DIV8
  • SPI_CLOCK_DIV16
  • SPI_CLOCK_DIV32
  • SPI_CLOCK_DIV64
  • SPI_CLOCK_DIV128
SPI.attachInterrupt(handler)
Bu fonksiyon, bir slave cihaz master ‘dan veri aldığında çağrılır.

SPI.transfer(val)
Bu fonksiyon, master ve slave arasında aynı anda veri göndermek ve almak için kullanılır.
 

Arduino SPI İletişim Devre Şeması

Aşağıdaki devre şeması, Arduino UNO üzerinde SPI'nin nasıl kullanılacağını gösterir, ancak Arduino Mega SPI İletişimi veya Arduino nano SPI iletişimi için aynı prosedürü takip edebilirsiniz. Pin numarası dışında hemen hemen her şey aynı kalacaktır. Arduino nano SPI pinlerini ve Arduino Mega pinlerini bulmak için Arduino nano veya mega pin çıkışını kontrol etmelisiniz, bir kez yaptığınızda diğer her şey aynı olacaktır.




Master Arduino için kod:

//SPI MASTER (ARDUINO)
//SPI COMMUNICATION BETWEEN TWO ARDUINO 
//CIRCUIT DIGEST
#include<SPI.h>                             //Library for SPI 
#define LED 7           
#define ipbutton 2
int buttonvalue;
int x;
void setup (void)
{
  Serial.begin(115200);                   //Starts Serial Communication at Baud Rate 115200 
  
  pinMode(ipbutton,INPUT);                //Sets pin 2 as input 
  pinMode(LED,OUTPUT);                    //Sets pin 7 as Output
  
  SPI.begin();                            //Begins the SPI commnuication
  SPI.setClockDivider(SPI_CLOCK_DIV8);    //Sets clock for SPI communication at 8 (16/8=2Mhz)
  digitalWrite(SS,HIGH);                  // Setting SlaveSelect as HIGH (So master doesnt connnect with slave)
}
void loop(void)
{
  byte Mastersend,Mastereceive;          
  buttonvalue = digitalRead(ipbutton);   //Reads the status of the pin 2
  if(buttonvalue == HIGH)                //Logic for Setting x value (To be sent to slave) depending upon input from pin 2
  {
    x = 1;
  }
  else
  {
    x = 0;
  }
  
  digitalWrite(SS, LOW);                  //Starts communication with Slave connected to master
  
  Mastersend = x;                            
  Mastereceive=SPI.transfer(Mastersend); //Send the mastersend value to slave also receives value from slave
  
  if(Mastereceive == 1)                   //Logic for setting the LED output depending upon value received from slave
  {
    digitalWrite(LED,HIGH);              //Sets pin 7 HIGH
    Serial.println("Master LED ON");
  }
  else
  {
   digitalWrite(LED,LOW);               //Sets pin 7 LOW
   Serial.println("Master LED OFF");
  }
  delay(1000);
}
Slave Arduino için kod:
//SPI SLAVE (ARDUINO)
//SPI COMMUNICATION BETWEEN TWO ARDUINO 
//CIRCUIT DIGEST
//Pramoth.T
#include<SPI.h>
#define LEDpin 7
#define buttonpin 2
volatile boolean received;
volatile byte Slavereceived,Slavesend;
int buttonvalue;
int x;
void setup()
{
  Serial.begin(115200);
  
  pinMode(buttonpin,INPUT);               // Setting pin 2 as INPUT
  pinMode(LEDpin,OUTPUT);                 // Setting pin 7 as OUTPUT
  pinMode(MISO,OUTPUT);                   //Sets MISO as OUTPUT (Have to Send data to Master IN 
  SPCR |= _BV(SPE);                       //Turn on SPI in Slave Mode
  received = false;
  SPI.attachInterrupt();                  //Interuupt ON is set for SPI commnucation
  
}
ISR (SPI_STC_vect)                        //Inerrrput routine function 
{
  Slavereceived = SPDR;         // Value received from master if store in variable slavereceived
  received = true;                        //Sets received as True 
}
void loop()
{ if(received)                            //Logic to SET LED ON OR OFF depending upon the value recerived from master
   {
      if (Slavereceived==1) 
      {
        digitalWrite(LEDpin,HIGH);         //Sets pin 7 as HIGH LED ON
        Serial.println("Slave LED ON");
      }else
      {
        digitalWrite(LEDpin,LOW);          //Sets pin 7 as LOW LED OFF
        Serial.println("Slave LED OFF");
      }
      
      buttonvalue = digitalRead(buttonpin);  // Reads the status of the pin 2
      
      if (buttonvalue == HIGH)               //Logic to set the value of x to send to master
      {
        x=1;
        
      }else
      {
        x=0;
      }
      
  Slavesend=x;                             
  SPDR = Slavesend;                           //Sends the x value to master via SPDR 
  delay(1000);
}
}


Kaynaklar:


arduino.cc/en/reference/SPI
circuitdigest.com/microcontroller-projects/arduino-spi-communication-tutorial
 


Aktif etkinlik bulunmamaktadır.
ANKET
Endüstri 4.0 için En Hazır Sektör Hangisidir

Sonuçlar