Fiziksel bağlantıları (kabloları) hallettiysek, şimdi bu kabloların üzerinden verinin nasıl aktığına bakalım.
SPI bir "iletişim" protokolünden ziyade, bir "Veri Takası" (Data Exchange) protokolüdür. Master ve Slave, aynı anda kartlarını masaya koyan iki oyuncu gibidir.
SPI'ın kalbinde Shift Register (Kaydırmalı Kaydedici) bulunur. Master ve Slave, sanal olarak tek bir dairesel döngü oluşturur.
- Döngü: Master 1 bit gönderirken (MOSI üzerinden), Slave de aynı anda Master'a 1 bit gönderir (MISO üzerinden).
- Saat Darbesi: Her SCK darbesinde veriler bir adım kayar.
- Sonuç: 8 saat darbesi (Clock Pulse) sonunda, Master'daki veri Slave'e, Slave'deki veri Master'a geçmiş olur.
⚠️ Saha Notu (Kritik): SPI'da "Sadece Okuma" diye bir şey yoktur! Slave'den veri okumak istiyorsanız, ona bir şey göndermek zorundasınız (genellikle0x00veya0xFFgibi boş bir "Dummy Byte"). Çünkü saati üreten Master'dır; Master veri göndermezse (saat üretmezse), Slave cevap veremez.
graph LR
subgraph MASTER
MR[Shift Register]
end
subgraph SLAVE
SR[Shift Register]
end
MR -- MOSI (Bit Gönder) --> SR
SR -- MISO (Bit Gönder) --> MR
style MASTER fill:#e3f2fd,stroke:#1565c0
style SLAVE fill:#fff3e0,stroke:#e65100
I2C'de standart tektir. SPI'da ise 4 farklı varyasyon (Mod) vardır. Master ve Slave aynı modda konuşmazsa, veriler bozuk (çöp) gelir.
Bu modları iki parametre belirler:
- CPOL = 0: Saat sinyali boştayken (Idle) LOW (0V) seviyesindedir. Darbe için High olur.
- CPOL = 1: Saat sinyali boştayken HIGH (3.3V) seviyesindedir. Darbe için Low olur.
- CPHA = 0: Veri, saatin ilk kenarında (Leading Edge) okunur/örneklenir.
- CPHA = 1: Veri, saatin ikinci kenarında (Trailing Edge) okunur/örneklenir.
| SPI Modu | CPOL | CPHA | Açıklama |
|---|---|---|---|
| Mod 0 | 0 | 0 | En Yaygın. Saat Low'da bekler, yükselirken (ilk kenar) okur. |
| Mod 1 | 0 | 1 | Saat Low'da bekler, düşerken (ikinci kenar) okur. |
| Mod 2 | 1 | 0 | Saat High'da bekler, düşerken (ilk kenar) okur. |
| Mod 3 | 1 | 1 | İkinci En Yaygın. Saat High'da bekler, yükselirken (ikinci kenar) okur. |
Nasıl Anlarım? Sensörün datasheet'inde "Timing Diagram" bölümüne bakın. Eğer saat çizgisi yukarıda başlıyorsa CPOL=1, aşağıda başlıyorsa CPOL=0'dır.
Master cihazda pin kalmadıysa ne yapacağız? Standart bağlantıda her Slave için ayrı bir CS pini gerekiyordu. Daisy Chain ile tek bir CS pini kullanarak onlarca cihazı sürebiliriz.
Bağlantı Mantığı:
- Master MOSI -> Slave 1 MOSI
- Slave 1 MISO -> Slave 2 MOSI
- Slave 2 MISO -> Master MISO
- Tüm SCK ve CS pinleri paralel bağlanır.
Veri Aktarımı (Vagon Mantığı): Elinizde 3 adet 8-bitlik LED sürücü olduğunu düşünün. Toplamda 24 bitlik dev bir Shift Register oluşur.
- Master'ın gönderdiği ilk byte, zincirin en sonundaki cihaza gider.
- Tıpkı bir su borusu gibi; ilk giren su, borunun en ucundan çıkar.
graph LR
subgraph M [Master]
M_MOSI[MOSI]
M_MISO[MISO]
end
subgraph S1 [Slave 1]
S1_IN[DIN]
S1_OUT[DOUT]
end
subgraph S2 [Slave 2]
S2_IN[DIN]
S2_OUT[DOUT]
end
M_MOSI --> S1_IN
S1_OUT --> S2_IN
S2_OUT --> M_MISO
style M fill:#e3f2fd
style S1 fill:#fff9c4
style S2 fill:#fff9c4
Dezavantajı: Bir cihaz bozulursa zincir kopar. Ayrıca protokolü yazılımsal olarak yönetmek daha karmaşıktır. Her cihaz Daisy Chain desteklemez!
SPI'ın I2C'den en büyük farkı "Geri Bildirim" (Acknowledgement) mekanizmasının olmamasıdır.
- I2C: Master bir byte gönderir, Slave "Aldım" (ACK) der. Master, Slave'in orada olduğunu bilir.
- SPI: Master veriyi gönderir ama Slave'in o veriyi alıp almadığını, hatta Slave'in orada olup olmadığını bilemez.
- Sonuç: SPI "Kör" (Blind) bir iletişimdir. Slave bozuksa veya kablo koptuysa, Master okuma yaptığında sürekli
0x00veya0xFFokur ama hata kodu almaz.
- Dummy Byte: Slave'den veri almak için ona mutlaka boş veri (
0x00) göndermelisiniz. - Mod Uyumu: Master ve Slave'in CPOL/CPHA ayarları birebir aynı olmalıdır. (Datasheet'i okuyun!).
- Hata Kontrolü: Donanımsal ACK olmadığı için, yazılımsal olarak veri bütünlüğünü (CRC veya özel başlangıç byte'ları ile) kontrol etmek iyi bir uygulamadır.