SPI Nedir?

SPI Nedir?

SPI Nedir? Serial Peripheral Interface (Seri Çevre Birimi Arayüzü – SPI); mikrodenetleyiciler, kaydırmalı kaydediciler (shift registers), sensörler ve SD kart modülleri gibi çevre birimleri arasında yüksek hızda veri transferi sağlamak amacıyla yaygın olarak tercih edilen kararlı bir seri haberleşme protokolüdür. İletişime geçilecek hedef cihazı seçmek için özel bir seçim hattı (Chip Select) ile birlikte bağımsız saat (clock) ve veri hatlarını kullanır.

Seri haberleşme, verilerin tek bir iletişim kanalı veya veri yolu üzerinden bitler halinde sırayla (ardışık) gönderilmesi işlemidir. Mikrodenetleyiciler dünyasında UART, I2C, CAN, USB ve SPI gibi farklı ihtiyaçlara yönelik geliştirilmiş birçok seri haberleşme standardı bulunur.

SPI Protokolünün Tarihçesi

Kısa adıyla SPI olarak bilinen bu protokol, ilk olarak 1970’lerin sonunda Motorola firması tarafından geliştirilmiştir. SPI, tam çift yönlü (full-duplex) bağlantı yapısına sahiptir; bu da verilerin aynı anda hem gönderilip hem de alınabilmesi anlamına gelir.

Diğer bir deyişle, ana cihaz (master/controller) çevre birimine (slave/peripheral) veri aktarırken, çevre birimi de aynı saat darbesi içerisinde ana cihaza veri gönderebilir. SPI ayrıca senkron bir haberleşme protokolüdür; yani veri alışverişinin zamanlamasını ve kararlılığını sağlamak için ortak bir saat sinyaline (clock) ihtiyaç duyar.

Asenkron Seri Bağlantıların Sınırları Nelerdir? (TX/RX)

Sadece TX ve RX hatlarını kullanan geleneksel seri bağlantılar asenkron (eş zamansız) olarak çalışır. Bunun sebebi, verilerin tam olarak hangi mikrosaniyede gönderileceğini kontrol eden ortak bir saat hattının bulunmaması ve alıcı ile vericinin saat frekanslarının %100 aynı olduğunun garanti edilememesidir. Elektronik sistemler normalde kararlı bir ana saat kristaline bağlı olarak senkronize çalıştığından, saat hızları arasında küçük de olsa sapma bulunan iki bağımsız sistemin asenkron haberleşmeye çalışması veri bozulmalarına yol açabilir.

Bu senkronizasyon problemini çözebilmek adına asenkron seri protokoller, gönderilen her veri baytına (8-bit) fazladan birer “başlangıç” (start) ve “durdurma” (stop) biti ekler. Bu bitler alıcının gelen verinin başlangıcını tespit ederek kendi iç zamanlayıcısını senkronize etmesine yardımcı olur.

Ayrıca, her iki tarafın da önceden belirlenmiş ortak bir haberleşme hızında (örneğin 9600 baud rate) uzlaşması gerekir. Alıcı her yeni baytın başında kendini yeniden eşitlediği için, baud hızındaki minimal sapmalar haberleşmeyi engellemez.

Asenkron Seri Haberleşme Sinyal Yapısı

Faydalı Bilgi (Bit Sıralaması): Yukarıdaki şemada yer alan “11001010” ikili kodunun (binary) doğrudan 0x53 (hexadecimal) değerine eşit olmadığını fark etmiş olabilirsiniz. Bunun nedeni, seri haberleşme protokollerinin genellikle en önemsiz biti (LSB – Least Significant Bit) ilk önce göndermesidir. Yani en küçük değerli bit en soldadır. Şemadaki veriyi sağdan sola doğru okursak; alt yarım bayt (nibble) 0011 = 0x3, üst yarım bayt (nibble) ise 0101 = 0x5 değerini verir ve sonuç 0x53 olur.

