I²C Haberleşme Protokolü

Bu konuda, I²C iletişim protokolü ile bu protokolü neden kullanmak isteyeceğimiz ve nasıl uygulandığı hakkında birçok şey öğreneceğiz.

Inter-Integrated Circuit (I²C) Protokolü, birden fazla “slave” dijital entegre devrenin (çiplerin) bir ya da daha fazla “master” cihaz (çip) ile iletişim kurmasına izin veren bir protokoldür. Seri Çevresel Arabirim (SPI) gibi, sadece  kısa mesafeli iletişim için tasarlanmıştır. Aynı devre kartı üzerindeki çiplerin veya sensörlerin birbirleri ile haberleşmesini sağladığı gibi, bir devre kartına veri kabloları ile bağlanabilen sensör vb. çevre elemanlarının haberleştirilmesinde de kullanılabilir. Asenkron Seri Arayüzler gibi (RS-232 veya UART gibi), sadece bilgi alışverişi için iki sinyal hattı gerektirir.

I²C haberleşmenin ne zaman ve neden kullanılacağını anlamak için, önce diğer haberleşme metodları ile aralarındaki farkın nasıl olduğunu görmek için mevcut diğer seçeneklerle karşılaştırmalıyız.

 

Seri port haberleşme sorunları

Block diagram of an asynchronous serial system.

Seri portlar, asenkron modda (senkronize değildir ve clock pals verisi iletilmez) olduğundan dolayı bunları kullanan cihazların veri hızları önceden kararlaştırmalıdır. İki cihazın da aynı hıza yakın clock palslere sahip olması gerekir ve bu nedenle de her iki uçtaki saat hızları arasındaki aşırı farklar bozuk veriye neden olur.

İletim hatının her iki ucundaki UART donanım fazlalığı gereksinimi nedeniyle yazılımsal olarak kesin sonuç elde etmek, karmaşık ve zordur.

Asenkron seri portlardaki bir diğer temel arıza, sadece iki cihaz arasındaki iletişim için doğal olarak uygun olmasıdır. Birden fazla cihazı tek bir seri bağlantı noktasına bağlamak mümkün olsa da, veri yolu çakışmasi (iki aygıtın aynı satırı aynı anda sürmeyi denediği durumlarda) her zaman bir sorundur ve söz konusu aygıtların zarar görmesini önlemek için dikkatle ele alınmalıdır. Bu genellikle harici bir donanım aracılığıyla yapılır.

Son olarak, veri hızı da bir sorundur. Asenkron seri haberleşmelerde teorik bir sınır bulunmamakla birlikte, çoğu UART cihazı sadece belirli bir dizi sabit baud hızını desteklemektedir ve bunların en yükseği saniyede 230400 bittir (baud rate).

SPI haberleşme sorunları

 

Block diagram of an SPI system.

 

SPI’nın en belirgin dezavantajı, haberleşme hattı için gerekli olan pinlerin sayısıdır. Tek bir ana üniteyi SPI veri yolu ile tek bir slave’e bağlamak dört hat gerektirir. Her bir ilave slave cihaz için, master üzerinde de ek bir çip seçme I / O pini (CS) gereklidir. Bir çok slave cihazın tek bir master’a ilave edilmesi gereken durumlarda pin bağlantılarının bu şekilde çoğalması, bu haberleşme yönteminin tercih edilmemesine neden olur. Ayrıca, her cihaz için çok sayıda bağlantı yapılması gerektiğinden küçük boyutlu PCB yerleşim durumlarında sinyal yollarının çizilmesini daha zor hale getirebilir. SPI, veriyolu üzerinde yalnızca bir master’a  izin verir, fakat isteğe bağlı sayıda slave cihazı desteklemektedir (yalnızca veri yoluna bağlı cihazların sürücü kapasitesine ve mevcut çip seçme pinlerinin sayısına bağlıdır).

I²C’ye giriş

Block diagram of an I2C system

Bu yöntem yukarıda anlatılan diğer iki yöntem de daha iyidir. I²C, UART seri port gibi sadece iki tel gerektirir ancak bu iki kablo 1008 adet slave cihazını destekleyebilir. Ayrıca SPI’nın aksine I²C birden fazla master sistemin veriyolu üzerindeki tüm cihazlarla iletişim kurmasına izin veren bir sistemi destekleyebilir (ancak master cihazlar veri yolu üzerinden birbirleriyle konuşamaz ). 

