21 Eylül 2025 Pazar

I2C Nedir?

Inter-Integrated Circuit devre iletişim protokolü anlamına gelir. Kısa menzilli veri aktarım uygulamaları için sadece 2 kablo gerektiren, senkron haberleşen seri iletişim protokolüdür. Philips ( NXP ) firması tarafından oluşturulmuştur. Bir entegre ya da parça eğer içerisinde I2C sistemi var ise bu protokol ile kullanılabilir. Yok ise bu protokol ile kullanılamaz. I2C tabanlı sensörler, LCD/OLED ekranlar vb. için projelerde kullanılan çok popüler bir iletişim protokolüdür. I2C protokolünde sadece 2 pin ayrılarak aynı hat üzerine birçok RAM, EEPROM, RTC vb. parça bağlanıp kullanılabilir. Bu da fazladan pin ihtiyacını ortadan kaldırır. 

I2C protokolünde yönetici MCU’lara “master” yönetilen diğer parçalara ise “slave” denir. 



I2C haberleşmesinde, haberleşmeyi kontrol eden master cihazı bulunur. Her haberleşmede bir tane master bulunmalıdır. Haberleşmenin sağlanabilmesi için haberleşme hattına en az bir adet slave (köle) cihaz bağlanmalıdır. Hatta bağlanan birden fazla slave cihazlardan hangisinin veri aktaracağına, master cihaz karar verir. Böylece hat sayısında bir değişiklik olmadan birden fazla cihazla haberleşme sağlanır. Master ve slave cihazların aynı besleme hattına bağlanmasına gerek yoktur. Fakat iletişimin sağlanması için toprak hatlarının aynı olması gerekir. 
Hat sayısının fazla olması nedeniyle, uzun mesafeli haberleşmelerde tercih edilmez. Genellikle kısa mesafeli ve düşük veri aktarım hızının yeterli olduğu yerlerde kullanılır.
I2C haberleşme yöntemi ile birden fazla cihaz haberleşme sağlayabilir ancak, bir cihaz veri gönderirken diğer cihazlar veri yolunun boşalmasını beklemek zorundadır. Aynı anda 2 cihaz veri gönderirse, data hattında çakışma meydana gelecektir.
I2C protokolünde hat üzerine başka MCU’lar da bağlanabilir. Bunlar gerekli zamanlarda hem master hem slave olarak yerini alabilir. I2C birden fazla master’ın veri yolu üzerindeki tüm cihazlarla iletişim kurmasına izin veren bir sistemi destekleyebilir. Ancak master cihazlar veri yolu üzerinden birbirleriyle konuşamaz.


I2C Pinleri
Veri aktarımı için SDA (Serial Data Line) ve SCL (Serial Clock) olmak üzere iki adet haberleşme hattı bulunur. Bu hatlardan SDA, cihazlar arasındaki veri aktarımının sağlandığı hattır. Bu hatta çift yönlü veri aktarımı olur. Bu durum master cihazın veriyi gönderip alabildiği anlamına gelir. SDA hattı boyunca 8 bitlik veriler bit bit aktarılır. Her 8 bitlik veri için, fazladan bir bit( “ACK / NACK” biti) iletilmelidir. ACK / NACK biti, slave cihaz tarafından önceki bit dizisini başarıyla alıp almadığını belirtmek için kullanılır. 
ACK : Acknowledge(onaylamak, kabullenmek).
NACK : Not Acknowledge(onaylamamak, kabullenmemek).
SDA hattına aktarılan verilerin senkronizasyonu SCL hattı tarafından gerçekleştirilir. SCL hattında master cihaz tarafından üretilen saat sinyali bulunur. SCL hattı cihazlar arasında veri iletimini senkronize eder. SDA hattına bağlı tüm slave cihazların benzersiz adresi vardır. I2C ile 7 bit adresleme kullanıldığında 128(112) adet, 10 bit adresleme kullanıldığında 1024(1008) adet aygıt ile tek veri yolu üzerinde iletişim kurulabilir. Bu adresleme sayesinde master, istediği cihaz ile iletişim kurabilir.
I2C’de, RS232 seri porttaki gibi hem alıcının hem de vericinin kendi clock sinyalini üretme gibi bir durumu yoktur. I2C’de master tarafından üretilen clock sinyali tüm cihazlardan tarafından kullanılır. RS232 seri portta sadece iki cihaz arasında iletişim kurulurken I2C’de birçok cihaz arasında iletişim kurulur. 

