3.21. SPI temelleri

SPI (Serial Peripheral Interface), aynı kart üzerindeki bir denetleyici ile bir veya daha fazla çevre birimi arasında kısa mesafeli, yüksek hızlı bağlantılar için tasarlanmış senkron bir seri veri yoludur. SD kartlar, ekranlar, flash bellek, ADC’ler ve DAC’ler ile çok çeşitli sensörler için standart arabirimdir.

UART’ın paylaşılan bir saati olmayıp zamanlamayı veri hattının kendisinden geri kazanmasına karşın, SPI veri tellerinin yanında bir saat teli çalıştırır. Denetleyici saati istediği hızda sürer ve veri yolundaki diğer her cihaz veriyi bu saatle senkronize olarak örnekler. Baud hızı tahmini ve çerçeveleme yükü yoktur – yalnızca saat kenarları ve bitler vardır.

3.21.1. Dört tel

Tam çift yönlü (full-duplex) bir SPI veri yolunun dört teli vardır:

  • SCK (seri saat). Denetleyici tarafından sürülür. Her bit bu sinyalin bir kenarında içeri veya dışarı saatlenir.

  • MOSI (denetleyici çıkışı, çevre birimi girişi). Denetleyicinin çıkış hattıdır; çevre birimi bitleri bu hattan örnekler.

  • MISO (denetleyici girişi, çevre birimi çıkışı). Çevre biriminin çıkış hattıdır; denetleyici bitleri bu hattan örnekler.

  • CS (çip seçme), bazen SS (çevre birimi seçme) olarak da adlandırılır. Her çevre birimi için ayrı bir hat bulunur. Denetleyici bir işlemi başlatmak için CS’yi düşük seviyeye, sonlandırmak için ise tekrar yüksek seviyeye çeker; CS’si pasif (deasserted) olan herhangi bir çevre birimi veri yolunu tamamen yok sayar ve MISO çıkışını sürmeyi bırakır.

Üst üste dizilmiş dört sinyal izi: en üstte CS, onun altında SCK, ardından MOSI ve MISO. CS yüksek başlar (boşta), işlemi başlatmak için düşük seviyeye düşer, ardından SCK sekiz darbe çıkarırken MOSI ve MISO her biri bir bayt veri taşır, sonra CS tekrar yüksek seviyeye döner.

Bir SPI baytı: CS çevre birimini seçmek için düşük seviyeye iner, SCK sekiz biti saatler ve MOSI ile MISO zıt yönlerde her biri bir bayt aktarır.

Her saat kenarı, aynı anda her yönde bir bit hareket ettirir. Tek bir SCK darbesi eşzamanlı olarak MOSI üzerinde bir bit gönderir ve MISO üzerinde bir bit alır – SPI, tel düzeyinde full-duplex‘tir. Yazılımın her iki yönü de kullanması gerekmez: yalnızca yazma ve yalnızca okuma işlemleri yaygındır; kullanılmayan hat ya yok sayılır ya da yüksek seviyede tutulur.

3.21.2. Saat polaritesi ve fazı

İki yapılandırma biti, verinin tam olarak hangi saat kenarında hareket edeceğine karar verir:

  • Saat polaritesi (polarity, bazen CPOL) – SCK’nın boşta durumu. 0 saatin düşük seviyede boşta kalıp yüksek seviyeye darbe yaptığı anlamına gelir; 1 saatin yüksek seviyede boşta kalıp düşük seviyeye darbe yaptığı anlamına gelir.

  • Saat fazı (phase, bazen CPHA) – verinin hangi kenarda örnekleneceği. 0 her saat darbesinin ilk kenarında (öncü kenar) örnekler; 1 ikinci kenarda (ardıl kenar) örnekler.

Bunlar birlikte, geleneksel olarak Mod 0’dan Mod 3’e kadar adlandırılan dört mod oluşturur. Mod 0 (polarity=0, phase=0) en yaygın olanıdır ve bilinmeyen cihazlar için güvenli bir varsayılandır.

Önemli kural, her iki ucun da mod üzerinde anlaşmasıdır. Uyumsuz modlar, saat ve veri hatları doğru bağlanmış olsa bile bozuk veri verir; bir cihaz ilk işlemde anlamsız veri döndürürse, kontrol edilecek ilk şey moddur.

3.21.3. Birden çok çevre birimi

Her birinin denetleyici tarafından sürülen kendi CS hattı olduğu sürece, birden çok çevre birimi aynı SCK, MOSI ve MISO hatlarını paylaşabilir:

  • Tüm çevre birimleri aynı saati ve veriyi görür, ancak her biri kendi CS’sini izler. CS pasifken (yüksek), bir çevre birimi SCK ve MOSI’yi tamamen yok sayar ve hat için diğer cihazlarla çatışmaması için MISO’yu yüksek empedanslı bir durumda bırakır.

  • Denetleyici aynı anda tam olarak bir CS’yi etkinleştirir, işlemi yürütür ve veri yolunu serbest bırakmak için CS’yi pasifleştirir.

Tek bir donanımsal SPI bloğuna sahip bir mikrodenetleyici, CS hatları için ayırabileceği boş GPIO pini sayısı kadar çevre birimiyle iletişim kurabilir – veri yolunun kendisinde adresleme yoktur.

3.21.4. Güçlü ve zayıf yönler

SPI’nin güçlü ve zayıf yönlerinin her ikisi de tasarımından kaynaklanır:

  • Hızlı. Basit seviye dönüşümüyle kısa izlerde onlarca megahertz elde edilebilir. SD kart okuyucuları ve SPI ekranları bunu kullanır.

  • Tel düzeyinde basit. Adresleme, onay (acknowledgement), özel başlatma/durdurma koşulu yok – yalnızca bir saate senkronize tellerdeki bitler.

  • Pin tüketen. Üç paylaşılan hat artı her çevre birimi için bir CS. Beş SPI cihazı olan bir kart sekiz pin kullanır (üç + beş).

  • Kısa mesafeli. SPI temiz, hızlı kenarlar varsayar; bu da aynı kart üzerinde kısa izler anlamına gelir. Daha uzun bağlantılar için I2C veya çerçeveli veri yollarından biri daha uygundur.