All posts

Published4 min read

I2C Nedir?

i2cserial-communicationi2c-devices

I2C (Inter-Integrated Circuit), düşük hızlı cihazlar arasında iletişim kurmak için kullanılan bir seri iletişim protokolüdür. Philips tarafından geliştirilen bu protokol, özellikle sensörler, mikrodenetleyiciler, EEPROM’lar ve diğer çevresel cihazlarla iletişim için yaygın olarak kullanılır. I2C, iki ana hattı kullanır:

  1. SDA (Serial Data): Veri iletimi için kullanılır.
  2. SCL (Serial Clock): Veri transferini senkronize etmek için saat sinyali sağlar.

I2C Nasıl Çalışır?

I2C protokolü, Master-Slave yapısına dayanır. Bu yapıda, Master cihaz iletişimi başlatır, saat sinyali sağlar ve iletişimi kontrol eder. Slave cihazlar, Master cihazın gönderdiği komutlara yanıt verir.

İletişim Aşamaları

  1. Start (Başlangıç) Koşulu: Master, SDA hattını SCL hattı yüksek durumdayken düşük yaparak iletişimi başlatır.
  2. Adresleme: Master cihaz, iletişim kurmak istediği Slave cihazın adresini gönderir.
  3. Okuma/Yazma Bitleri: Master, Slave cihazın hangi işlemi gerçekleştireceğini belirtir (Okuma: 1, Yazma: 0).
  4. ACK/NACK (Onaylama): Slave cihaz, adresi doğru alıp almadığını bildirmek için ACK (0) veya NACK (1) sinyali gönderir.
  5. Veri Aktarımı: Master ve Slave cihaz arasında veri transferi gerçekleşir.
  6. Stop (Durdurma) Koşulu: Master, SCL hattı yüksek durumdayken SDA hattını yüksek yaparak iletişimi sonlandırır.

I2C’nin Avantajları

  • Az Pin Kullanımı: Yalnızca iki hat gerektirir (SDA ve SCL).
  • Esneklik: Aynı veri hattında birden fazla cihaz bağlanabilir.
  • Hız Kontrolü: Hız gereksinimlerine göre farklı modlarda çalışabilir.
  • Çoklu Master Desteği: Birden fazla Master cihaz aynı veri hattını paylaşabilir.

I2C’nin Dezavantajları

  • Hız Limiti: SPI gibi protokollere kıyasla daha düşük hızda çalışır.
  • Pull-Up Dirençleri Gerektirir: SDA ve SCL hatları için pull-up dirençlerine ihtiyaç duyulur.
  • Veri Çarpışması Riski: Çoklu Master kullanımında dikkatli bir protokol yönetimi gerektirir.

I2C’nin Teknik Özellikleri

  • Hız Modları:
  • Standart Mod: 100 kHz
  • Hızlı Mod: 400 kHz
  • Hızlı Mod Plus: 1 MHz
  • Yüksek Hız Modu: 3.4 MHz
  • Master ve Slave İlişkisi: I2C iletişiminde bir cihaz Master (kontrolcü) olarak görev yapar, diğer cihazlar ise Slave (kontrol edilen) rolündedir.
  • 7-bit ve 10-bit Adresleme: Genellikle 7-bit adresleme kullanılır, ancak daha fazla cihaz gerektiğinde 10-bit adresleme kullanılabilir.

STM32 ile I2C Kullanımı

STM32 mikrodenetleyicileri, yerleşik I2C donanımı ile I2C protokolünü kolayca uygulamak için mükemmel bir seçenektir. STM32 ile I2C kullanımı için genellikle STM32 HAL (Hardware Abstraction Layer) kütüphanesi kullanılır.

1. Donanım Bağlantısı

