Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

I2C kilitleniyor.

Başlatan tekosis, 20 Şubat 2018, 03:20:20

tekosis

Selamün aleyküm ustalarım. Aşağıda ilgili kısmını verdiğim şemada mcu + tuş takımı + ivme ölçer görülüyor. Devrede tuş takımı kullanılmıyorken I2C ile ivme ölçerden aldığım açı bilgilerini devrenin ekranında rahatlıkla görebiliyorum. Ancak herhangi bir anda X1 sütununa bağlı bir tuşa basıp bıraktığımda Y1, Y2 ve Y3 satırlarına bağlı pull-down dirençlerinden dolayı SDA hattı "0" oluyor mcu - ivme ölçer arası iletişim duruyor.

Bu iletişimi yeniden başlatmak için ne yapabilirim?

Notlar ve denediğim bazı yöntemler;
1 -  Tuş takımı matris tarama şeklinde ama deneme programımda herhangi bir tarama işlemi yapılmıyor, tuş takımı yazılımsal olarak pasif.

2 -  Mevcut şemayı değiştirme şansım yok diyebilirim. Haliyle donanımsal resetleme yapamayacağım.

3 - Lojik analizör ile SCL ve SDA hattını izliyorum, butona basıldıktan sonra tüm haberleşme duruyor. ne clock palsi gidiyor nede data. SDA ve SCL "1" konumunda kalıyor.

4 -  Birden fazla defa I2C1_INIT(); işlemi programı kilitliyor.

5 -  Analog Device'nin aşağıdaki uygulama notunda çözüm 1 de anlatılan sistemi denedim ya ben beceremedim yada bu sistem işimi görmeyecek.
http://www.analog.com/media/en/technical-documentation/application-notes/54305147357414AN686_0.pdf

6 - Mcu olarak stm32f407, ide olarak mikroc pro for arm kullanıyorum.


İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

OptimusPrime

tus takimida cok pis bir yerde.  :o belkide olabilecek en kotu yer.  8-)

i2c modulunun kendi kendini kurtarma gibi bir ozelligi varsa koutuphanesinde tanimlidir. degilse datasheette bakip nasil kurtarilabilir bakmak lazim. verdigin uygulama notunu uygulayabilmen icin pini cikis yapip saat darbesini gondermen lazim sonra dur demen lazim vs vs.

asagida bir link var bir de buraya goz at istersen.

https://community.st.com/thread/35884-cant-reset-i2c-in-stm32f407-to-release-i2c-lines
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

RaMu

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Elektroemre

@tekosis hocam, STM32F407'de bol bol pin vardır, 2 pin için böyle bir iş yapmazdım. Harcadığınız vakte yazık.

tekosis

Ustalarım cevaplar için teșekkür ederim. Cihaz için yeni kart tasarımı yapmak istemiyorum, yazılımla kurtarmaya çalışıyorum. Benim durumumda problem mcu'nun I2C donanımında ise işi yazılımsal I2C ye çevirebilirim. Sorun sensör kaynaklı ise bunu yazılımla resetlemek istiyorum. Sanırım bu durumla karşılaşan pek olmadı.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

RaMu

"Bodge" ~=Yama yaparsın belki diye düşündüm.
Yazılım ile düzelebilir belki ama
tasarımı niye böyle yaptığını bende merak etmiyor değilim.


I2C aktif olsa dahi SCL SDA pinleri
standart PORT komutları ile 1-0 yapılabilir belki,
bunu deneyip Logic analizor ile bakabilir misin?


Birde ADXL entegresi olmadan aynı şeyleri deneyebilirsin,
problem MCU da muhtemelen ama yinede denemek lazım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

baran123

Eğer hatayı bulmak istiyorsan Tilen'in I2C kütüphanesini dene.
Kilitlenmenin bir sebebi yazılım, ikincisi ise hıza göre kullandığın direnç değerleri.
Hazır bir kütüphane ile hata bir şey bağlamadan RaMu hocamın dediği gibi logic analyzer ile bak. I2C Frame'ini görüyorsan tamamdır.(Pull Up olsun)
Eğer çalışırsa donanımlarını ekle ve tekrar test yap.
Çalışırsa sorun yazılım, çalışmaz ise donanım:)

tekosis

@RaMu hocam, devre zamanında bir geliştirme bordunun(mikromedia plus) temelinde, yan bileşenler ve shield gibi bir kart ile eklemeler yapılarak kuruldu. Bu bordun üzerinde daha önceden kullanmadığımız, ihtiyacımız olacağını düşünmediğimiz adxl345 te mevcut.  Bundan dolayıdır ki daha önce tuş takımını bu hattın üzerindeki I/O pinlerine bağlamakta bir beis görmemiştim. Tabi üzerinden zaman geçti, cihazın iyice oturdu, kullanılıyor. Şimdi istenen bir ek özellik için mevcut yapıyı bozmadan, ilave kart tasarımı yapmadan bu işi kurtarmaya çalışıyorum. Geliştirme bordunun üzerine böyle bir işlem yapamam. Hadi bir kartta yaptım çalıştı diyeyim üretime geçirmek sıkıntı.

Dün gece yaptığım testleri lojik analizör ile takip ettim. Normalde uzun süreli testte sorunsuz çalışan sistem tuş takımına bastığım anda anlattığım gibi donuyor. SDA ve SCL high konumunda takılıyor.

