I2C protokolü nasıl çalışır? Adresleme, ACK/NACK ve clock stretching nedir?
Cevap
I2C, iki hatlı (SDA veri, SCL saat), senkron, multi-master/multi-slave bir bus'tır. Hatlar open-drain'dir ve pull-up direnci gerektirir. Hızlar: 100 kHz (standard), 400 kHz (fast), 1 MHz (fast-mode plus).
İşlem sırası
- START: SCL HIGH iken SDA HIGH'tan LOW'a düşer.
- Adres byte'ı: 7 bit slave adresi + 1 bit R/W (0 yazma, 1 okuma).
- ACK: Adresi tanıyan slave 9. saat darbesinde SDA'yı LOW çeker.
- Veri byte'ları: Her byte MSB önce, ardından ACK/NACK.
- STOP: SCL HIGH iken SDA LOW'dan HIGH'a çıkar.
S | 1010000 0 | A | 0x10 (register) | A | Sr | 1010000 1 | A | DATA | N | P
adres+W repeated start, adres+R NACK STOPRegister okumada repeated start (Sr) kullanılır; böylece bus bırakılmadan yön değişir.
ACK ve NACK
- Slave adres veya veri sonrası ACK vermezse (NACK): cihaz yok, meşgul (EEPROM yazma döngüsü) veya komut hatalı.
- Master okumada son byte'tan sonra NACK gönderir; slave'e veri göndermeyi bırakmasını söyler.
Clock stretching
Slave veriyi hazırlayamıyorsa SCL'yi LOW tutarak master'ı bekletir. Master SCL'yi bıraktıktan sonra hattın gerçekten HIGH olduğunu kontrol etmelidir. Bazı master'lar (ör. eski Raspberry Pi donanımı) bunu düzgün desteklemez.
10 bit adres ve arbitration
10 bitlik adresler 11110xx önekiyle iki byte'ta gönderilir. Birden fazla master aynı anda yazarsa, HIGH göndermek isteyip hattı LOW gören master kaybeder ve çekilir (wired-AND).
Pratik sorunlar
- Pull-up değeri: Bus kapasitansına göre seçilir (tipik 4.7 kΩ @100 kHz, 2.2 kΩ @400 kHz). Çok büyük direnç yavaş yükselen kenar üretir.
- Bus takılması: Slave transfer ortasında reset olursa SDA'yı LOW tutabilir. Çözüm: SCL'yi GPIO olarak 9 kez toggle edip STOP üretmek.
- Adres çakışması: Aynı sensörden iki tane varsa adres pinleri veya I2C multiplexer (TCA9548A) kullanılır.
İlgili Haberleşme Protokolleri soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.