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. I[SUP]2[/SUP]C 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 I[SUP]2[/SUP]C bus'ın kapasitif etkilerini iyi kontrol altına almışsan belki 400 kHz frekans da kullanabilirsin. Bu durumda süre 250 [CHAR]micro[/CHAR]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 I[SUP]2[/SUP]C 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
7,730
Mesajlar
128,682
Üyeler
3,121
Son üye
aoy

Son kaynaklar

Son profil mesajları

Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
az bilgili çok meraklı
Back
Top