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.
05.09.2021 tarihli yazı 11936 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.
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()
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.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:
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)
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
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
YORUMLAR
Aktif etkinlik bulunmamaktadır.
- Dünyanın En Görkemli 10 Güneş Tarlası
- Dünyanın En Büyük 10 Makinesi
- 2020’nin En İyi 10 Kişisel Robotu
- Programlamaya Erken Yaşta Başlayan 7 Ünlü Bilgisayar Programcısı
- Üretimin Geleceğinde Etkili Olacak 10 Beceri
- Olağan Üstü Tasarıma Sahip 5 Köprü
- Dünyanın En İyi Bilim ve Teknoloji Müzeleri
- En İyi 5 Tıbbi Robot
- Dünyanın En Zengin 10 Mühendisi
- Üretim için 6 Fabrikasyon İşlemi
- Denizcilik Endüstri Uygulamaları ve Servis Bakım Süreçleri
- DrivePro Yaşam Döngüsü Hizmetleri
- Batarya Testinin Temelleri
- Enerji Yönetiminde Ölçümün Rolü: Verimliliğe Giden Yol
- HVAC Sistemlerinde Kullanılan EC Fan, Sürücü ve EC+ Fan Teknolojisi
- Su İşleme, Dağıtım ve Atık Su Yönetim Tesislerinde Sürücü Kullanımı
- Röle ve Trafo Merkezi Testlerinin Temelleri | Webinar
- Chint Elektrik Temel DIN Ray Ürünleri Tanıtımı
- Sigma Termik Manyetik Şalterler ile Elektrik Devrelerinde Koruma
- Elektrik Panoları ve Üretim Teknikleri
ANKET