← TÜM YAZILAR

01 Şubat 2026 · Selin Arslan · 1 DK

STM32'de I2C üzerinden çoklu sensör okumak

STM32I2CC

Ölçüm kartımızda (GC-2025-03) aynı I2C hattına üç sensör bağladık. İkisi aynı varsayılan adresi kullanıyordu, üçüncüsü ise bazen hattı kilitliyordu. Bu yazı ikisini de nasıl çözdüğümüzü anlatıyor.

Adres çakışması

İki sensörün de varsayılan adresi 0x76. Birinin ADDR pinini VDD'ye çekerek adresini 0x77'ye taşıdık, HAL tarafında iki ayrı handle ile okuduk:

HAL_I2C_Mem_Read(&hi2c1, SENSOR_A_ADDR << 1, REG_DATA, 1, buf_a, 6, 100);
HAL_I2C_Mem_Read(&hi2c1, SENSOR_B_ADDR << 1, REG_DATA, 1, buf_b, 6, 100);

Hat kilitlenmesi

Üçüncü sensör bazen SCL düşükken güç kesintisi yaşıyor ve hattı meşgul bırakıyordu. Çözüm, başlangıçta 9 clock darbesi gönderip hattı manuel olarak resetlemek oldu:

void i2c_bus_recover(void) {
  for (int i = 0; i < 9; i++) {
    HAL_GPIO_TogglePin(SCL_PORT, SCL_PIN);
    HAL_Delay(1);
  }
}

Zamanlama

Üç sensörü 10 Hz'de okumak istiyorduk; HAL'in bloklayan okuması bunu zorlaştırdı. FreeRTOS'a geçmeden önce basit bir round-robin zamanlayıcıyla her sensörü kendi periyodunda okuyan bir döngü yazdık, sonraki adım bunu GC-2025-04'teki zamanlayıcıyla birleştirmek.