Çoğu I²C cihazı 100kHz veya 400kHz’de iletişim kurabilir. I²C ile de bazı yükler vardır, gönderilecek her 8 bitlik veri için, fazladan bir meta veri ( “ACK / NACK” biti) iletilmelidir. Metadata, metaveri ya da üst veri olarak da tanımlanabilir ve bir kaynağın ya da verinin öğelerini tanımlayan bilgilerdir. Kısaca veri hakkında oluşturulan ayrıca ilave veri/bilgi olarak özetlenebilir

I²C’yi uygulamak için gereken donanım SPI’dan daha karmaşık ancak asenkron seriden daha azdır. Yazılımda oldukça basit bir şekilde uygulanabilir.

I²C, ilk olarak 1982 yılında Philips tarafından çeşitli Philips çipleri için geliştirilmiştir. Orijinal versiyonunda sadece 100kHz iletişim için izin verildi ve yalnızca 7 bit adresler için sağlanmış, veri yolu üzerindeki aygıt sayısını 112’ye sınırlanmıştı (geçerli I²C adresleri için asla kullanılmayacak olan birçok ayrılmış adres vardır). 1992 yılında, ilk kamu şartnamesi yayınlandı ve 400 kHz’lik bir hızlı modun yanı sıra 10 bitlik bir adres alanı genişletildi. Çoğu zaman (örneğin, birçok Arduino uyumlu kart üzerindeki ATMega328 cihazında), I²C için cihaz desteği bu noktada sona eriyor. Belirtilen üç ek mod vardır: 1MHz’de fast mode plus; 3,4MHz’de high-speed mod; ve 5MHz’de ultra-fast mod.

 Donanım Düzeyinde I²C

Sinyaller

Her I²C veri yolu iki sinyalden oluşur: SCL ve SDA. SCL saat sinyalidir ve SDA veri sinyalidir. Saat sinyali daima geçerli veriyolundaki master cihazı tarafından üretilir. Bazı slave aygıtlar, saatin master’ı daha fazla veri göndermesini geciktirmek için (ya da master saat üretmeyi denemeden önce, verileri hazırlamak için daha fazla zamana gereksinim duyduğundan) zamanı zorlayabilir. Buna “saat germe” denir ve protokol sayfasında anlatılır.

örnek I2C

UART veya SPI bağlantılarından farklı olarak, I²C veri yolu sürücüleri “open drain” dir, bu da ilgili sinyal hattını düşük tutabilecekleri anlamına gelir, ancak yükseğe çekemezler. Böylelikle, herhangi bir aygıtın yükseğe çekmeye çalışırken diğer bir aygıtın düşüğe çekmeye çalıştığı bir hat çekişmesi olamaz, sürücülerin zarar görme potansiyelini ya da sistemdeki aşırı güç dağılımını ortadan kalkar . Her bir sinyal hattında bağlı olan aygıtlar haberleşme yapmadığı zaman, veri hattındaki sinyali düşüğe (0) çekmeyecektir ve böyle durumlarda hat boşta kalmamalıdır. Bu nedenle veri hattı sinyalini yüksek duruma (1) getirmek için birer tane PULLUP direnci bulunur.

Equivalent internal circuit diagram of an I2C system.

Direnç seçimi, veriyolu üzerindeki cihazlara göre değişir. Ancak 4.7k ile başlamak ve gerekirse aşağı doğru ayarlamak iyi bir yöntemdir. I²C oldukça sağlam bir protokoldür ve kısa mesafeli bağlantı hatları ile (2-3m) kullanılabilir. Uzun mesafeler veya çok sayıda cihaz içeren sistemler için daha küçük dirençler daha iyidir.

Sinyal Seviyeleri

Veri yolu üzerindeki aygıtlar sinyalleri yükseğe sürmediği için, I²C farklı I / O voltajlarına sahip aygıtları bağlamada bazı esneklikler sağlar. Genel olarak bir cihazın bir diğerinden daha yüksek bir voltajda olduğu bir sistemde, iki cihazı I²C üzerinden aralarında herhangi bir seviye kaydırma devresi olmadan bağlamak mümkün olabilir. Bu işin hilesi şudur, PULLUP dirençlerini iki voltajın altında bir seviyeye göre bağlamaktır. Bu yöntem sadece iki sistem de voltajlarının alt kısımlarının, yüksek gerilim sistemine sahip olan hihazın high seviye giriş voltajını (örneğin, 5V Arduino ve 3.3V ivmeölçer) aştığı bazı durumlarda çalışır. Örneğin bu hatta 3v geldiğinde her iki cihaz da bunu high olarak algılayacaktır

