Skip to content

Latest commit

 

History

History
147 lines (99 loc) · 5.67 KB

File metadata and controls

147 lines (99 loc) · 5.67 KB

📝 Bölüm 2: Protokol Detayları ve Modlar

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.


2.1 Shift Register Mantığı (Veri Takası) 🔄

SPI'ın kalbinde Shift Register (Kaydırmalı Kaydedici) bulunur. Master ve Slave, sanal olarak tek bir dairesel döngü oluşturur.

  1. Döngü: Master 1 bit gönderirken (MOSI üzerinden), Slave de aynı anda Master'a 1 bit gönderir (MISO üzerinden).
  2. Saat Darbesi: Her SCK darbesinde veriler bir adım kayar.
  3. 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 (genellikle 0x00 veya 0xFF gibi 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
Loading

2.2 SPI Modları: CPOL ve CPHA Kabusu 😱

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:

1. CPOL (Clock Polarity) - Saatin Boşta Durumu

  • 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.

2. CPHA (Clock Phase) - Örnekleme Zamanı

  • CPHA = 0: Veri, saatin ilk kenarında (Leading Edge) okunur/örneklenir.
  • CPHA = 1: Veri, saatin ikinci kenarında (Trailing Edge) okunur/örneklenir.

4 SPI Modu Tablosu

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.

SPI Modları Zamanlama Diyagramı


2.3 Daisy Chain (Papatya Zinciri) 🔗

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
Loading

Dezavantajı: Bir cihaz bozulursa zincir kopar. Ayrıca protokolü yazılımsal olarak yönetmek daha karmaşıktır. Her cihaz Daisy Chain desteklemez!


2.4 Protokol Yükü (Overhead) ve Kör İletişim

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 0x00 veya 0xFF okur ama hata kodu almaz.

✅ Özet

  1. Dummy Byte: Slave'den veri almak için ona mutlaka boş veri (0x00) göndermelisiniz.
  2. Mod Uyumu: Master ve Slave'in CPOL/CPHA ayarları birebir aynı olmalıdır. (Datasheet'i okuyun!).
  3. 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.


Bölüm 1: Fiziksel Katman Menüye Dön Bölüm 3: ESP32 Entegrasyonu