MPU6050 I2C Problemi

Başlatan ogy, 21 Mayıs 2016, 13:43:08

ogy

Merhaba,

STM32F103C8 ile MPU6050 kontrol etmeye çalışıyorum.Mikroc Pro For ARM derleyici kullanıyorum.Proje dosyasının linkini aşağıda verdim.Problem şu;
debug ettiğim zaman program "MPU_IMU_I2C.c" dosyasında bulunan "I2C2_Write(s_addr, reg_Data, 2 , END_MODE_RESTART);" satırına geldiğinde yani ilk i2c yazma komutunda kilitleniyor.Bu satırı aşamıyorum.Bununla ilgili çözüm önerisi olan var mı?

http://s4.dosya.tc/server/c2ky04/Gyro_Test.rar.html

Cemre.

MikroC ile ilgili birşey söyleyemeyeceğim ancak bağlantı hatası yapmadığınızdan emin olmanız gerekiyor. Pull-up dirençlerini bağladınız değil mi?

Bir de madem başlangıç aşamasındasınız, zamanında şöyle bir şey paylaşmıştım, yardımcı olur eminim.
https://maviled.wordpress.com/2016/02/17/cubemx-ile-i2c-projesi/

cripple

void MPU_I2C_Write(unsigned char s_addr, unsigned char r_addr, unsigned char len, unsigned char *dat) {
  unsigned int i;
  reg_data[0] = s_addr;
  reg_data[1] = 0xFE;
  I2C2_Start();
  I2C2_Write(s_addr, reg_Data, 2 , END_MODE_RESTART);
  for (i = 0 ; i < len ; i++)
      {
       I2C2_Write(r_addr, *dat++, len , END_MODE_STOP);
       reg_data[1] = 0xFE;
      }
  //I2C1_Stop();                       // issue I2C stop signal
}


Benim gördüğüm
reg_data[0] = s_addr;
 reg_data[1] = 0xFE;
 I2C2_Write(s_addr, reg_Data, 2 , END_MODE_RESTART);

her gönderdiğin datadan sonra birde 0xFE gönderiyor
oradaki 2 yi 1 yapıp regdata dizisini gönderme sadece s_addr değişkenini göndermeyi denermisin bakalım ne olacak.
I2C2_Write(s_addr, s_addr, 1 , END_MODE_RESTART);

mpu6050 0xFE datasına nasıl tepki verecek belli değil ondan takılıyo olabilir

ogy

@Cemre. pull-up dirençleri mpu6050 bordunun üzerinden var 4.7k olarak.Aşağıdaki ürünü kullanıyorum.

http://www.robimek.com/wp-content/uploads/mpu6050.jpg

Bendeki kartta pull-up dirençleri 4k7 fakat bazı kartlarda 2.2k yada 10k olduğunu gördüm.2k2 denedim olmadı.10k deneyeceğim.Acaba bununla alakası olabilir mi?

@cripple dediğiniz şekilde daha önce denemiştim.Şimdi tekrar denedim yine o satırda kilitleniyor program.Anlamadığım şey datayı göndermiyorsa o satırda neden kilitleniyor? Orayı aşıp devam etmesi gerekmez mi?

cripple

i2c de gönderilen her data için karşıdan alındı biti(ACK) beklenir sorun burada yaşanıyor.
Sensöre anlayacağı bir data lazımki alındı diye cevap versin işlemcide bu bitin gelmesini beklemesin

Cemre.

#5
Alıntı yapılan: ogy - 22 Mayıs 2016, 14:15:56
@Cemre. pull-up dirençleri mpu6050 bordunun üzerinden var 4.7k olarak.Aşağıdaki ürünü kullanıyorum.

http://www.robimek.com/wp-content/uploads/mpu6050.jpg

Bendeki kartta pull-up dirençleri 4k7 fakat bazı kartlarda 2.2k yada 10k olduğunu gördüm.2k2 denedim olmadı.10k deneyeceğim.Acaba bununla alakası olabilir mi?

@cripple dediğiniz şekilde daha önce denemiştim.Şimdi tekrar denedim yine o satırda kilitleniyor program.Anlamadığım şey datayı göndermiyorsa o satırda neden kilitleniyor? Orayı aşıp devam etmesi gerekmez mi?

Pek direnç değeri ile ilgili bir sorunmuş gibi durmuyor.

https://www.picproje.org/index.php/topic,62384.msg483235.html Şu konuya bir bakar mısınız?

Adres olarak 0x68 Kullanıyorsanız bir de onu bir bit sola kaydırıp dener misiniz. Yani 0xD0 olarak?

selimkoc

Mikroc I2C habaerleşmede oku/yaz bitini (0.bit) kendisi ayarlıyor. Dolayısı ile 0.bit kullanılmıyor. Adresi 1 bit sağa kaydırmak gerekiyor.

ogy

@Cemre. ve @selimkoc hocam ben adres olarak zaten 0xD0 kullanıyordum. 0x68 yapınca düzeldi.Şimdi okuma kısmıyla uğraşıyorum.Bir sorun olursa tekrar burdan sorarım.