Bir STM32 mikrodenetleyicisini I2C tabanlı bir sensöre (örneğin, bir sıcaklık sensörü olan LM75) bağlamak için temel bağlantılar şunlardır:

  • SCL pinini mikrodenetleyicinin I2C saat pinine bağlayın (örneğin, PB6).
  • SDA pinini mikrodenetleyicinin I2C veri pinine bağlayın (örneğin, PB7).
  • 4.7kΩ’lik pull-up dirençlerini hem SDA hem de SCL hatlarına bağlayın.
  • VCC ve GND bağlantılarını yapmayı unutmayın.

2. STM32CubeMX Konfigürasyonu

  1. I2C Pinlerinin Ayarlanması:
  • STM32CubeMX’i açın.
  • Kullanacağınız I2C hattını etkinleştirin (örneğin, I2C1).
  • Pinleri (SCL ve SDA) seçin.
  1. Clock Ayarları:
  • Sistem saatini (HCLK) ve I2C hızını ayarlayın (örneğin, 100 kHz).
  1. Kod Oluşturma:
  • HAL kütüphaneleri ile kod üretmek için “Generate Code” seçeneğini kullanın.
#include "main.h"

// I2C cihazının slave adresini tanımlayın (7-bit adres formatında)
#define SLAVE_ADDRESS 0x48

// Kullanılacak I2C handler tanımı
I2C_HandleTypeDef hi2c1;

// Veri almak için kullanılacak buffer
uint8_t received_data[2];

// Fonksiyon prototipleri
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);

int main(void) {
// STM32 başlatma
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();

while (1) {
// Slave cihazdan 2 byte veri al
if (HAL_I2C_Master_Receive(&hi2c1, SLAVE_ADDRESS << 1, received_data, 2, HAL_MAX_DELAY) == HAL_OK) {
// Alınan veriyi işleyin
int temperature = (received_data[0] << 8 | received_data[1]) >> 7;

// İşlenen sıcaklık değerini (°C) kullanın veya bir debug aracıyla kontrol edin
printf("Sıcaklık: %d °C\n", temperature);
} else {
// Hata durumunda bir mesaj yazdırın
printf("I2C okuma hatası!\n");
}

HAL_Delay(1000); // 1 saniye bekle
}
}

// I2C1 yapılandırma fonksiyonu
static void MX_I2C1_Init(void) {
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // Standart mod (100 kHz)
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1);
}

// GPIO yapılandırma (SDA ve SCL pinleri için gerekli)
static void MX_GPIO_Init(void) {
__HAL_RCC_GPIOB_CLK_ENABLE(); // GPIOB saatini etkinleştir

GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; // PB6 ve PB7 (SCL ve SDA)
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

// Sistem saat yapılandırma fonksiyonu
void SystemClock_Config(void) {
// Burada saat yapılandırması yapılır (HSE, PLL vb.)
}

4. Örnek Uygulama: LM75 ile Sıcaklık Okuma

LM75 sıcaklık sensöründen veri okumak için yukarıdaki kod kullanılabilir. Sensörün 7-bit adresi genellikle 0x48'dir. İlgili datasheet’ten adresin doğru olduğundan emin olun.

Verinin İşlenmesi

LM75'ten gelen veri iki byte olarak alınır. İlk byte sıcaklık bilgisini, ikinci byte ise ek hassasiyet bilgilerini içerir. İşleme sırasında bit kaydırma ve birleşim işlemleri yapılır.

5. Hata Ayıklama

  • “NACK” Hatası: Slave cihaz doğru şekilde bağlanmamış olabilir veya adres yanlış olabilir.
  • “Bus Busy” Hatası: SDA ve SCL hatlarında hatalı bağlantılar olabilir.
  • Saat Problemleri: I2C hızını doğru ayarladığınızdan emin olun.

Sonuç

I2C, düşük güçlü ve çok cihazlı iletişim için uygun, kullanımı kolay bir protokoldür. STM32 mikrodenetleyicileri ve HAL kütüphanesi ile bu protokolü uygulamak oldukça basittir. Yukarıdaki adımları takip ederek I2C ile çalışan cihazlarla başarılı bir şekilde iletişim kurabilirsiniz.