Ö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.