STM32F4 Disco 9DOF sensör i2c haberleşme sorunu

Başlatan orhun erol, 29 Aralık 2016, 19:02:54

orhun erol

Arkadaşlar hepinize iyi akşamlar. Elimde LSM9DS1 9DOF imu breakout modül var. Bu modülü stm32f407 disco ile i2c üzerinden haberleştiriyorum. Problem şu şekilde dataları almaya başladıktan bir süre sonra data gelmemeye başlıyor. Bu sorun neyden kaynaklanıyor olabilir ? Yardımcı olursanız çok sevinirim. Kodum da şu şekilde;


double acc[3],gyro[3];
  uint8_t data[6];
  int16_t i=0,gyro_data[3],acc_data[3];


//// Sensörün register ayarları yapılıyor  ////

uint8_t cmd[1];
  cmd[0]=0xC0;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD, CTRL_REG1_G, 1, cmd,1,0x100);
  cmd[0]=0x00;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD, CTRL_REG2_G, 1, cmd,1,0x100);
  cmd[0]=0x00;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD, CTRL_REG3_G, 1, cmd,1,0x100);
  cmd[0]=0x38;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD, CTRL_REG4, 1, cmd,1,0x100);
  cmd[0]=0x38;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD, CTRL_REG5_XL, 1, cmd,1,0x100);
  cmd[0]=0x00;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD, CTRL_REG6_XL, 1, cmd,1,0x100);
  cmd[0]=0x00;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD, CTRL_REG7_XL, 1, cmd,1,0x100);


//////////   IMUdan datalar toplanıyor ///////

while (1)
  {

  /* USER CODE BEGIN 3 */
    HAL_I2C_Mem_Read(&hi2c1, IMU_ADD, 0x18, 1, data,6,0x100);
      for(i=0;i<3;i++){
        gyro_data=(data[2*i+1]<<8)|data[2*i]; 
        gyro=(double)gyro_data*0.00875;
    }
      HAL_I2C_Mem_Read(&hi2c1, IMU_ADD, 0x28, 1, data,6,0x100);
      for(i=0;i<3;i++){
        acc_data=(data[2*i+1]<<8)|data[2*i]; 
        acc=(double)acc_data/16384*9.8;
    }
      
  }

Cemre.

Çipi bilmiyorum ama mutlaka FIFO interrupt vardır diye tahmin ediyorum. Interrupt bekleyip veriyi o şekilde okursanız sorun yaşamazsınız..

orhun erol

Cevap verdiğin için teşekkür ederim. Çipin FIFO özelliği var yarın deneyeceğim inşallah sorunum çözülür.

orhun erol

Tavsiyeni uyguladım ancak değişen bir şey olmadı. Dikkatimi çeken bir nokta oldu. I2C registerlarında busy flag sürekli set durumunda kalıyor. Bu sorun çipten dolayı mı kaynaklanıyor yoksa discovery kartımdan mı ?

Cemre.

Alıntı yapılan: orhun erol - 30 Aralık 2016, 14:33:57
Tavsiyeni uyguladım ancak değişen bir şey olmadı. Dikkatimi çeken bir nokta oldu. I2C registerlarında busy flag sürekli set durumunda kalıyor. Bu sorun çipten dolayı mı kaynaklanıyor yoksa discovery kartımdan mı ?

Şuan datayı sadece int sinyali geldiğinde mi okuyorsunuz? Öyleyse Busy olması için bir sebep yok gibi görünüyor. Yeni kodu burada paylaşma imkanınız var mı? Ben MPU6050 ile çalışmıştım ve bahsettiğiniz bir süre sonra veri alamama sorununu INT kullanımı ile çözmüştüm...

minicihazlar

STM32F407'nin ERRATA dokümanına baktınız mı? I2C ile ilgili birkaç silikon hatası var, belki onlardan birine denk geliyorsunuzdur. ST'nin garip bir uyumluluk politikası var. İlk çıkan STM32'lerde I2C bloğunda bir hata vardı ve o zamanlardaki Standard Library bunu çözmüyordu. I2C ile problemsiz çalışmak için ilgili hata için bir workaround içeren I2C driver vardı. Bildiğim kadarıyla müşteriler kodlarını kolay taşısınlar STM32 ürünleri arasında diye bu hatayı düzeltmeden o zamanki tüm ürünlere (bir süre sonra HW I2C bloğunu güncellediler ve o hatayı da düzelttiler diye biliyorum) de koydular. Sonradan STMCube'a geçerken HAL lib içine bu workaround girdi diye biliyorum.

orhun erol

@Cemre. INT kullanmadan datayı almaya çalışıyorum. INT ayarlarını da yapmaya çalıştım ancak yapamadım. Yukarıda verdiğim register ayarı kodlarına ek olarak aşağıdaki kodları girdim.

@minicihazlar ERRATA dökümanını incelemedim. Bu çipi arduino da çalıştırmıştım sorun bir şekilde. Ancak stm32 ye geçtiğimde böyle bir problemle karşılaştım. Standart kütüphaneleri kullanırken çiple hiç haberleşememiştim. Elimde LIS3DH çipi de var onunla sorunsuz haberleşebiliyorum ancak bana gyro da lazım. Bu dökümanı inceleyeyim birde.

cmd[0]=0x30;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD,FIFO_CTRL, 1, cmd,1,0x100);

cmd[0]=0xB3;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD, INT1_CTRL, 1, cmd,1,0x100);

cmd[0]=0x2A;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD, INT_GEN_CFG_XL, 1, cmd,1,0x100);

cmd[0]=0x2A;
  HAL_I2C_Mem_Write(&hi2c1, IMU_ADD, INT_GEN_CFG_G, 1, cmd,1,0x100);