15
Mar
2023

SPI protokolü

SPI (Serial Peripheral Interface), gömülü sistemlerde kullanılan, kısa mesafeli, senkron iletişim türüdür. 1980’lerde Motorola tarafından geliştirilmiştir. SD Kart ve LCD ekranlarda sıkça kullanılır.

SPI iletişimde iki tür aygıt vardır:

  1. Master (Efendi): İletişimi kontrol eden aygıttır.
  2. Slave (Köle): Master kontrolü ile iletişim gerçekleştiren aygıttır.

SPI full duplex iletişim sağlar. Yani, aynı anda iki aygıt da birbirine veri gönderebilir.

SPI iletişim için 4 veriyolu kullanılır:

  1. SCL (Serial Clock): Saat sinyalini taşıyan veriyoludur. SCK, CLK olarak da adlandırılır.
  2. MOSI (Master Out Slave In): Master aygıttan slave aygıta veri taşıyan veriyoludur. DIN (Data In) veya SIN (Serial In) olarak da adlandırılır.
  3. MISO (Master In Slave Out): Slave aygıttan master aygıta veri taşıyan veriyoludur. DO (Data Out) veya SO (Serial Out) olarak da adlandırılır.
  4. SS (Slave Select): Hangi slave aygıt ile haberleşme gerçekleşeceğini belirleyen veriyoludur. CS (Chip Select) olarak da adlandırılır. Sistem idle (boşta) durumda iken lojik 1, veri transferi sırasında lojik 0 durumundadır.

SPI iletişim, kullanılan slave aygıt sayısına göre Single Slave (Tek Köle) veya Multi Slave (Çok Köle) şeklinde sınıflandırılır.

Single Slave SPI

Single Slave SPI iletişimde bir master ve bir slave aygıt vardır.

Single Slave SPI

Örnek Single Slave SPI İletişim

  1. SPI iletişim hattında iletişimi başlatmak için master, SCL hattı sürekli lojik 1 konumunda iken (saat kapalı iken) SS hattını 0’a çeker ve SCL veriyolu üzerinde saat frekansını çalıştırır.
  2. SCL hattında iletişimin hızına uygun biçimde sürekli bir saat frekansı üretilir. Örneğin SCL frekansı 1Hz ise SCL hattı yarım saniye lojik 1, yarım saniye 0 konumundadır, yani her saniye bir pulse üretilmektedir.
  3. Saat frekansı ile senkronize şekilde MOSI ve MISO hatlarından aynı anda saniyede 1 bit veri gönderilebilir. MOSI veriyolu master aygıttan slave aygıta, MISO veriyolu da tam tersi yönde veri taşır.
  4. İletişim tamamlandığında SS hattı lojik 1 durumuna getirilir.

Multi Slave SPI

Multi Slave SPI iletişimde bir master birden fazla slave ile iletişim halindedir. Multi Slave SPI, Typical (Tipik) SPI ve Daisy Chain (Papatya Zinciri) şeklinde iki sınıfa ayrılır.

Typical (Tipik) Multi Slave SPI

Tipik Multi Slave sistemde master aygıtın birden fazla SS (Slave Select) çıkışı vardır. SCL, MISO ve MOSI çıkışlar tüm slave aygıtlara paralel bağlı iken, her slave yalnızca bir SS çıkışına bağlıdır. İletişim Single Slave SPI yapısına çok benzer. Master aygıt bir slave aygıta veri göndermek istediğinde o slave aygıta bağlı olan SS hattını lojik 0’a çeker. Veri tüm slave aygıtlara ulaşır ancak hangi slave aygıtın SS veriyolu lojik 0 ise o slave aygıt veriyi belleğe alır.

Daisy Chain Multi Slave sistemde tüm slave aygıtlar aynı SS hattını kullanır. Tipik Multi Slave sistemden farklı olarak slave aygıtlar doğrudan master aygıta değil birbirlerine zincir şeklinde bağlıdır. Bu sistemde bir adresleme yapısı olmadığı için bir slave aygıta veri göndermek için slave aygıtlar üzerindeki shift register (kayar yazmaç) yapısı kullanılır.

Daisy Chain (Papatya Zinciri) Multi Slave SPI

