3.23. I2C temelleri

I2C (Inter-Integrated Circuit, “I-kare-C” ya da “I-iki-C” olarak okunur), aynı kart üzerindeki çipler arasında kısa mesafeli bağlantılar için tasarlanmış iki telli bir seri veriyoludur. Önceliklerde SPI ile UART arasında yer alır: SPI’den daha yavaş ama pin açısından daha tutumlu ve adreslenebilir (aynı iki telde birden fazla cihaz), oysa SPI cihaz başına ayrı bir CS hattı gerektirir.

I2C, ham iş hacminden çok pin ve veriyolu karmaşıklığını azaltmanın önemli olduğu düşük hızlı sensörler – ivmeölçerler, sıcaklık sensörleri, nem sensörleri, manyetometreler, gerçek zamanlı saatler, EEPROM’lar – için tercih edilen veriyoludur.

3.23.1. İki tel, ikisi de açık-drenajlı

Bir I2C veriyolunda yalnızca iki sinyal vardır:

  • SCL (seri saat). Denetleyici tarafından sürülür (çoğu zaman).

  • SDA (seri veri). O an konuşmakta olan cihaz tarafından sürülür – adres ve giden veri sırasında denetleyici, okumalar ve ACK bitleri sırasında çevre birimi.

Her iki hat da açık-drenajlıdır: veriyolundaki her cihaz hattı toprağa çekebilir ama hiçbiri onu yükseğe sürmez. Veriyolundaki iki pull-up direnci (tipik olarak besleme rayına 2.2 ile 10 arası), kimse düşüğe çekmediğinde hatları yükseğe çeker. Kablolu-VEYA (wired-OR) davranışı bundan kaynaklanır – hattı düşüğe çeken herhangi bir cihaz kazanır ve yüksek durum yalnızca “kimse konuşmuyor” demektir.

MCU’nun SCL ve SDA pinlerindeki dahili pull-up dirençleri genellikle tek başlarına veriyolu pull-up’ı olarak iş görecek kadar güçlü değildir; normalde veriyolunda harici dirençler gerekir. Birçok sensör breakout kartı bunları zaten içerir; daha fazlasını eklemeden önce veri sayfasını kontrol edin.

3.23.2. İşlem

Her I2C işlemi aynı biçimi izler:

SCL ve SDA hatları. SCL yüksekken SDA düşer (START), ardından SCL, SDA üzerindeki baytları saatler -- okuma/yazma biti ve bir ACK içeren 7 bitlik bir adres baytı, ardından bir yazmaç baytı ve bir ACK, ardından bir veri baytı ve bir NACK, ardından SCL yüksekken SDA yükselir (STOP).

Bir I2C işlemi: START, 7 bitlik adres + R/W, ACK, yazmaç, ACK, veri, NACK, STOP.

Alışveriş bit bit açılır:

  • START. Denetleyici, SCL hâlâ yüksekken SDA’yı düşüğe çeker. Bu olağandışı kenar, veriyolundaki her cihaza bir işlemin başlamak üzere olduğunu bildirir.

  • Adres + R/W. Denetleyici, 7 bitlik bir çevre birimi adresini ardından bir okuma/yazma bitini (yazma için 0, okuma için 1) saatler.

  • ACK / NACK. Her baytın ardından alıcı, ACK (düşük) veya NACK (yüksek) için bir saat boyunca SDA’yı sürer. Adres baytında çevre birimi kendi adresini tanırsa ack verir; hiçbir cihaz ack vermezse denetleyici bir NACK görür ve adresin veriyolunda olmadığını anlar.

  • Veri baytları. Her biri, alıcıdan gelen bir ACK ile takip edilir. Yazmada çevre birimi her bayta ack verir; okumada denetleyici, daha fazlasını istediği her bayta ack verir ve çevre birimine durmasını söylemek için son bayta NACK verir.

  • STOP. Denetleyici, SCL yüksekken SDA’yı yükseğe bırakır ve işlemi sonlandırır.

Bir tekrarlanan başlangıç (repeated start), aralarında bir STOP olmadan verilen ikinci bir START’tır – denetleyici, veriyolunu bırakmadan aynı çevre biriminde yön değiştirir (adres yaz, sonra adres oku).

3.23.3. Adresleme

7 bitlik adres alanı 0x080x77 aralığını kapsar; uçlardaki değerler özel amaçlar için ayrılmıştır. Her cihazın adresi çip tasarımcısı tarafından belirlenir; birçok parça, alttaki bitlerden birkaçının kart düzeyinde değiştirilmesine izin verir (bir pini yükseğe ya da düşüğe bağlayarak), böylece aynı sensörden iki tanesi aynı veriyolunda bulunabilir.

İki cihaz bir adresi paylaşırsa, diğeri karışmadan birine konuşmanın hiçbir yolu yoktur, bu nedenle parçaları eşleştirmeden önce veri sayfasını kontrol edin. i2c.scan() (Kodda I2C belgesinde ele alınmıştır) adres alanını dolaşır ve hangi adreslerin yanıt verdiğini bildirir; bu da veriyolunda ne olduğunu öğrenmenin standart yoludur.

3.23.4. Güçlü ve zayıf yönler

Veriyolunun güçlü ve zayıf yönleri onun yerini belirler:

  • Birçok cihaz için iki pin. Tek bir SCL/SDA çifti bir düzine sensör taşıyabilir. SPI, cihaz başına fazladan bir CS pini gerektirir.

  • Standart hızlar. 100 kHz (“standart mod”) ve 400 kHz (“hızlı mod”) neredeyse her sensörü kapsar. 1 MHz ulaşılabilir ama veriyolu kapasitansından ve pull-up boyutlandırmasından daha fazlasını istemeye başlar.

  • SPI’ye göre yavaş. Saniyede birkaç yüz kilobitten fazlasını taşıyan her şey bunun yerine SPI ister.

  • Adres çakışmaları. Tek bir veriyolunda aynı adrese sahip iki cihaz, protokolün etrafından dolaşamayacağı bir donanım hatasıdır.