Arduino SPI Haberleşme

Bu konumuzda SPI haberleşme ve SPI protokolünden bahsedeceğiz.SPI (Serial Peripheral Interface ) türkçesi “Seri Çevresel Arayüz” olarak çevrilebilir.Seri haberleşmede sıklıkla kullanılan verimli bir teknolojidir.Motorola firması tarafından geliştirilmiştir.SPI eş zamanlı çift yönlü çalışabilen senkron saat darbeleriyle birlikte eş zamanlı olarak aktarıldığı bir seri haberleşme standardıdır ve pek çok tüm devre tarafından donanımsal olarak desteklenmektedir.Bu haberleşmede veri(data, bitler) transferi master-slave ilişkisi ile gerçekleşir.Master veri haberleşmesini başlatan cihazdır. Master tarafından veri transferi başlatıldıktan sonra veri her iki yönde de eş zamanlı olarak aktarılabilir.Alınan baytın anlamlı olup olmadığı bilgiyi alan cihaza kalmıştır.
SPI haberleşmede aygıtlar birbirleriyle master – slave ilişkisi içerisinde haberleşirler. Haberleşme master’ın kontrolünde gerçekleşir. Master aygıt haberleşme yapacağı aygıtı seçer ve ikisi arasındaki haberleşmeyi başlatır.
Malzemeleri Satın Al
Projenin Son Hali
SPI, 4 sinyal hattından oluşur. Bunlar:
- MISO / SDO – Master Input Slave Output / Serial Data Out
- MOSI / SDI – Master Output Slave Input / Serial Data In
- SCK (SCLK) – Serial Clock
- SS / CS – Slave Select Pin / Chip Select
MISO, verinin slave’den master’a doğru aktığı hattır. MOSI ise verinin master’dan slave’e doğru aktığı hattır. SS pini master’ın veri alışverişinde bulunacağı slave’i seçtiği pindir. Master’ın haberleşeceği slave’i seçmesi, slave’in bağlı olduğu SS pininin master tarafından lojik-0 yapılması ile olur. SCK clock sinyallerinin geçtiği hattır. Clock’lar master tarafından üretilir. MISO ve MOSI hatlarından veri akışı bu clock sinyallerine senkronize olarak gerçekleşir.
#include <SPI.h>
void setup (void)
{
digitalWrite(SS, HIGH);
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV8);
}
void loop (void)
{
char c;
digitalWrite(SS, LOW);
for (const char * p = "Merhaba!\n" ; c = *p; p++)
SPI.transfer (c);
digitalWrite(SS, HIGH);
delay (1000);
}
Slave Kodu
#include <SPI.h>
char buf [100];
volatile byte pos;
volatile boolean process_it;
void setup (void)
{
Serial.begin (9600);
SPCR |= bit (SPE);
pinMode(MISO, OUTPUT);
pos = 0;
process_it = false;
SPI.attachInterrupt();
}
ISR (SPI_STC_vect)
{
byte c = SPDR;
if (pos < sizeof buf)
{
buf [pos++] = c;
if (c == '\n')
process_it = true;
}
}
void loop (void)
{
if (process_it)
{
buf [pos] = 0;
Serial.println (buf);
pos = 0;
process_it = false;
}
}