Daisy Chain Multi Slave SPI Örnek İletişim:

  1. SPI iletişim hattında iletişimi başlatmak için master, SCL hattı sürekli lojik 1 konumunda iken (saat kapalı iken) SS hattını 0’a çeker ve SCL veriyolu üzerinde saat frekansını çalıştırır.
  2. SCL hattında iletişimin hızına uygun biçimde sürekli bir saat frekansı üretilir.
  3. Örneğin 2 numaralı slave aygıta veri gönderilecekse, bu veri önce 1 numaralı slave aygıta iletilir. Bu durumda 1 numaralı aygıtın shift register verisi 2 numaralı slave aygıta, 2 numaralı slave aygıtın shift register verisi 3 numaralı slave aygıta, 3 numaralı slave aygıtın shift register verisi master aygıta geçer. Yani tüm veri hat üzerinde bir sonraki aygıta kaydırılır (shift işlemi). Verinin 2 numaralı slave aygıta geçmesi için bir kez daha kaydırma (shift) işlemi gerçekleşir.
  4. İletişim tamamlandığında SS hattı lojik 1 durumuna getirilir.

Arduino ile SPI iletişim

Aşağıda Arduino ile 5110 LCD ekran arasında SPI protokolü ile iletişim örneği verilmiştir. 5110 LCD, ilk defa Nokia 5110 cep telefonları ile kullanılmış ve günümüzde Arduino uygulamalarında sıklıkla kullanılan, ucuza temin edilebilen ve kullanımı kolay bir LCD modüldür. Philips PCD8544 denetleyici ile ve SPI arayüzü ile çalışır. Yatayda 84 ve dikeyde 48 piksel çözünürlüğe sahiptir. LCD, her biri 20mA akım çeken 4 adet led aydınlatmaya sahiptir.

5110 LCD modülü üzerinde 8 adet pin bulunur. Bu pinler sırasıyla aşağıdaki şekildedir:

  • RST (Reset) pini ekranı sıfırlar. Bu pinden LOW sinyali alındığında ekran sıfırlanır.
  • CE (Chip Enable) pini aynı SPI veriyolunu paylaşan cihazlardan birini seçmek için kullanılır.
  • D/C (Data/Command) pini gelen verinin bir komut mu yoksa ekrana yazdırılacak bir veri mi olduğunu gösterir.
  • DIN (Data In) pini, LCD için seri veri pinidir. MOSI pinidir.
  • CLK (Clock), SPI arayüzü için saat pinidir.
  • VCC pini, 3.3V besleme ile LCD ekrana güç sağlar.
  • BL (Back Light) pini ekranın arka ışığını kontrol eder. Bu pin Arduino’ nun PWM pinlerine  bağlanarak ekran aydınlatmasının seviyesi kontrol edilebilir.
  • GND pini toprak bağlantısıdır.

İletişim Arduino’dan 5110 LCD’ye tek yönlü, yani simplex iletişim gerçekleşmektedir. Bu nedenle LCD üzerinde MISO pini yoktur.

Malzemeler

  • 1 adet Arduino
  • 1 adet 5110 LCD
  • 5 adet 10K direnç
  • 1 adet 1K direnç

Bağlantı şeması

5110 LCD modülü 3,3V besleme ile çalışır. 5V ile çalışan Arduino’ nun data pinlerine 5110 LCD’ nin RST, CE, DC, DIN ve CLK pinlerini 10K direnç ile, BL pinine de 1K direnç ile bağlayarak LCD’ yi gerilim kaynaklı problemlerden korumak mümkündür.

Kaynak kod

Arduino için LCD5110_Basic.h kütüphanesini indirmek için tıklayınız.

LCD5110_Basic.h kütüphanesindeki fonksiyonların kılavuzu için tıklayınız.

#include <LCD5110_Basic.h>  
LCD5110 lcd(8,9,10,11,12); 

extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
 
void setup()
{
  lcd.InitLCD();  
}
 
void loop()
{ 
  lcd.setFont(SmallFont);  
  lcd.clrScr();  
  lcd.print("hbmacit.com", CENTER, 0);
  lcd.print("Hello World!", CENTER, 12);
  lcd.setFont(MediumNumbers);
  int sayi = 0;  
  lcd.printNumI(sayi, CENTER, 24);
}

Yukarıdaki kod çalıştığında, 5110 LCD’ de aşağıdaki görüntü elde edilecektir.