Alıntı yapılan: RaMu - 20 Şubat 2018, 18:10:05
I2C aktif olsa dahi SCL SDA pinleri standart PORT komutları ile 1-0 yapılabilir belki, bunu deneyip Logic analizor ile bakabilir misin?


Bunu da denedim. Bu şekilde düzeleceğini umut ediyorum ama kodlarımı daha dikkatli incelemem lazım.
pin_SDA=1;	pin_SCL=1;
	for(İ=0;İ<9;İ++)   //forum sayfasında fazla yer tutmasın diye kodları yan yana yazıyorum.
	{
	pin_SCL=0;	delay_us(5);
	pin_SCL=1;	delay_us(5);
		}  
	pin_SDA=0;	pin_SCL=0;       delay_us(10); 	
	pin_SCL=1 ; 	delay_us(10);	pin_SDA=1;

@baran123  @baran123 hocam, mikroc pro for arm içinde bir software I2C kütüphanesi mevcut. Önce onu kullanıp tuş takımı ile aynı müdahaleyi yapmayı düşünüyorum. Eğer sorunsuz tekrar çalışırsa  sıkıntım mcu tarafında, yine çalışmaz ise sensör engegresindedir diye düşüneceğim. sanırım sen de bunu anlatmak istedin :)
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

OptimusPrime

Bu kadar uzatmadanda sikinti kimde bulabilirsin sadece butondan tetikleme alip scope ile hatti izleyeceksin. Master veya slave de n biri cevap vermeyi kesecek.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

RaMu

SDA SCL yi halen 1-0 yapabiliyorsan
şöyle bir yöntem ile i2c kilitlenmesini aşanlar olmuş:
Alıntı Yap

> disable I2C
> change sda & scl pin mode to output
> generate 9 stop bits
> change sda & scl pin mode back to alternate function
> set SWRST flag in i2c control register
> then enable i2c and initialize it

>i2c pasif yap
>SDA SCL pinlerini çıkış yap
>9 Stop biti gönder
>SDA SCL pinlerini yeniden i2c olarak ata
>i2c Control register ındaki SWRST bayrağını SET et
>i2c yi aktifleştir ve kur


Kaynak:
https://community.st.com/thread/35884-cant-reset-i2c-in-stm32f407-to-release-i2c-lines  son mesaj
HAL kütüphanesi için örnek kod:
https://electronics.stackexchange.com/questions/267972/i2c-busy-flag-strange-behaviour/281046#281046



Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

tekosis

@RaMu hocam, dediğiniz yöntemi zaten denedim ama bir yerlerde yanlış yaptığımı düşünüyorum. Sakin kafa ile soft I2C kütüphanesini kullanarak yeniden deneyeceğim.


@OptimusPrime dediğini yaptım, bu arada program I2C1_Read(); fonksiyonundan dönmüyor, haberleşmeyi kesen adxl345 gibi duruyor. Sakin kafayla o noktaya odaklanacağım.

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

OptimusPrime

I2C1_Read den geri donmemesi tam olarak slave sapitmis anlamina gelmiyor cunki master yazdiktan sonra da okuyabilir veya master sadece slave i de bekliyor olabilir. o yuzden diyorum scope ile bak diye. nokta atisi yaparsin. vatandasin biri cevap vermeyi kesiyor ama kim.

mesela: master slave adresine yazarken cakiliyor olabilir veya slave ack gondermiyor olabilir. haliyle bu iki durumdada read geri donemez. dolayisi ile read geri donmuyor diye sorun slave diyemeyiz.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Elektroemre

Hocam sorunu çözebildiniz mi? Şöyle alternatif bir çözüm geldi aklıma, hazır I2C varken,  I2C üzerinden çalışan bir IO entegresi (i2c shift register) bağlasanız, butonları onun üzerinden okusanız?

DIP kılıf entegre ve biraz el işçiliği ile çözülebilir.


eti

şemada görünen 3 adet 1k direnci butona basılsa bile I2C yi etkilemeyecek kadar yükseltirseniz sorun kalmaz gibi mesela 100k gibi. 100k giriş portunu butona basılmadığında low da tutmaya yeter. butona basıldığında da ı2c hattını etkilemeden ilgili porta lojik 1 sağlar.
aksi taktirde vatandaş butona sürekli basarsa 1k üzerinden I2c hattı low da kalır.

tekosis

@Elektroemre sorun çözüldü. sorun sensörün kendi içinde açı okumayı durdurması.
@OptimusPrime cihazın çalışmasını lojik analizör ile izledim. çalışmanın durmuş gibi göründüğü sırada mcu ve sensör çalışmaya devam ediyor. Aslında tüm sinyaller doğru olarak gelip gidiyor ama sensör her zaman aynı değeri dönderiyor. yani haberleşmede sıkıntı yok, butona basıldığında adxl345 bir şekilde açı okumayı bırakıyor, sürekli aynı değeri dönderiyor.

@RaMu eğer sensör üst üste 50 defa aynı değeri dönderirse yazılımda sensörün kilitlendiğini kabul ederek 9 defa STOP kodu ve arkasından bir adxl345_Init(); rutini çalıştırıyorum tekrar çalışmaya başlıyor.

Cevaplar ve yorumlarınız için teşekkür ederim.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.