Asenkron seri haberleşme pratik ve yaygın bir yöntem olsa da, her bayt ile birlikte iletilen başlangıç/bitiş bitleri nedeniyle hat üzerinde ciddi bir ek protokol yükü (overhead) yaratır. Ayrıca alıcı ve verici donanımının (UART) mimarisi oldukça karmaşıktır. Kendi projelerinizde de deneyimlediğiniz gibi, iki cihazın baud hızı uyuşmadığında Seri Monitörde anlamsız karakterler (garbage data) listelenir. Bunun nedeni, alıcının gelen sinyali yanlış mikrosaniyelerde örneklemesidir (yukarıdaki şemada yer alan oklar).

Kararlı ve Hızlı Çözüm: Senkron Haberleşme

SPI, asenkron haberleşmenin bu sınırlarını ortadan kaldırmak için senkron (eş zamanlı) veri yolu mimarisini kullanır. Bu mimaride veri hatlarından tamamen bağımsız, iki cihazı da milisaniyenin milyonda biri hassasiyetinde eş zamanlı tutan ortak bir saat hattı (SCK) bulunur. Saat sinyali, alıcı cihaza veri hattındaki bitleri tam olarak ne zaman okuması (örneklemesi) gerektiğini söyleyen salınımlı (kare dalga) bir sinyaldir.

Veri okuma işlemi, saat sinyalinin yükselen kenarında (rising edge) veya düşen kenarında (falling edge) gerçekleştirilir; bu parametre kullanılan çevre biriminin teknik dökümanında (datasheet) belirtilir. Alıcı bu kenar geçişini algıladığı anda veri hattındaki lojik seviyeyi okur (aşağıdaki şemadaki oklar). Saat sinyali veri ile birlikte eş zamanlı iletildiği için, cihazların desteklediği maksimum sınırlara kadar hızın önceden tam olarak belirlenmesi zorunlu değildir.

Senkron SPI Haberleşme Sinyal Şeması

SPI protokolünün endüstride bu kadar yaygın ve popüler olmasının temel sebeplerinden biri, alıcı tarafındaki donanım gereksiniminin sadece basit bir kaydırmalı kaydediciden (shift register) ibaret olmasıdır. Bu basit donanım yapısı, asenkron haberleşme için gereken tam teşekküllü bir UART donanımına kıyasla hem çok daha ucuz hem de mikroçip üzerinde üretimi son derece kolay bir mimaridir.

Önemli Terim Güncellemesi (OSHWA Standartları)

SPI pinleri için geleneksel MOSI/MISO/SS terimleri yerine COPI, CIPO, CS gibi yeni etiketlerle karşılaşıyor olabilirsiniz. Açık Kaynaklı Donanım Derneği (OSHWA) topluluğu, kapsayıcı bir dil kullanmak amacıyla “Master” ve “Slave” gibi kavramları devre dışı bırakarak terminolojiyi güncelledi. Konuyla ilgili teknik detaylara ve yeni etiket standartlarına ulaşmak için buradaki detaylı içeriğimize göz atabilirsiniz.

Yeni standartlar çerçevesinde güncellenen SPI pin mimarisini, giriş ve çıkış yönlerini detaylıca öğrenmek için SPI Haberleşme Pin Etiketleri isimli makalemizi mutlaka incelemenizi tavsiye ederiz.

Çift Yönlü Veri İletişim Mekanizması

Peki senkron yapı tek yönlü veri transferi için mükemmel olsa da, çevre biriminden ana cihaza veri dönüşü nasıl sağlanır? SPI veri yolunda bu işlem son derece kararlı ve eş zamanlı bir hat yapısıyla çözülmüştür.

SPI ağında saat sinyalini (SCK/CLK) üreten yalnızca tek bir cihaz bulunur. Bu saat sinyalini yöneten ana cihaza Kontrolcü (Controller / Eski adıyla Master), onun komutlarına yanıt veren bağlı donanımlara ise Çevre Birimi (Peripheral / Eski adıyla Slave) denir. Bir veri yolunda her zaman tek bir aktif kontrolcü (genellikle mikrodenetleyiciniz) bulunur, ancak birden fazla çevre birimi yer alabilir.

