I2C(Inter-Integrated Circuit), 1980’li yılların başında, Philips Semiconductor tarafından ortaya çıkarılan bir seri iletişim protokolüdür. İşlemci ve mikrodenetleyicilere aynı veri yolu üzerinden birden çok çevrebirimle haberleşme sağlamaktadır. Çevre birim olarak EEPROM, ADC, LCD sürücü ve zamanlayıcı aygıtları gibi örnekleri vardır. Haberleşmeyi master cihazı kontrol eder ve her haberleşmede bir tane master cihazı vardır. Haberleşmenin sağlanması için hatta en az bir adet slave cihaz vardır. Hatta birden fazla da slave yer alabilir fakat hangisinin veri aktaracağına master cihaz karar verir.
I2C sadece kartlarla birlikte kullanılmaz, aynı zamanda kablolar aracılığı ile panolara bağlı olan diğer harici bileşenlerle de kullanılır. Yapı olarak iki tellidir. Haberleşme için toprak hattı dışında SDA(Serial Data) ve SCL(Serial Clock) olmak üzere iki hatta ihtiyaç vardır. SDA veri iletişimi için, SCL ile ise gönderen ve alan taraflar için veri senkronizasyonunu sağlar. Ayrıca hat sayısının fazla olmasından dolayı uzun mesafeli haberleşmelerde tercih edilmez. Genelde kısa mesafeli ve düşük veri aktarım hızının yeterli olduğu yerlerde yer alır. Aşağıda I2C haberleşme protokolüne bir örnek vardır.
Master ve çevre birimler anlatıldığı şekilde yukarıda yerini almış. Ama arada bulunan dirençler ne işe yarıyor? Dediğinizi duyar gibiyim. I2C veri yolu üzerindeki birimler open drain veya open collector özelliği göstermektedir. Bu birimler tarafından SDA ve SCL üzerindeki elektriksel seviye aşağıya yani lojik 0 seviyesine çekilebilir fakat lojik 1 yapılamaz. Bu nedenden dolayı SDA ve SCL hatları birer pull-up direnciyle lojik 1 seviyesine çekilmektedir. Pull-up direnci olarak da genelde 1K veya 10K aralığında dirençler kullanılmaktadır.
I2C Protokolünün Temel Özellikleri
- SCL ve SDA olmak üzere 2 kablolu iletişim kanallarına sahiptir. Ayrıca referans olarak bir toprak(Ground) hattına ihtiyaç duyar.
- SDA ve SCL olmak üzere bir adet veri ve bir adet clock kanalı vardır.
- CPU ve mikrodenetleyici gibi, iletişimi başlatan birim masterdır. Saat frekansını üretmekten sorumludur. Ayrıca iletişimi sonlandıran yine master olur.
- Slave çevre birimleri genelde 7 bitlik adreslere sahiptir ve bu birimlere bu adresler üzerinden erişim sağlanır. Aynı veri yolu üzerine 112 tane aygıt bağlanır.
- Master ve slave arasındaki iletişim çift yönlüdür yani buna bidirectional denir. Fakat iletişimin yönünü master belirler.
- İletişim yolu üzerinde birden fazla master yer alabilir.
- İletişim hızını SCL üzerinden master dikte etmektedir. Ama slave bu hızda veri gönderemediği veya işleyemediği durumda SCL’nin elektrik seviyesini değiştirerek yani lojik 0 durumuna getirerek belirli bir süre bloklayabilir. Bu işleme clock stretching denir.
- Aynı kart üzerinde iletişim sağladığı gibi kartlar arasında da iletişim mümkündür. Maksimum kanal uzunluğu yaklaşık 4 m’dir.
I2C İletişim Aşamaları
Hattın boşta olması durumu (Idle): Herhangi bir veri transferinin olmadığı durumdur. Bu aşamada SCL ve SDA hatları lojik 1 seviyesindedir.
Başlangıç aşaması: SCL lojik 1 iken, SDA’nın lojik 1’den 0’a çekilmesi durumunda oluşur. Bu işlemi master gerçekleştirir.
Adresleme aşaması: Master tarafından iletişim sağlanacak slave aygıt adresi ve iletişim modu bu aşamada gönderilmektedir. İletişim modunda okuma veya yazma işlemi mi yapacağı master tarafından seçilmektedir.
Veri iletim aşaması: Bit düzeyinde veri iletişimi olur. Veri transferi sırasında SDA hattındaki verinin SCL lojik 0 iken değişmesi ve 1 iken değişmemesi gerekmektedir. SCL lojik 0’dan 1’e geçerken yani yükselen kenar durumundayken veri örneklenmektedir.
Sonlandırma aşaması: SCL lojik 1 iken, SDA’nın lojik 0’dan 1’e çekilmesiyle olmaktadır. Başlangıç aşamasındaki gibi sadece SDA durumunun tersine bir durum söz konusudur. Yine bu işlem de master tarafından olur.
Başlangıç aşamasının tekrarlanması(Repeated start): İlk olarak iletişim kuruldu diyelim. Sonrasında bir iletişim istenirse diğer iletişimi sonlandırmadan yeni bir başlangıç durumu olur. Bu durumda yeni bir slave adreslenmektedir. Bu sayede hattın iletişimi kopmadan yeni başlangıç durumunun eklenmesiyle okuma ve yazma işlemleri yapılmaktadır.
I2C üzerindeki iletişim 8 bitlik paketler şeklindedir. Sonrasında alıcı taraf 9.bit olarak bir onat biti (ACK/NACK) göndermektedir. Lojik 0 ACK, lojik 1 ise NACK anlamına gelir. Veriyi gönderen master alıcı slave ise, slave tarafından gönderilen ACK verinin doğru bir şekilde alındığını, NACK ise bir problem olduğunu gösterir. Veriyi gönderen taraf slave ise, master yeni bir veri paketi istiyorsa ACK, istemiyorsa NACK gönderir ve sonrasında iletişim son bulur. Master ve slave arasında 1 byte’lık alışveriş sırasında, SDA üzerinden gidip gelen veri aşağıda şekildeki gibidir.
Kaynakça:
- gelecegiyazanlar.turkcell.com.tr
- demirten.gitbooks.io
- ozdenercin.com
- derstagram.com
- electronicwings.com