İki sistem arasındaki voltaj farkı çok büyük ise (5V ve 2.5V gibi),  bir I²C seviye değiştirici kartı (I²C level shifter) kullanılmalıdır. Bu durum, aynı adrese sahip birden fazla cihazın tek bir ana işlemciye bağlanacağı durumlarda kullanışlıdır.

Protokol

I²C üzerinden iletişim, bir UART veya SPI çözümüyle olduğundan daha karmaşıktır. Sinyal, veriyolundaki aygıtlar için geçerli bir I²C iletişimi olarak tanınması için belirli bir protokole bağlı olmalıdır. Neyse ki, çoğu cihaz sizin için tüm ayrıntıları otomatik olarak halledecek şekilde tasarlanmıştır ve sizin sadece yollamak etmek istediğiniz verilere odaklanmanıza izin verir.

 

Temel Prensip

 

Standard 7-bit address transfer message.

 

Mesajlar iki tür çerçeveye bölünür:

  • 1. çerçevede; master cihazın,  mesaj gönderilecek olan slave cihazı gösterdiği adres bilgisi vardır,
  • 2. çerçevede; master cihazdan slave cihaza veya slave cihazdan master cihaza gönderilen 8 bitlik verilerin bulunduğu  bir veya daha fazla veri çerçevesi .

SCL düşüğe (LOW) çekildikten sonra SDA hattına veri yerleştirilir ve SCL yükseğe (HIGH) çekildikten sonra örneklenir. Saat palsı kenarı ve veri okuma / yazma arasındaki zaman, veri yolundaki aygıtlar tarafından tanımlanır ve çipden çipe değişmektedir.

Başlangıç koşulu

Adres çerçevesini başlatmak için ana cihaz SCL’yi yüksek bırakır (1) ve SDA’yı düşüğe çeker (0). Bu işlem, tüm slave cihazlarını bir iletimin başlamak üzere olduğu konusunda uyarır. Eğer iki master cihaz aynı anda veriyolunun sahipliğini almak isterse, hangi cihaz SDA’yı ilk önce düşüğe çekerse yarışı kazanır ve veriyoulunun kontrolünü kazanır. Başka master cihazlara veriyolunun kontrolünü bırakmadan yeni bir iletişim dizisini başlatarak tekrarlanan başlangıçlar yapmak mümkündür.Bundan,  daha sonra bahsedeceğiz.

Adres çerçevesi

Adres çerçevesi yeni bir iletişim dizisinde her zaman ilk sıradadır. İlkönce 7 bitlik adres bilgisi  en anlamlı bit (MSB)’ten başlayarak veri yoluna yazılır, ardından bir okuma (1) veya yazma (0) işlemi olup olmadığını belirten bir R / W biti gönderilir.

Çerçevenin 9. biti, NACK / ACK bitir. Bu, tüm çerçeveler için geçerlidir (veri veya adres). Çerçevenin ilk 8 biti gönderildikten sonra, alıcı cihaza SDA üzerinden kontrol verilir. Alıcı cihaz, 9. saat palsından önce SDA hattını düşüğe çekmezse, alıcı cihazın ya veri almadığı ya da mesajı nasıl ayrıştıracağını bilmediği anlaşılabilir. Bu durumda, veri alışverişi durur ve nasıl devam edeceğine sistem master cihazı tarafından karar verilir.

Veri çerçeveleri

Adres çerçevesi gönderildikten sonra, veri iletilmeye başlayabilir. Master, normal aralıklarla saat palsleri üretmeye devam edecektir ve veriler R / W biti bir okuma veya yazma işlemi gösterip göstermediğine bağlı olarak ya master ya da slave tarafından SDA üzerine yerleştirilecektir.

Durma koşulu