Kontrolcüden çevre birimine giden veriler, COPI (Controller Out – Peripheral In) adı verilen hat üzerinden gönderilir. Çevre biriminden kontrolcüye veri gönderilmesi gerektiğinde ise, kontrolcü yine saat sinyali üretmeye devam eder ve çevre birimi bu saat darbelerini kullanarak verilerini CIPO (Controller In – Peripheral Out) adı verilen üçüncü bir veri hattına yerleştirir.

SPI Master Slave Haberleşme Çevrimi

Önemli Prensip: Saat sinyali her zaman Kontrolcü tarafından üretildiği için, Kontrolcü ne zaman veri alacağını ve bu verinin kaç bayt uzunluğunda olacağını önceden bilmek zorundadır. Bu durum, veri uzunluğunun tamamen serbest olduğu asenkron seri haberleşmeden çok farklıdır.

Ancak pratikte bu bir kısıtlama yaratmaz; çünkü SPI genellikle belirli bir komut-yanıt yapısına sahip olan sensörlerle (örneğin ivmeölçerler veya sıcaklık sensörleri) iletişim kurmakta kullanılır. Örneğin, bir sensöre “veri oku” komutu gönderdiğinizde, sensörün size her zaman tam olarak iki baytlık bir veri döndüreceğini bilirsiniz.

SPI’nin tam çift yönlü (full-duplex) yapıda olması, uygun donanımlarda aynı anda hem komut gönderip hem de veri alabilmenize olanak tanır. Kullandığınız sensörün bu özelliği destekleyip desteklemediğini öğrenmek için mutlaka üretici veri kitapçığına (datasheet) başvurun.

Chip Select (CS) – Seçim Hattı

SPI mimarisinin en kritik bileşenlerinden biri de Chip Select (CS) hattıdır. Bu pin, veri hattına bağlı olan birden fazla çevre biriminden hangisiyle iletişim kurulacağını seçmek ve o cihazı uyandırıp veri alışverişine hazır hale getirmek için kullanılır.

SPI Chip Select Bağlantı Şeması

CS hattı varsayılan olarak High (Lojik 1) seviyesinde tutulur. Bu durum çevre birimini SPI veri yolundan izole eder. (Bu mantığa elektronikte “aktif düşük – active low” denir). Kontrolcü, belirli bir çevre birimiyle konuşmak istediğinde o birime ait CS hattını Low (Lojik 0) seviyesine çekerek cihazı aktif hale getirir. Haberleşme bittiğinde ise CS hattı tekrar High seviyesine yükseltilir.

Çoklu Çevre Birimi Bağlantı Mimarisi

Birden fazla çevre birimini tek bir SPI veri yoluna bağlamak için kullanılan iki yaygın yöntem mevcuttur:

1. Paralel Yıldız Bağlantı (Bağımsız CS): En yaygın kullanılan bu yöntemde, tüm çevre birimleri COPI, CIPO ve SCK hatlarını ortak paylaşır. Ancak her çevre biriminin kontrolcüye doğrudan bağlı bağımsız bir CS (Chip Select) hattı bulunur. Kontrolcü hangi cihazla konuşacaksa o cihazın CS pinini Low yapar, diğerlerini High seviyesinde tutar. Eğer mikrodenetleyicinizin pin sayısı yetersiz kalıyorsa, CS pinlerini çoğaltmak için harici bir ikili kod çözücü (binary decoder) entegresi kullanabilirsiniz.

Bağımsız CS SPI Çoklu Cihaz Bağlantısı

2. Papatya Zinciri Bağlantı (Daisy Chain): Bazı entegreler, birinin veri çıkışının (CIPO) diğerinin veri girişine (COPI) bağlandığı zincirleme bir yapıda bağlanmayı destekler. Bu mimaride tüm cihazlar tek bir ortak CS hattını paylaşır. Veriler gönderildikten sonra CS hattı High seviyesine çekildiğinde tüm cihazlar veriyi eş zamanlı uygular. Bu yöntem özellikle zincirleme shift register (örneğin 74HC595) projelerinde ve adreslenebilir LED sürücülerinde tercih edilir.

