I2C Haberleşme Hattını Nasıl Uzatırız?

Başlatan HAKKITANIR, 28 Kasım 2017, 12:53:30

HAKKITANIR

Pic Mikro işlemci ile bir çipi, I2C haberleştirmeli, aralarında yarım metre uzunluğunda kablo ile rahatça kullanabiliyoruz.
Haberleşme frekansını 100 ve 400 kHz. her ikisini de kullanabiliyoruz.
Mikroişlemci ile diğer çip arasındaki mesafeyi 1 metre uzattığımızda sorun oluşmaya başlıyor.
Bu sorun her iki 100 ve 400 kHz. haberleşme frekansı içinde oluyor.
Bunu net olarak gözlemleyebiliyoruz. Kısa mesafeli kablo ile sorun yok. Kablo uzatılınca sorunlar başlıyor.
Çözüm için ne tavsiye edersiniz.


makdeniz

Merhaba aşağıdaki pdf'i incelerseniz sorularınızın cevaplarını bulabilirsiniz.

Hızlı olan cevaplar :)


https://www.nxp.com/docs/en/data-sheet/P82B715.pdf

Karanlık olmadan aydınlık, Ölüm olmadan yaşam mantıksız.

JOKERAS

Bu sorun Data-Clock hatlarındaki Salınımdan kaynaklı.I2C yapısı uzun mesafeler için uygun değil.
Durumu biraz düzeltmek için R-Pull-Up dirençlerinin değerlerini düşürün.Mesela R-Pull-Up 10K ise 4.7k yapıp deneyin.
Kablo kalitesi de önemli.
Mesafe uzadıkça hızı düşürmek gerekir.


Yazdığınız Kod nasıldır bilmiyorum.Blokeli kod yazarsanız hatasız veri tranceiveri yaparsınız.
I2C sisteminde kontrol daima Masterde'dır.Slave cihaz kendi başına hiç bir iş yapamaz.
Eğerki Master,Slave'e gönderdiği komutları belli bir zaman ve kurala göre gönderir,ve belli bir zaman ve kurallara
göre almak icab ederse yazılımı o'na göre konfigre etmek gerekir.




Mesela Master Slave gönderdiği her Byte karşılığında Slave'in Ack cevabını Almak için bir Bloke döngüsü kurarsanız.
Ack gelene kadar sorgu atmış olursunuz.
Ack gelmişse Master'in gönderdiği Data düzgün gitmiş demektir vs.
Slave'in gönderdiklerini Almak içinde aynı tip bir algoritma kurmak gerekir.
Slave'in gönderdiği Data doğrumu?Doğruluğunu nasıl anlayacağız?
İşin Belirsiz olan kısmı bu.Slave kendinden istenen veriyi doğru gönderir fakat veri,veri yolunda
bozgun yemişse ne yapmak gerekir?


Clock hattını dinlemek,Clock'un zamanında High-Low olduğunu kontrol etmek
eğerki bir problem varsa Clock'u Strech yapmak(Lastik bigi Uzatmak) düzelene kadar beklemek. 









OptimusPrime

3 metreye kadar uzatmisligim var :)
kablo cok oncemli burda fakat haberlesme hizini dusurmek, her iki tarafa olabildiginde kucuk pull up direcleri eklemek, her iki tarafta 100pf lik kond kullanmak ise yariyor. bunun disinda tabi bu isi uygun guzel entegrelerde var. bahsettigim entegresiz cozum. fluorescent lambaya kabloyu sararak denemistim ki bu sisteme gurultu sokmanin en kolay yontemidir.
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 ||

baran123

#5
Şu dökümanın son kısımları belki fayda sağlar. Edit : Döküman"lar" diyelim.
https://www.nxp.com/docs/en/user-guide/UM10204.pdf
https://www.nxp.com/docs/en/brochure/pca9600_daughter_card.pdf
https://www.nxp.com/docs/en/application-note/AN10658.pdf

Ama I2C harici olarak taşınabilecek yapıya uygun olmayan bir protokol. SPI olsa gene bir nebze fakat konu I2C !
Tüyden etkilenen mız mız bir protokol :)
PCB üzerinde kalması çok daha iyi.
Kartlar arası farklı protokoller ile taşıma yapmak çok daha mantıklı.


Örneğin
I2C->RS485 --------------- RS485->I2C
gibi


hwdesigner


HAKKITANIR

cevaplarınız için teşekkür ederim.

P82B96 ile çok güzel bir şekilde uzay montaj bağlantılı deneme yaptım, aynı sorun devam ediyor.
çok bağlantılı bir çip olsa pcb çizmek öyle denemek şart diyecem ama öyle sade bir çip.
pull up dirençlerinin değerini düşürmekle de sorun çözülmüyor.
100 pF. kondansatör nasıl kullanılıyor. SDA SCL hatlarından ayrı ayrı toprağa mı bağlanıyor kondansatörler.
kablo 4X0,22 mm. çok telli  blendajlı kabloydu.
ACK cevaplaması beklemesi otomatik var programda. strech uzatma olayını bilmiyorum. bunu program normalde yapmıyor sanıyorum.
haberleşme hızı 100 - 400 kHz. her ikisiyle de denense aynı netice alınıyor. normalde 100 kHz. le çalışıyoruz. denemeler açısından 400 'ü denedik.
kısa kabloyla harika çalışıyor en ufak sıkıntı yok. uzun kablolu ve uzun kablo + P82B96 ile aynı sorun devam ediyor.
TXS0102DCUR bundan bir şey anlamadım.
baştan direkt RS485 e girmek zorunda kalmasaydık güzel olurdu.
kısa kablonun çalışmasını sağlasak yeterli olacak bizim için.
çözüm için başka ne yapılabilir.