Tüm veri çerçeveleri gönderildikten sonra, master bir durdurma koşulu oluşturur. Durdurma koşulları, SCL’de 0-1 arası bir geçişten sonra, SCL’nin yüksek kalmasıyla, SDA’daki 0-> 1 (düşükten yükseğe) geçişle tanımlanır. Normal veri yazma işlemi sırasında yanlış durma koşullarından kaçınmak için, SCL yüksek olduğunda SDA’daki değer değişmemelidir.

Gelişmiş Protokol Konuları

10 bit adresler

 

 

 

 

10 bitlik bir adresleme sisteminde, 7 bitlik adresten farklı olarak, slave adresini iletmek için iki çerçeve gerekir. İlk çerçeve, b11110xyz kodundan oluşacaktır, burada ‘x’, slave adresinin MSB’si, ‘y’ slave adresinin bit 8’i ve ‘z’ ise yukarıda açıklandığı gibi okuma / yazma bitidir. İlk çerçevenin ACK bit’i, adresin ilk iki biti ile eşleşen tüm slave’ler tarafından onaylanacaktır. Normal 7-bit aktarımda olduğu gibi, başka bir aktarım hemen başlar ve bu aktarım adresin bitlerini 7: 0 içerir. Bu noktada, adreslenen slave bir ACK biti ile cevap vermelidir. Aksi takdirde, hata modu 7 bitlik bir sistemle aynı tepkiyi gösterecektir.

Aynı sistem üzerinde, 10 bit adres cihazları ile 7 bit adres cihazlarının birlikte var olabileceğini unutmayın. Bu durumda 10 birtlik adresin ‘11110’ kısmı, herhangi bir geçerli 7 bit adresin bir parçası değildir.

Tekrarlanan Başlangıç Koşulları

Bazı durumlarda bir master cihazın, tek seferde birkaç mesajın alınıp-verilmesine, veriyolundaki diğer master cihazlar tarafından müdahale edilmeden izin verilmesi önemlidir. Bu nedenle tekrarlanan başlangıç koşulu tanımlanmıştır.

Tekrarlanan bir başlangıcı gerçekleştirmek için, SCL düşük iken, SDA’nın yüksek olmasına izin verilir sonra SCL nin yükseğe çekmesine izin verilir ve daha sonra da SCL yüksek iken SDA tekrar düşüğe çekilir. Çünkü veri hattında durma durumu olmamıştı, önceki iletişim gerçekten tamamlanmamıştı ve mevcut master veriyolunun kontrolünü hala daha elinde tutuyordu.

Bu noktada, bir sonraki mesaj iletime başlayabilir. Bu yeni mesajın sözdizimi, diğer mesajlarla aynıdır  (yani bir veri karesi ile takip edilen bir adres çerçevesi). Herhangi bir sayıda tekrarlı çalışmaya izin verilir ve master, durma durumu oluşana kadar veriyolunun kontrolünü sürdürecektir.

Saat Puls germe/uzatma (Clock Stretching)

Zaman zaman, master cihazın veri gönderim hızı, slave cihazın bu verileri alma yeteneğini aşacaktır. Bunun nedeni, verilerin henüz hazır olmamasıdır. Örneğin, slave henüz bir analogdan dijitale dönüştürme işlemini tamamlayamamıştır veya daha önceki bir işlemin tamamlanmadığı, tamamlanmamış bir EEPROM yazma işlemi olabilir. Slave cihaz diğer istekleri yerine getirmeden önce bunları bitirmesi gerekiyor.

Bu durumda, bazı bağımlı aygıtlar “saat gerilmesi” (clock stretching) olarak adlandırılan işlemi yürütür. Nominal olarak, tüm zamanlama master tarafından yürütülür, slave sadece veriyi veri yoluna koyar veya master’ın saat sinyallerine karşılık olarak veriyi veriyolundan alır. Veri aktarım işleminin herhangi bir noktasında adreslenmiş bir slave cihaz, SCL hattını düşük tutabilir ancak master cihaz SCL hattını serbest bıraktıktan sonra buna müsaade edilir. Slave SCL hattını serbest bırakıncaya kadar Master cihaz, ilave saat darbelerinden veya veri aktarımından kaçınacak şekilde uyarlanmıştır.

 

Yukarıdaki yazı https://learn.sparkfun.com/tutorials/i2c adresinden Türkçe’ye çevrilerek yayınlanmıştır.

Umarım faydalanırsınız….

 

 

 

Yorum bırakın