Daisy Chain Papatya Zinciri SPI Şeması

Papatya zinciri mimarisinde veriler bir cihazdan diğerine taşarak (overflow) ilerler. Bu nedenle, zincirin en sonundaki cihaza veri ulaştırabilmek için tüm zincir uzunluğu boyunca veri iletmeniz gerekir. Kontrolcünün gönderdiği ilk veri paketinin, en sondaki çevre birimine yerleşeceğini unutmamalısınız.

SPI Programlama ve Yazılımsal Entegrasyon

Modern mikrodenetleyicilerin birçoğunda, arka planda yüksek hızlarda veri transferi sağlayan donanımsal SPI birimleri (Hardware SPI) yer alır. SPI protokolünün yapısı o kadar basittir ki, donanımsal destek olmasa bile G/Ç (GPIO) pinlerini sırayla lojik-1 ve lojik-0 yaparak kendi yazılımsal SPI kodlarınızı (Bit-Banging) üretebilirsiniz. (Teknik bir yazılım örneği için Wikipedia SPI Bus sayfasını inceleyebilirsiniz).

Arduino platformunda bir SPI donanımıyla çalışmak için iki ana yaklaşım mevcuttur:

Yöntem 1: shiftIn() ve shiftOut() Yazılımsal Fonksiyonları: Tamamen yazılımsal tabanlı çalışan bu fonksiyonlar, mikrodenetleyicinin herhangi bir dijital pini üzerinde çalışabilir ancak çalışma hızları donanımsal çözüme kıyasla oldukça düşüktür.

Yöntem 2: Resmi SPI Kütüphanesi: Eşsiz donanımsal hızıyla bilinen bu kütüphane, mikrodenetleyici içerisindeki yerleşik SPI donanımını doğrudan kontrol eder. İnanılmaz derecede hızlıdır ancak yalnızca kart üzerindeki özel donanımsal SPI pinlerinde (UNO için 11, 12, 13) çalışır.

Haberleşmeyi başlatırken, kullandığınız çevre biriminin veri kitapçığında belirtilen çalışma modlarına ve bit sıralamasına dikkat etmelisiniz:

  • Bit Sıralaması (Bit Order): Verilerin en yüksek değerli bitten (MSB) veya en düşük değerli bitten (LSB) başlayarak gönderilmesini belirler. Arduino SPI kütüphanesinde bu ayar setBitOrder() veya SPISettings yapısı üzerinden yönetilir.
  • Veri Modu (Data Mode): Saat sinyalinin boşta (idle) duracağı lojik seviyeyi ve verinin saatin hangi kenarında okunacağını belirler. Arduino’da bu durum setDataMode() fonksiyonu ile kontrol edilir.
  • Saat Bölücü (Clock Divider): SPI çok yüksek frekanslarda (MHz seviyesinde) çalışabilir. Eski veya hassas sensörleri desteklemek adına setClockDivider() ile sistem saat frekansı bölünerek çalışma hızı düşürülebilir.

İki Arduino Arasında SPI Haberleşmesi

SPI protokolü, kısa mesafelerde (maksimum 1-5 metre) iki mikrodenetleyici kartı arasında yüksek hızlı ve güvenilir veri transferi sağlamak amacıyla mükemmel bir seçenektir.

Arduino UNO Donanımsal SPI Pinleri
Arduino SPI Pinleri
SPI HattıArduino UNO Pin Karşılığı
COPI (MOSI)Pin 11 veya ICSP-4
CIPO (MISO)Pin 12 veya ICSP-1
SCK (Clock)Pin 13 veya ICSP-3
CS (SS / Chip Select)Pin 10 (Varsayılan)
Arduino SPI Pin Yapılandırması

