HAL lib. ile birlikte Standard peripheral library

Başlatan Gökhan BEKEN, 05 Mart 2015, 14:49:48

muhittin_kaplan

Ben nezaman i2c calismasi yapsam beceremedim std ile, gittim register seviyesi kodladim.
Hata bende de olabilir.

quarko

Yapılan şeyler aynı aslında. Ama problem olmaması lazım. Büyük bir ihtimalle stm32 lerin i2c birimlerinde bug var. Ve hal ile bunu çözmüşler. O kadar. Araştırma yaparken, bu tarz sorunla karşılaşanlara çok denk geldim. Genelde de bu busy flag sorunu. Errata sheet lerde bununla alakalı bir prosedür bile var.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

mr.engineer

#17
Alıntı yapılan: okg - 09 Temmuz 2017, 16:41:19hocam ben arada yanlışlıkla çalıştırabiliyorum  ;D

Merhaba,
Şu anda ben de spl (standart perip. lib.) kullanarak I2C çalıştırmaya çalışıyorum. Simülasyonu proteus üzerinden deniyorum. Kodu kendim yazdım, hazır kodlar kullandım fakat bir türlü olmadı. İnternette araştırırken yorumlarınızı gördüm. Elinizde hazır kod varsa paylaşır mısınız?

Alıntı yapılan: muhittin_kaplan - 09 Temmuz 2017, 20:35:12Ben nezaman i2c calismasi yapsam beceremedim std ile, gittim register seviyesi kodladim.
Hata bende de olabilir.

Register seviyesinde ben de denedim ama başarılı olamadım. Elinizde hazır bir kod varsa siz de paylaşır mısınız?

Teşekkürler.

ibocakir

Şu dersi izleyerek I2C registerlarına erişerek kodunuzu yazabilirsiniz:

https://www.udemy.com/course/embedded-systems-bare-metal-programming/

I2C'nin tam anlamda nasıl çalıştığını anlamak için ise şu dersi önerebilirim:

https://www.udemy.com/course/mastering-microcontroller-with-peripheral-driver-development/

mr.engineer

Alıntı yapılan: ibocakir - 12 Ocak 2020, 00:12:19Şu dersi izleyerek I2C registerlarına erişerek kodunuzu yazabilirsiniz:

https://www.udemy.com/course/embedded-systems-bare-metal-programming/

I2C'nin tam anlamda nasıl çalıştığını anlamak için ise şu dersi önerebilirim:

https://www.udemy.com/course/mastering-microcontroller-with-peripheral-driver-development/

Teşekkürler ama bunun için  bu kadar para vermeye gerek yok. Zaten nasıl çalıştığını anladım biliyorum. Dediğim gibi kendim de yazdım hazır kodları da kullandım fakat olmadı. Bu konuda da yazanlar olmuş I2C'de sıkıntı var diye. O yüzden çalışır bir kod arıyorum veya kendi kodumu da paylaşabilirim.

Kendi kodumdaki sıkıntıyı da yazayım. Start generation yaptıktan sonra gördüğüm kadarıyla start bit set edilmiyor. Yani en baştan hata alıyorum. Aşağıda kodun bir parçasını paylaşıyorum. Son döngüde sonsuz loop'a giriyor.




    // Wait until I2Cx is not busy anymore
    while (I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
      
    // Generate start condition
    I2C_GenerateSTART(I2Cx, ENABLE);

    while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));


muhittin_kaplan


Yuunus

Kutuphane yerine dogrudan registerler lara bakin.

mr.engineer

Alıntı yapılan: digiman - 12 Ocak 2020, 18:49:23Kutuphane yerine dogrudan registerler lara bakin.

Denedim, fakat olmadı ne yapsam aynı yerde hata alıyorum. Start condition verdikten sonra start bit set edilmiyor. Sanki I2C peripheral hiç açılmıyor gibi bir durumla karşılaşıyorum.

mr.engineer

Alıntı yapılan: muhittin_kaplan - 12 Ocak 2020, 18:48:27HAL ile örnek yapmıştım bir ara
https://www.youtube.com/watch?v=C12m2lpSHqc
https://yadi.sk/d/XZaPISO13At8PN

Teşekkürler. CubeMx düzgün çalışmadığı için silmiştim. Tekrar yükleyip bir de ordan deneyeceğim. Açıkcası Cubbemx'i hiç sevmiyorum ama deneyeceğim.
 

HAKKITANIR

#25
kullandığınız kütüphaneyi bilmiyorum.
yalnız I2C standartlaşmış bir seri haberleşme olduğundan, aşağıdaki toplam 7 fonksiyonla haberleşme sağlanıyordur diyebilirim.
sizin kütüphane içerisinde altdaki fonksiyonların hepsi eksiksiz olarak tanımlanmış mı?
sizin kütüphanedeki yazımları tam olarak böyle olmayabilir, ama bunlara benzer yazımda olmalı ve işlevleri aynı bunlar gibi olmalı diyebilirim.
Bu fonksiyonların içerisinde de bir kaç satır I2C registerleri ve while(x) gibi bekleme döngüsü olmalı.
Ben sizin kütüphanenizi kullanmadığımdan fonksiyon içlerindeki register kod satırlarını burada karışıklık olmasın diye göstermedim.

Sizdeki I2C fonksiyonlarını ve bu fonksiyonların içerisindeki register / wehile(x) yazım kodlarını görebilirsek belki daha fazla yardımcı olunabilir.

StartI2C_(void);
StopI2C_(void);
AckI2C_(void);
NotAckI2C_(void);
RestartI2C_(void);         
MasterWriteI2C_(unsigned char data_out);
MasterReadI2C_(void);

Bunların dışında Main içerisinde I2C baudrate ve control register ayarları gerektiği gibi yapılması gerekir.

Bunların haricinde gerisi sadece okuma ve yazma rutin kodları şeklinde ve okuduğunuzu atayacağınız sizin tanımladığınız bir değişken kullanımı halinde olması yeterli olmalı diye düşünüyorum.
Okuma yazma işlemleri mikroişlemci ile haberleşme yapacağınız çipin özelliklerine göre değişebilir.
Bu kısım haberleşilecek çipe göre değiştiğinden while(1) içerisindeki kullanıcı kodlarınıda henüz değinmedim.

Siz öncelikle I2C kütüphane içerisinde yukarıdaki kontrol fonksiyonlarını ve bu fonksiyonların içerisindeki kod-komut bloklarını görebiliyor musunuz? Açıkça görülüyorsa sonuca ulaşılması daha kolay olacaktır.
Daha farklı bir C kütüphanesinde CAN SPI ve I2C kütüphanesi vardı. Ama içerisindeki fonksiyon ve bunların açılımlarına ulaşılamıyordu.
Sizdeki kütüphanede  her şey açıkça yazılıdır umarım. Yazılıysa çözüm çok zor olmasa gerek.

genelde en çok yapılan hatayı yukarıdaki fonksiyon içlerinde bulunan while(x) ile beklenilmesi gereken kısımlar oluyor.
bu uygulanmadığında sürekli sağlıklı bağlantı ya kurulamıyor yada kopuk bir şekilde kurulabiliyor. olarak gördüm ben.