I2C- Bus veri iletişim standartları
I2C veri yolu standardı ilk olarak philips firması tarafından geliştirilmiş ve kullnıma sunulmuştur. I2C veri yolunda tüm haberleşmeler için sadece iki tel kullanılır. Bu hatlar ise standart olarak SDA (serial data) ve SCL (serial clock ) olarak adlandırılırlar. Her iki yolda iki yönlüdür. Yani hem veri gönderilebilir hemde veri alınabilir. Hatta bağlı cihazlar o anki duramlarına göre Master yada Slave (efendi –köle) olarak çalışabilirler. I2C veri iletişimini kullanan her cihazın kendi türüne ait bir 7 bit adresi mevcuttur ve bu fabrikasyon olarak ayarlanır. Yalnız bazı cihazlarda bu 7 bitin 4 ü sabit diğer leri ise donanım tasarımında adresleme için ayrılan uçları vcc veya şaseye bağlayarak ayarlanır. Örnek olarak 24c64 seri eeprom böyledir. Bunun en büyük faydası ise aynı cihazdan aynı yol üstüne 7 adet bağlayabilmenizdir. Hangi cihazı kullanacaksanız veri sayfalarından bunu öğrenmelisiniz. Yazımızın ileriki bölümlerinde bununla ilgili daha detaylı açıklama yapacağım.
Yukarıdaki şekildede görüldüğü gibi I2C protokolünü kullanan cihazların tümü sadece iki veri yolu kullanırlar. Bunun ise pratikte çok büyük faydaları vardır. Miko işlemcide çok sayıda port tasarrufunu sağlar ve değişik cihazlar için değişik CE,OE gibi bir çok uçla boğuşmak zorunda kalmazsınız.
I2C veri yolunda aynı anda Cihazlardan birisi Master diğerleri Slave olarak çalışırlar. Master olarak seçilen cihaz yoldaki veri transferini yönetir ve transfer boyunca clokc sinyalini sağlar. Aynı zamanda her hangi bir cihazı slave olarak adresler. Bu yol standardında zaman içerisinde geliştirilmiş 3 çeşit veri hızı mevcuttur. Standart mode olan 100kbit/s. 400 kbit/s Fast-Mode ve 3.4 Mbit/s High-speed mode. Hat kapasitansı ise 400 pF ile sınırlıdır.
I2C Cihazların Devreye bağlantısı.
Cihazları mikrokontrolörünüzün hangi portuna bağlayacağını seçerken şunlara dikkat etmelisiniz. Kullanacağınız portlar open-drain yada open –collektor uçlar olmalıdır. Bu seçimi yapıp karar verdikten sonra SCL ve SDA hatlarına 5 volt besleme gerilimi ile aralarına birer adet Pull-up (yukarı çekme) direnci bağlamalısınız.
Rp (pull-up) direncinin değeri ise 12 Mhz ile çalışan bir devrede 5.1 K yada 4,7 k olabilir. Daha düşük yada yüksek hızlarda THE I2C-BUS SPECIFICATION, VERSION 2.0 DECEMBER 1998 isimli katologtan (philips) yararlanabilirsiniz. Hardware tasarımında bunlar gerçekleştirildikten sonra sıra software gelir. Yalnız bundan önce yolun çalışması esnasında kullanılacak olan standart bazı kurallardan ve komutlardan bahsedeceğim.
Yolun çalıştırılması
Haberleşmeye başlamak için Master (genelde bir mikro işlemcidir) tarasından yola bir START gönderilir. Bundan sonra Master olarak çalışan cihaz hangi cihazla haberleşecekse o cihazı Slave olarak adresler.Bu adres 7 bitten oluşur ve 8 bit ilede bir okumamı yada yazmamı yapacağını seçer. Bu bilgiler gönderildikten sonra Slave cihaz Mastera bir ACK gönderir. ACK gelmişse veri kabul edilmiştir. Eğer bir hata varsa bu durum NACK olarak kabul edilir. Cihaz adreslemesi yapıldıktan sonra ikinci ve üçüncü bytler ile hafıza adreslemesi vb işlemler yaptırılır. İletişim kesilmek istendiğinde Master yola bir STOP komutu gönderir. Anlattığımız bütün bu işlemler yazılımın sorumluluğundadır. Şimdi yukarıda kullandıoğımız START, STOP, ACK gibi komutlar nelerdir onlara göz atacağız. Ama daha önce yoldaki verinin hangi durumda geçerli olduğuna bir göz atalım.
Data Validity (veri geçerliliği):
Verinin geçerli olması için veri değişikliği SCL nin sadece düşük olduğu durumlarda yapılır. Bir başka deyişle SCL düşüğe çekilir yeni ver SDA ya yazılır .Aksi durumda istenmeyen belirsiz durumlar oluşabilir.
START ve STOP durumu:
Haberleşmenin başlaması için master tarafından yola Bir START ın gönderilmesi gerekir. Aşağıdaki şekildende anlaşılacağı üzere bu da şu şekilde yapılır. Haberleşme yoksa pull-up dirençler den dolayı her iki yolda HIGH dır. Aksi bir durum varsa sistemde bir hata var demektir. Yazılım ile SDA yükseğe çekilir peşinden SCL yükseğe çekilir. Bu iki işlem sadece yol güvenliği için .SCL yüksekken SDA düşüğe çekilirseyol bir START komutu gönderilmiş olur.
Haberleşmenin sonlandırılması ve yolun serbest bırakılması için ise SDA düşüğe çekilir SCL yükseğe çekilir ve bu anda tekrar SDA yükseğe çekilirse bir STOP komutu gönderilmiş olur.
ACK:
Yukarıda belirttiğim gibi her iki hatta iki yönlü bir veri yoludur. Yola gönderilen START tan sonra 8 clok pulse ı ile 8 bitlik 1 byte gönderilir. Bundan sonra Master 9 un cu clok pulse ni üretirken SDA hattını boşta bırakır. Bu durumda pull-up dirençlerden dolayı SDA yüksektedir. Eğer veri slve tarafından kabul edilmişse slave SDA yı 9. clok darbesi ile beraber düşüğe çeker bizde bunu kontrol ederek bir hata varmı yokmu kontrol ederiz. NACK ise bunun tam tersi yani 9. clock darbesinde SDA yüksekte kalırsa bir NACK oluşur.
7 bit Adres Transferi :
Tüm cihazlar kendilerine ait olan 7 bitlik bir adres değerine sahiptir. Örnek olarak DS 1307 real time clock entegresi 1101000 binary adresine sahiptir. 8. bit ilede cihaza okuma mı yada yazmamı yapılacağı seçilir.
Veri Transferi:
Veriler 8 bitlik veri formatında gönderilir. İlk gönderilecek veri en yüksek değetlikli bit (MSB) en son ise en düşük değerlikli (LSB) bit gönderilir .
Bütün bu anlattıklarım I2C ile ilgili temel ve genel bilgiler. Yazımın devamında Hepinizin işine yarayacağını umduğum birkaç I2C entegre devresi ile beraber örnekler ve kodlarla konuyu biraz daha irdeleyeceğiz. Görüşmek üzere.
Ali KARAKAŞ
karakasali@hotmail.com