I2C birden fazla slave haberleşmek

turkuazaga

Üye
Katılım
23 Aralık 2018
Mesajlar
58
Bir i2c master ve 3 i2c slave olan bir devrem var.Slave resetten çıktıktan sonra belli bir süre içinde bir i2c veri yazılması gerekiyor.3 slave için vu yazmayı yapabilmek için bir START gönderip her üç slave aygıta peş peşe veriyi yazmayı düşünüyorum ama çalışacağından emin değilim.Logik analyzeri bağlamadan bir sorayım dedim.Sitara AM 3351 işlemci ve gömülü linux kullanıyorum.
 
Master ve slave cihazların haberleşme protokollerini siz hazırlayacaksanız istediğiniz gibi çalışabilirsiniz. Yapacağınız iş hususunda bir kısıtlama yok.
Yazınızdan anladığım kadarı ile siz masterden emir gelmeden slave cihazın veri yazmasını istiyorsunuz ki bu mümkün. Slave cihaz resetten sonra hattı dinler, konuşma yoksa kendi verisini hatta yükler master cihaz da bu bilgiyi çeker.
 
Yanıt için teşekkürler ama tam ifade edemedim herhalde.Üç slave aygıtın reset hattı ortak ve hepsi aynı anda resetten çıkıyor.Çıktıkları anda da geri sayım başlıyor çok kısa sürede her birisine en az bir byt yazmam gerekiyor.O yüzden STOP göndermeden bütün slavelere en kısa sürede yazabilmem gerekiyor.Yani slave1'e (adresi x) yaz,slave2^ye (adresi y) yaz,slave3'e (adresi z) yaz gibi.
 
Yani master her bir cihaza ayrı ayrı mesaj paketini standart bir şekilde yazarsa fazla süre mi geçmiş oluyor?
 
Yani master her bir cihaza ayrı ayrı mesaj paketini standart bir şekilde yazarsa fazla süre mi geçmiş oluyor?
Aynen.İzin verilen süre çok kısa o yüzden tek hamlede üç slave'e veri yazmam lazım.Süre aşılırsa slave yanlış moda giriyor ve sistem çalışmıyor.
 
Diyelim ki birinci cihazın adresini yazdınız, birinci cihaz ack sinyali yolladı, sonra ikinci cihazın adresini yolladınız o da ack yollasın sonra aynı işlemi 3. cihaz için yapayım diyorsunuz sanırım. Bu sayede tüm cihazlar beklemede kalacak. ikinci aşamada 1. cihazın register adresini ve dataları yollayıp onunla işi bitireceksiniz sonra ikinci ve en son üçüncü cihaz için bunu yapacaksınız şimdi doğru anlamış mıyım? Eğer böyle ise aynı register adreslerine sahip olan cihazlarda çakışma olacaktır.
 
Slave aygıtlar 3 adet cirrus DAC.Yapılandırmak için I2C üzerinden 8 byt gönderilmesi gerekiyor.Ama her 3 DACa sırayla 8 byte yazarsam çok uzun sürüyor ve sınırı aşıyorum.Onun yerine her 3 DACa sırayla 1 byte yazayım diyorum geri kalan yapılandırma bilgilerini sonra rahat rahat yazarım.Yanı:

START --- DAC1 byte yaz --- RE-START --- DAC2 1 byte yaz --- RE-START --- DAC3 1 byte yaz
 
I2C standardı bu konuda bir kısıtlama getirmiyor, olması lazım. Benim üzerinde çalıştığım devrede iki tane PMIC var bus üzerinde bir deneyeyim bakalım nasıl olacak.
 
Diyelim ki sizin dediğiniz şekilde 3 slave cihaz kendi adreslerini aldı ve hazır duruma geçti, master üç adet ID bilgisi göndermeyi tamamlayınca register adresini gönderirken üç alıcı cihaz da aynı adreste registerlere sahipse, hepsi de aynı anda kendi verisini hatta basar diye tahmin ediyorum.
 
Diyelim ki sizin dediğiniz şekilde 3 slave cihaz kendi adreslerini aldı ve hazır duruma geçti, master üç adet ID bilgisi göndermeyi tamamlayınca register adresini gönderirken üç alıcı cihaz da aynı adreste registerlere sahipse, hepsi de aynı anda kendi verisini hatta basar diye tahmin ediyorum.
Aygıtların i2c adresleri birbirinden farklı.Okuma da yapılmayacak sadece yazma yapılması gerekiyor.4 ms içerisinde 3 dac'a yazma yapmam gerekli
 
Biraz önce denedim bu şekilde peş peşe göndermeyi. I2C frekansı 100 kHz ve slave adresleri 48H, 49H, 4AH. Data olarak da her birisine 02H 10H yazıyorum. Osiloskop protokol çözümlemesinde üç slave'in de veriyi aldığını (ACK'ladığını) görüyoruz. Geçen toplam süre de 1 ms gibi.

Ama buradan bu metodun genel olarak çalıştığını söyleyemeyiz. Benim devredeki PMIC'lerde çalışıyor, ama senin DAC'larında çalışmayabilir. Deneyip sonucu bildirebilirsen başkalarına da faydalı olur.

a.png
 
Eğer kullanılan I2C bus'ın kapasitif etkilerini iyi kontrol altına almışsan belki 400 kHz frekans da kullanabilirsin. Bu durumda süre 250 µs lere iner.
 
Yalnız bir de şu faktör var. Linux işletim sistemi kullandığın için işlemcinin gerçek zamanlı olarak, bütün veriler gönderilene kadar I2C trafiği ile ilgileneceğinin bir garantisi yok. Mesela 528 MHz ile çalışan bendeki NXP UltraLight işlemcisi ile yukarıdaki denemede 1 ms de iş bitmiş iken, defalarca denediğim zaman bir keresinde işlem 1.6 ms de bitti. Eğer senin kullandığın işlemcinin performansı daha düşük ise veya bir şekilde fazla yük altında ise, bu süreler uzayacaktır ve belirsizlik artacaktır.

Eğer süre çok kritik ise o zaman en garanti yol bir MCU nun bunları resetlemesi. Yoksa linux'ta 4 ms lik bir garanti elde etmek için baya bir takla atman lazım ve belki de kernel kaynak kodunun sağında solunda bir sürü değişiklik yapman lazım.
 

Forum istatistikleri

Konular
5,847
Mesajlar
99,735
Üyeler
2,482
Son üye
ilker29

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
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)
Back
Top