Pull-up Dirençleri
I2C veri yolu sürücüleri “open drain” dir. Bu da ilgili sinyal hattını düşük(lojik 0) tutabilecekleri anlamına gelir, ancak yükseğe(lojik 1) çekemezler. 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. Her bir sinyal hattında bağlı olan aygıtlar haberleşme yapmadığı zaman veri hattındaki sinyali düşüğe çekemeyecektir ve böyle durumlarda hat boşta kalmamalıdır. Bu nedenle veri yolunun lojik 1 konumunda tutmak için Pull-up dirençler kullanılır. Haberleşmenin tüm hat boyunca hatasız bir şekilde sağlanabilmesi için SDA ve SCL hatları, pull-up dirençlerle VCC hattına bağlanmalıdır.  Bu dirençlerin değeri 2K ile 10K arasında seçilir. Dirençlerin değeri arttıkça iletişim hızı azalır.



I2C protokolü 4 adet hız aralığına sahiptir. Ancak kullanılan parçaların bu hızları desteklemesi gerekmektedir. Aşağıdaki tablodan kullanılacak hıza uygun pull-up direnç değerleri seçilebilir.



Mod

Hız

Direnç Aralığı

Standart

100 khz

5kΩ – 10kΩ

Hızlı

400 khz

2kΩ - 5kΩ

Yüksek Hızlı

3,4 Mhz

1kΩ




I2C Veri İletişim Protokolü




I2C protokolünde iletilen veri bloğuna mesaj denir. Mesajlar 8 bitlik diziler halinde aktarılır. İlk mesaj slave cihazın adresini, ikinci mesaj slave cihazın yazmaç adresini ifade eder. Üçüncü ve sonraki mesajlar veriyi taşırlar.



a. Start biti: İletişim başlatma bitidir. Saat frekansı lojik 1’deyken SDA hattı lojik 1’den 0’a çekilerek iletişim başlatılır. I2C veri yolu start bitinden sonra meşgul olarak kabul edilir.
b. Aygıt adresi: Master’ın hangi slave ile iletişim kurduğunu belirten adres bilgisidir. Aslında 7 bitten oluşur.  8.bit R/W bitidir. 7 bitlik adres bilgisi en anlamlı bit (MSB)’ten başlayarak veri yoluna yazılır. Mesaj tüm slave’lere iletildiğinde sadece bu adrese sahip slave mesajı işler. Bu bilgiler slave cihazda kayıtlıdır. Slave cihazın veri sayfasında bulunur.
c. R/W (Read/Write): Master, slave’e yazmak istiyorsa bu bit 0, slave’den okumak istiyorsa bu bit 1 olarak gönderilir.
d. ACK (Acknowledgement): Onay bitidir. Slave cihaz tarafından önceki bit dizisini başarıyla alıp almadığını belirtmek için kullanılır. Eğer mesaj alıcıya ulaştıysa, alıcı, SDA hattını bu bit süresince lojik 0’a çeker. Master hattı lojik 0’da gördüğünde mesaj’in iletildiğini anlar ve sıradaki mesaj’e geçer. Hattın lojik 0’a çekilmesi, yani mesaj’in alındığının bildirilmesine ACK (Acknowledgement) denir. Eğer hattın meşgul olması gibi bir nedenle mesaj alıcıya ulaşmadıysa, alıcı bu bit süresince hattı lojik 1’de tutar. Bu duruma da NACK (Not Acknowledgement) denir. Hattı dinleyen gönderici NACK okuyunca veri alışverişi durur. Gönderici mesaj’i tekrar gönderir yada nasıl devam edeceğine gönderici kendi karar verir.
e. Yazmaç(register) adresi: Slave aygıtın bellek adres bilgilerini içerir. Master aygıt, slave’in bellek adreslerinin nasıl haritalandığını, hangi yazmaca hangi bilginin yazılacağını veya okunacağını bilmesi gerekir. Bu bilgiler slave cihazda kayıtlıdır. Slave cihazın veri sayfasında bulunur.
f. Veri: Veriyi taşıyan bitlerdir.
g. Stop bit(leri): İletişim sonlandırma bitidir. Saat frekansı lojik 1’deyken SDA hattı lojik 0’dan 1’e çekilerek iletişim sonlandırılır. I2C veri yolu stop bitinden sonra müsait olarak kabul edilir.

