Linux altında I2C bir aygıta erişmek

Eğer veri alış verişi yoksa, SDA ve SCL nin high olması lazım. İkisi de normalde (boşta iken) low ise, burada bir sorun var.

I2C sinyallerinin olduğu Sitara padlerinin "open drain" ve "pull up" olarak yapılandırılması lazım. Sorun bu olabilir. Bu yapılandırma da kernel kodunun içinde yapılıyor. Spesifik olarak "device tree" denen bölümde. Sizin kernel'ci elemanın bunlara bakması ve padlerin doğru yapılandırıldığından emin olması lazım.

Şu anda olan şudur: Sen i2cget komutunu çalıştırıyorsun, Sitara içindeki I2C kontolörü bus'a bakıyor ve her iki sinyal de high değil. Buradan, bus'ta başka bir aygıtın haberleşme yaptığını, yani bus'ın meşgul olduğunu değerlendiriyor ve hiç müdahale etmeden geri çekiliyor. i2cget'e da durumu bir hata olarak bildiriyor.
 
Kernel kodu ile uğraşan arkadaşla device tree tanımlamalarını inceliyoruz ama hala net bir sonuca ulaşamadık.x86 mimarilerinde tecrübesi var onun, ARM'a o da yeni başlıyor.

Şöyle bir mantık yürütüyoruz ama doğru mudur emin değlim.Eğer ilgili PAD open drain olmasaydı,i2c kontroller zaten o pad'i high yapmış olması lazımdı.i2c kontroller o pad'i high yaptığı halde pad high olmuyorsa,ozaman o pad open draindir, ama pull up direnci yoktur.Oraya yanlışlıkla pull down tanımlanmış olabilir.Bu söylediklerim saçma mı yoksa mantıklı bir tarafı var mı?

Bu arada sizi de uğraştırıp duruyoruz, kusura bakmayın.
 
Son düzenleme:
Kernel kodu ile uğraşan arkadaşla device tree tanımlamalarını inceliyoruz ama hala net bir sonuca ulaşamadık.x86 mimarilerinde tecrübesi var onun, ARM'a o da yeni başlıyor.

Zaten ARM'ın en gıcık tarafı o device tree olayı. Adeta ayrı bir bilim dalı. Ama gösteriğiniz çabaya bakıyorum da, hakikaten takdir edilecek birşey. Device tree olayını kaptıktan sonra ARM'de kernel programlama x86'dan farklı değil.

Şöyle bir mantık yürütüyoruz ama doğru mudur emin değlim.Eğer ilgili PAD open drain olmasaydı,i2c kontroller zaten o pad'i high yapmış olması lazımdı.i2c kontroller o pad'i high yaptığı halde pad high olmuyorsa,ozaman o pad open draindir, ama pull up direnci yoktur.Oraya yanlışlıkla pull down tanımlanmış olabilir.Bu söylediklerim saçma mı yoksa mantıklı bir tarafı var mı?

Yani evet, eğer o pad'ler normal output olarak yapılandırıldıysa, dediğiniz gibi i2c kontrolör o padleri set etmiş olması lazımdı. Ama eğer siz zaten default olarak I2C_1 olarak kullanılan PAD'lere bağladıysanız PMIC'i, ve device tree'yi de kurcalamadıysanız, o padlerin doğru bir şekilde open drain, pull up olması lazımdı.

Benim kullandığım ARM, sizinkinden çok farklı. Ben NXP nin iMX6 ultralight çipini kullanıyorum, sizinki TI'ın Sitara işlemcisi ve karmaşık bir işlemci. O yüzden direkt olarak benim I2C tanımlamalarının işinize yarayacağını zannetmiyorum. Ama şunu bir deneyin:

Eğer yanlışlıkla o pad'ler pull down olarak tanımlandıysa, Sitara'nın kendi pull resistörleri nispeten zayıftır. SCL ve SDA'ya 2.2 KΩ luk bir pull up bağlayın ve öyle deneyin bakalım. O 2.2 KΩ luk pull-up, Sitara'nın pull down'unu yenecektir ve o pad gerçekten open drain ise çalışmaya başlayabilir.

Bu arada sizi de uğraştırıp duruyoruz, kusura bakmayın.

Beni uğraştırmaya devam edin ;). Zaten beni uğraştırın diye bu forumu oluşturdum. İşi öğrenin, başkaları da sizi uğraştırsın, amaç bu.
 
Benim üzerinde çalıştığım iMX6 ultralight'in device tree'deki i2c tanım bölümünü gene de koyayım. En azından sizin device tree'de nerelere bakmanız gerektiği konusunda ipucu verebilir.

Kod:
&iomuxc {

       /* önceki gereksiz bölümler çıkarıldı */

        pinctrl_i2c1: i2c1grp {
            fsl,pins = <
                MX6UL_PAD_UART4_TX_DATA__I2C1_SCL    0x4001b8b0
                MX6UL_PAD_UART4_RX_DATA__I2C1_SDA    0x4001b8b0
            >;
        };

        pinctrl_i2c2: i2c2grp {
            fsl,pins = <
                MX6UL_PAD_UART5_TX_DATA__I2C2_SCL    0x4001b8b0
                MX6UL_PAD_UART5_RX_DATA__I2C2_SDA    0x4001b8b0
            >;
        };

       /* sonraki gereksiz bölümler çıkarıldı */
};


Sitara'nın reference manual'ına bakın, orada IOMUXC diye bir bölüm olacak. O bölümde, her PAD için 32 bitlik configuration register var. Sizin PAD'i orada bulun ve nasıl yapılandırılacağını anlamaya çalışın.
 
SDA ve SCL hatlarına 1.8 KOhm pullup bağladıktan sonra i2cget çalıştı! Hem okunabilen hem yazılabilen bir register'e veri yazdık ve geri okuyunca aynı değeri okuduk.Çok teşekkürler! Sorunun pad yapılandırmasından kaynaklandığı kesinleşti.Bunu dev,ce tree ile çözmeye çalışacağız.
 

Forum istatistikleri

Konular
5,654
Mesajlar
97,282
Üyeler
2,438
Son üye
İbrahimSönmez

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top