JOKERAS

Kabloyu Çok telli değil,kaliteli tek Damar kablo kullanın.


Mesela şu elektrik tesistalarında kullanılan 1, 1.5'luk kablolar gibi.
R-Pullup'ların değerini ve haberleşme hızını biraz daha düşürüp deneyin.


Diğer bir yöntem R-Pullup dirençlerini homojen şekilde hatta dağıtın.
Mesela İdeal R-Pullup dirençleri 10K ise Kobloların En baş tarafına 30K, Kobloların Orta Kısmına 30K, Kabloların Son kısmına 30K ideal direnç değerini Hatlara homojen edederek dağıtıp deneyin.











Elektroemre

Alıntı yapılan: HAKKITANIR - 04 Aralık 2017, 14:10:22
cevaplarınız için teşekkür ederim.

P82B96 ile çok güzel bir şekilde uzay montaj bağlantılı deneme yaptım, aynı sorun devam ediyor.
çok bağlantılı bir çip olsa pcb çizmek öyle denemek şart diyecem ama öyle sade bir çip.
pull up dirençlerinin değerini düşürmekle de sorun çözülmüyor.
100 pF. kondansatör nasıl kullanılıyor. SDA SCL hatlarından ayrı ayrı toprağa mı bağlanıyor kondansatörler.
kablo 4X0,22 mm. çok telli  blendajlı kabloydu.
ACK cevaplaması beklemesi otomatik var programda. strech uzatma olayını bilmiyorum. bunu program normalde yapmıyor sanıyorum.
haberleşme hızı 100 - 400 kHz. her ikisiyle de denense aynı netice alınıyor. normalde 100 kHz. le çalışıyoruz. denemeler açısından 400 'ü denedik.
kısa kabloyla harika çalışıyor en ufak sıkıntı yok. uzun kablolu ve uzun kablo + P82B96 ile aynı sorun devam ediyor.
TXS0102DCUR bundan bir şey anlamadım.
baştan direkt RS485 e girmek zorunda kalmasaydık güzel olurdu.
kısa kablonun çalışmasını sağlasak yeterli olacak bizim için.
çözüm için başka ne yapılabilir.

Hocam devrelerin toprakları birbirine bağlı mı?

Cemre.

Alıntı yapılan: JOKERAS - 04 Aralık 2017, 14:25:12
Kabloyu Çok telli değil,kaliteli tek Damar kablo kullanın.


Mesela şu elektrik tesistalarında kullanılan 1, 1.5'luk kablolar gibi.
R-Pullup'ların değerini ve haberleşme hızını biraz daha düşürüp deneyin.


Diğer bir yöntem R-Pullup dirençlerini homojen şekilde hatta dağıtın.
Mesela İdeal R-Pullup dirençleri 10K ise Kobloların En baş tarafına 30K, Kobloların Orta Kısmına 30K, Kabloların Son kısmına 30K ideal direnç değerini Hatlara homojen edederek dağıtıp deneyin.

Bu frekanslarda deri etkisini azaltmak adına çok damarlı kablo kullanmak daha mantıklı değil mi? Gerçi zaten I2C kablo ile taşınmak üzere tasarlanmış bir iletişim altyapısı değil ki... Kart üzeri çevre birimler ile haberleşmek üzere dizayn edilmiş bir protokol ile bu mesafelere çıkmaya çalışmak çok anlamsız. Laboratuvar ortamında sorun çıkartmasa bile yarın sahada sorun çıkartacak bir dizayn.

HAKKITANIR

#11
hızlı, sert, keskin ve çok kıvrılan hareketleri olmasa da kablo bir miktar sürekli nazik hareket halinde.
bu yüzden tek damarlı kablo kullanımı bir yere kadar sınırlı olur diyebilirim. 1, 1,5 mm2 kesitli elektrik tesisatlarındaki NYA tek kalın damarlı kablodan kullanamayız, ama Ethernet kablosu gibi olan daha ince - kibar tek damarlı kabloların, aynı yekpare gövdede 4 tel hatlısı varsa kullanılabilir diye düşünüyorum. yoksa normal Ethernet 8 telli kablonun blendajsız olanın dan da kullanılabilir galiba.

kablonun blendajlı ve blendajın toprağa bağlanması konusu önemlimi?