NACK Biti Üretilen Durumlar
• Alıcı verileri alamıyor veya iletemiyorsa, bu durumda iletişimi durdurmak için bir NACK biti üretir. 
• İletişim sırasında, alıcı anlaşılmayan herhangi bir veri veya komut aldığında, bir NACK biti üretir. 
• Aktarım sırasında, alıcı herhangi bir gerçek zamanlı işlem gerçekleştirir ve master ile iletişim kuramazsa bir NACK biti üretir. 
• Master bir alıcı olduğunda ve veriyi slave'den okuduğunda, tüm verilerin okunmasından sonra, iletişimi durdurmak için veri hatlarında bir NACK biti üretir. 
• Master tarafından iletilen adrese ait herhangi bir cihaz yoksa, master herhangi bir slave tarafından onay alamaz ve bu durumu NACK olarak kabul eder.

Örneğin aşağıdaki sensörleri inceleyelim:
5 farklı sensörden oluşan GY-80 kartını ve 3 farklı sensörden oluşan GY-521 kartını incelediğimizde I2C veri yolu kullanarak sadece iki kablo ile 8 farklı sensörden veri alabiliriz.




Bu sensörlerle iletişim kurabilmek için onların benzersiz adreslerini ve onlardan veri okuyabilmek için de sensörlerin dahili kayıtçı adreslerini bulmamız gerekiyor. Bunları sensörlerin veri sayfalarından bulabiliriz. 
Örneğin; GY-80 devre kartı için aşağıdaki dört adrese sahibiz: 
3 eksenli ivmeölçer için onaltılı bir 0x53 
3 Eksenli Gyro için onaltılı bir 0x69 
3 Eksenli Manyetometre için onaltılı bir 0x1E 
Barometre ve termometre sensörü için onaltılı bir 0x77
Sensörlerin adreslerini bulduktan sonra, onlardan veri okuyabilmek için dahili kayıtçılarının adreslerini de bulmamız gerekiyor. GY-80 devre kartının 3 Eksen ivmeölçer sensöründen X eksenine ait verileri okumak istiyorsak, X ekseni verilerinin saklandığı dahili kayıtçı adresini bulmamız gerekir. Sensörün veri sayfasından bunları bulabiliriz.
Ayrıca Arduino resmi web sitesinde bulunabilecek I2C scanner ile sensörlerin adreslerini alabilir veya kontrol edebiliriz. Yani bu uygulamayı yükleyip çalıştırırsak, I2C veri yoluna bağlı cihazların adreslerini alabileceğiz.
SDA ve SCL hattı gerekli olan pull-up dirençler kartların üzerinde yer almaktadır. 


I2C Yazma İşlemi




Master, start bitini gönderdikten sonra slave cihazın adres bitini ve yazma yapacağı için R/W bitini 0 gönderir. Gönderilen adres biti I2C hattında slave bir cihazla eşleşiyorsa master, slave cihazdan bir onay biti(ACK) alır. Master onay bitini aldıktan sonra slave cihazın yazma yapacağı bölümün register adresini gönderir. Master yine onay biti(ACK) aldıktan sonra verileri slave cihaza göndermeye başlar. Master gönderdiği her verinin onay bitini ister. Eğer master onay biti alamazsa iletişimi durdurur yada iletişimi yeniden başlatır. Master verileri gönderdikten sonra stop biti göndererek iletişimi sonlandırır.  


I2C Okuma İşlemi




Master, start bitini gönderdikten sonra slave cihazın adres bitini ve okuma yapacağı için R/W bitini 1 gönderir. Gönderilen adres biti I2C hattında slave bir cihazla eşleşiyorsa master, slave cihazdan bir onay biti(ACK) alır. Master onay bitini aldıktan sonra veri yolunu serbest bırakır ama clock sinyalini göndermeye devam eder. Bu durumda master alıcı olur, slave verici olur. Okuma işleminde master, aldığı her bayt veriden sonra slave cihaza onay verir. Master beklediği verileri aldıktan sonra veri yolunu boşaltmak için NACK biti gönderir ve ardından stop biti göndererek iletişimi sonlandırır.  






_____________________________________________________________________________________________________________________________________________________

0 comments:

Yorum Gönder

Arduino Eğitimi Konu - 7

Arduino Eğitimi Konu - 10

Toplam Sayfa Görüntüleme Sayısı

Sensörlerin Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com