Web sitemize hoşgeldiniz, 03 Nisan 2025
muratdonmez.com.tr
Anasayfa » IOT » I2C Protokolü Nedir, Nasıl Çalışır?

I2C Protokolü Nedir, Nasıl Çalışır?

I2C Protokolü Nedir, Nasıl Çalışır?

Arduino ve benzeri kartlar, diğer Arduino veya sensörlerle haberleşmek için bazı haberleşme protokolleri kullanır. Seri haberleşme türü olan ve senkron haberleşmeye izin veren I2C bu haberleşme protokollerinden birisidir. Philips (NXP) Semiconductors tarafından geliştirilmiştir. Haberleşme için SDA ve SCL olmak üzere 2 hatta ihtiyacı vardır. Besleme hattı farklı olabilir ancak toprak hattı aynı olmalıdır. Hat sayısı fazla olduğu için uzun mesafeli haberleşmelerde tercih edilmemektedir. Kullanımı kısa mesafeli ve düşük veri aktarımının yeterli olduğu durumlar için daha uygundur.

I2C haberleşmesi için 1 adet Master (Ana) cihaz ve en az 1 adet Slave (Köle) cihaza ihtiyaç vardır. Master (Ana) cihaz tüm haberleşmeyi kontrol eder ve hangi Slave (Köle) cihazın veri aktaracağına karar verir.

I2C

Haberleşme için SDA (Serial Data Line) ve SCL (Serial Clock) hatları kullanılır. SDA hattı ile çift yönlü veri aktarımı yapılırken, SCL ile Master (Ana) cihazın ürettiği saat sinyali kullanılarak verilerin senkronizasyonu gerçekleştirilir. Ayrıca SDA hattındaki haberleşme bu sinyale göre yapılır.

Haberleşmenin tüm hat boyunca sorunsuz yapılabilmesi için SDA ve SCL hatları 2,2kΩ-10kΩ arasında pull up dirençler ile VCC hattına bağlanmalıdır. SDA ve SCL hatları kullandığınız karta göre değişiklik göstermektedir, ESP8266 için ESP8266 üzerindeki hangi GPIO pinleri kullanılabilir? yazımı, Arduino için de aşağıdaki tabloyu referans alabilirsiniz.

Arduino türü SDA pini SCL pini
Arduino Uno A4 A5
Arduino Mega 20 21
Arduino Leonardo 2 3
Arduino Due 20 21
Arduino Nano A4 A5

I2C protokolünün temel özellikleri;

  • SDA (Veri Hattı): I2C üzerinde veri iletimi için kullanılan hattır.
  • SCL (Saat Hattı): I2C üzerinde verilerin senkronize edilmesini sağlayan saat sinyalini taşır. Bu saat sinyali Master (Ana) cihaz tarafından üretilir.
  • Master-Slave İlişkisi: I2C haberleşme protokolü, bir Master (Ana) cihazın bir veya birden fazla Slave (Köle) cihazı kontrol etmesi mantığına dayanır. Master (Ana) cihaz, haberleşmeyi başlatır, yönetir ve sonlandırır.
  • Start ve Stop Durumları: I2C iletişimi, “Start” durumu ile başlar ve “Stop” durumu ile biter.
  • 7-Bitlik ve 10-Bitlik Adresleme: Her I2C cihazına 7-bit veya 10-bit adresleme ile benzersiz bir adres atanır.
  • Veri İletimi: Veri, başlatma durumundan sonra önce adres, ardından veri byte’lerıyla gönderilir. Her byte, Slave (Köle) tarafından bir onaylama (ACK) sinyali ile teyit edilir.

I2C haberleşme protokolünün çalışma şeklinden ve bağlantı hatlarından bahsettiğime göre, Arduino’nun veya ESP8266’nın I2C protokolü kullanarak haberleşebilmesi için kullanmamız gereken fonksiyonlardan ve ne işe yaradıklarından bahsedeyim. Öncelikle bu fonksiyonları kullanabilmek için projemize “Wire.h” kütüphanesini eklememiz gerekiyor.

Wire.h kütüphanesindeki fonksiyonlar:

  • wire.begin(): I2C haberleşmesini başlatmak için bu fonksiyonu kullanacağız. Bu fonksiyonu Master (Ana) cihazda kullanıyorsak parametre atamadan kullanabiliriz. Slave (Köle) cihazda kullanıyorsak, parametre olarak Slave (Köle) cihazın adresini yazmalıyız. Örneğin ‘1’ adresine sahip Slave (Köle) Arduino tanımlamak istiyorsak, wire.begin(1); yazmalıyız. Eğer bu Arduino Master (Ana) cihaz olacaksa fonksiyonu, wire.begin(); olarak çağıracağız.
  • wire.available(): Bu fonksiyon I2C hattı üzerinden Arduino’ya ulaşan veri paketlerinin sayısını döndürür. Eğer fonksiyonun değeri 0(sıfır)’dan büyükse Arduino’ya gelen yeni veri paketi var demektir.
  • wire.beginTransmission(SlaveAdresi): Master (Ana) cihazın I2C hattı üzerindeki Slave (Köle) cihazlardan hangisiyle haberleşmek istediğini belirler. Fonksiyonu kullanırken, parametre olarak haberleşeceği Slave (Köle) cihazın adresini vereceğiz.
  • wire.endTransmission(): Hat üzerindeki veri aktarımının sonlandığını belirtmek için bu fonksiyonu kullanacağız.
  • wire.read(): Veri hattından gelen veriyi okumak için bu fonksiyonu kullanacağız.
  • wire.write(): Fonksiyona yazılan parametreyi veri hattına aktarır. Kısaca Slave (Köle) cihazımıza veri yollamak için kullanacağız.
  • wire.onReceive(GorevFonksiyonu): Slave (Köle) olarak tanımladığımız cihaza veri geldiğinde, bu cihazın yapacağı işlemi belirlemek için kullanacağımız fonksiyondur. Fonksiyonumuza parametre olarak veri geldiğinde, hangi fonksiyon çağırılacaksa o fonksiyonun ismi gelir.
  • wire.requestFrom(): Master (Ana) cihazda kullanacağımız bu fonksiyon ile Slave (Köle) cihazımızdan veri isteyeceğiz. Fonksiyonun ilk parametresini Slave (Köle) cihazın adresini belirlemek için, ikinci parametresini Slave (Köle) cihazdan kaç byte’lık veri beklediğimizi belirtmek için, üçüncü parametresi de hattın istekten sonraki durumunu belirlemek için kullanacağız.
  • wire.onRequest(): Slave (Köle) olarak tanımladığımız cihaza veri geldiğinde, bu cihazın yapacağı işlemi belirlemek için kullanacağımız fonksiyondur. Fonksiyonumuza parametre olarak veri geldiğinde, hangi fonksiyon çağırılacaksa o fonksiyonun ismi gelir.

I2C protokolünün çalışma ve bağlantı şeklini, projelerimizde kullanacağımız kütüphane ve fonksiyonları anlattığım bu yazım umarım kafanızdaki soru işaretlerini kaldırmaya yardımcı olmuştur. I2C haberleşmesi ile ilgili örnek için I2C ile Arduino’lar Arası Veri Aktarımı yazıma bakabilirsiniz.

Etiketler:

BU KONUYU SOSYAL MEDYA HESAPLARINDA PAYLAŞ
Yorumlar

Henüz yorum yapılmamış.

Yorum Yaz