Bağlantı Şeması

Örnek uygulamamızda iki adet Arduino UNO kartını birbirine bağlayacağız. Kartlardan biri Kontrolcü (Master) rolünü üstlenirken, diğeri ise Çevre Birimi (Slave) olarak çalışacaktır. Sistemlerin ortak bir referansa sahip olması için GND (Toprak) hatlarının birbirine bağlanması zorunludur.

İki Arduino SPI Haberleşme Bağlantı Şeması

Kodlama ve SPI Kütüphane Fonksiyonları

Projelerinizde SPI.h kütüphanesini dahil ettiğinizde kullanabileceğiniz temel fonksiyonların açıklamaları şu şekildedir:

  • SPI.begin(): Donanımsal SCK, MOSI ve SS pinlerini otomatik çıkışa ayarlayarak SPI veri yolunu başlatır.
  • SPI.transfer(val): Tam çift yönlü haberleşme prensibiyle çalışır. Gönderilecek byte değerini hatta yazar ve eş zamanlı olarak karşı taraftan gelen byte değerini geri döndürür.
  • SPI.attachInterrupt(handler): Çevre birimi rolündeki Arduino’ya bir veri geldiğinde otomatik tetiklenecek olan kesme (interrupt) fonksiyonunu tanımlar.

SPI standartlarında dört farklı çalışma modu bulunur ve bunlar saat sinyalinin fazı (CPHA) ile kutupsallığına (CPOL) göre şu şekilde ayrılır:

  • Mode 0 (Varsayılan): Saat boşta Low (0) seviyesindedir. Veriler yükselen kenarda örneklenir.
  • Mode 1: Saat boşta Low (0) seviyesindedir. Veriler düşen kenarda örneklenir.
  • Mode 2: Saat boşta High (1) seviyesindedir. Veriler düşen kenarda örneklenir.
  • Mode 3: Saat boşta High (1) seviyesindedir. Veriler yükselen kenarda örneklenir.

1. Kontrolcü (Master) Kodları

2. Çevre Birimi (Slave) Kodları

Kararlı SPI Tasarımı İçin İpuçları

Yüksek frekanslı kare dalga sinyalleri nedeniyle, SPI hatları elektromanyetik gürültüden kolayca etkilenebilir. Bu nedenle kablo boyunu olabildiğince kısa tutmaya çalışın. Eğer uzun mesafeli veri aktarımı zorunluysa, saat hızını düşürmeli ve hat üzerindeki gürültüyü sönümlemek için özel diferansiyel alıcı-verici entegrelerinden yararlanmalısınız.

Haberleşmede bir sorun yaşanması durumunda, sinyal hatlarını fiziksel olarak dinlemek için bir Mantık Analizörü (Logic Analyzer) kullanmak en profesyonel çözümdür. Bu cihazlar saat ve veri hatlarındaki lojik seviyeleri okuyarak verilerin kodunu otomatik olarak çözebilir.

SPI Nedir? Avantajları ve Dezavantajları

Avantajları

  • Asenkron seri haberleşme (UART) ve I2C standartlarına kıyasla çok daha yüksek veri hızlarına (MHz seviyelerine) ulaşabilir.
  • Veri alma donanımı son derece basittir (Shift Register tabanlı).
  • Tek bir hat üzerinden çoklu çevre birimi kontrolünü destekler.

Dezavantajları

  • Haberleşme için minimum 4 adet fiziksel sinyal hattı gerektirir.
  • Veri uzunluğu ve protokol önceden çok sıkı tanımlanmış olmalıdır (Asenkron seri gibi rastgele veri iletimi zordur).
  • Hattaki tüm kontrol sadece Kontrolcü cihazdadır; bağlı birimler doğrudan birbiriyle veya kontrolcü izni olmadan konuşamaz.
  • Paralel bağlantı mimarisinde eklenen her yeni cihaz için fazladan bir CS pini ayrılması gerekir, bu da pin tüketimini artırır.

Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.