kablonun ortasından bağlantı yapma şansımız yok. kablonun her iki ucunda piyasada mayk diye geçen 4-5 pinli soketler var bu soketlerle kablo I2C haberleşmesi yapan çiplere veya P82B96 lara bağlanıyor. kablonun uçlarının soketle bağlantı yapıldığı devrelerde istediğimiz değişiklikleri yapabiliriz. dirençlerle bu kısımda oynayabiliriz.
pull-up Dirençleri 4k7 ile 390R. arası değerlerde denedim. hatta çiplerin bozulmadıklarından emin olmakla birlik de 100R bile denendi.

haberleşme hızını 100 kHz. altına düşüremiyoruz diye biliyorum. iki seçenek var 100 ve 400 kHz.

evet devrelerin toprakları ortak. P82B96 kullanılınca topraklar ayrılamaz sanıyorum, çünkü giriş çıkış data hatları için ortak tek beslemesi var. tabiki işin içine ilave başka çipler kullanılmıyorsa beslemeler ayrılamaz sanıyorum.

4 hatlı kablodan ikisi +5V./0V. olarak ortak beslemelerin. hattı diğer ikisi SCL / SDA hatları olarak denemeler yaptım.

aslında sorun basit gibi duruyor ama öyle değilmiş.
kablo kısa devre çalışması harika, kablo uzun devre çalışması ikide bir bozulup duruyor.

uzay montajdan kaynaklı bozukluk olabilir mi acaba? yeni pcb çizip denemeleri onunla yapmak mı gerekir ? çok güzel uzay montaj bağlantısı yaptığıma da eminim aslında.
böyle bir sorununu P82B96 ile gideren var mı? bu çiple de işin çözülebildiğinden bir miktar şüphelerim var aslında.

JOKERAS

Cemre usta, Doğru söylüyorsunuz, I2C uzun mesafeler için uygun değil.Bunu demiştik.
Ama arkadaş illaki uzun mesafe olsun diyor.Durumu Zorluyoruz:)
Atölyede çalışırsa sahada da çalışacağını sanıyorum.



HAKKITANIR,


Evet, Tek damar Ethernet kablosu da bir nevi çözüm olabilir.Tek damar olması Çok önemli!


Koblonun Blendajının her iki tarafını tabiki Toprağa bağlayın.Dış gürültülere karşı Ekranlama yapmış olursunuz.


390R, 100R işi düzeltmek yerine hepten berbat hale sokar.O kadar da değil!


R-Pullup dirençlerini Hatta Homojen dağıtın söylemimi test etmek için yapıp durumu gözlemleyin.
Sonra çare üretilir.
Bir deneyin bakalım ne oluyor.








HAKKITANIR

Alıntı yapılan: Cemre. - 04 Aralık 2017, 14:50:27
Bu frekanslarda deri etkisini azaltmak adına çok damarlı kablo kullanmak daha mantıklı değil mi? Gerçi zaten I2C kablo ile taşınmak üzere tasarlanmış bir iletişim altyapısı değil ki... Kart üzeri çevre birimler ile haberleşmek üzere dizayn edilmiş bir protokol ile bu mesafelere çıkmaya çalışmak çok anlamsız. Laboratuvar ortamında sorun çıkartmasa bile yarın sahada sorun çıkartacak bir dizayn.

buna katılıyorum işte. P82B96 kablo boyunu uzatabilir olarak görülüyor ama marifetini, alameti farikasını biz göremedik henüz. buna pcb çizsem de görülmeyecek gibi duruyor.

işten en kolay benim bilgimi aşmayacak şekilde nasıl çıkarım diye çabalıyorum. sorun tamamen kablo boyu ile alakalı. şimdi biz bu I2C yi kullanmak mecburiyetindeyiz. bunu RS485 veya farklı bir şeye otomatik dönüştüren hazır üretim bir çip yoksa işimiz zor olur.

ne tavsiye edersiniz ne yapabiliriz?

HAKKITANIR

#14
bir iki yeri daha aydınlatabilirsek denemeyi yapıp geri dönerim.
daha masada kablo uzun olunca çalışmıyor devre, devre bir çalışsın masada - endüstride bu kısımların testlerini de yaparım.

Devre şöyle mi dir?

P82B96 yı kullanıyoruz devrede, P82B96 çipleri arası 1,5 metre Ethernet kablosu ile bağlanacak, kablo 8 tek damarlı tel hatlı ve 4 teli kullanılacak. P82B96 nın bu kısımlarındaki 2 şer adet pull-up dirençleri çiplerin yanında yani kablonun başında ve sonunda bağlı toplam 4 pull-up direnç var bu kısımda. kablonun her iki tarafındaki P82B96 ile I2C haberleşmesi yapacak çiplerin bağlı olduğu kısımlardada 2 şer adet pull-up dirençleri bağlı olacak. bu kısımda I2C haberleşmesi yapacak çiplerle P82B96 arası mesafeler 10 cm. gibi pcb üzeri yollarla olacak. Ethernet kablonun içindeki tüm iletkenlerini kaplayan tek bir dış blendajı olması yeterli değil mi? bu blendajlar kablonun her iki tarafından toprağa girilecek.

bu bağlantı ile devreyi tekrar kursak, ilave edilmesi gereken bir şey olur mu?