I2C pull-up dirençleri için doğru direnç değeri var mı?


72

24LC256 EEPROM veri sayfası şunları belirtir:

SDA veriyolu, VCC'ye bir çekme direnci gerektirir (100 kHz için tipik 10 kΩ, 400 kHz ve 1 MHz için 2 kΩ).

Bir kΩ değerine sahip herhangi bir rezistansın işi yapacağını düşündüm (ve EEPROM'um farklı frekanslarda 10 kΩ dirençle çalışıyor gibi görünüyor).

Benim sorularım:

  • dirençleri için doğru bir değer var mı?
  • bu değeri belirlemek için bir kanun / kural var mı?
  • farklı direnç değerleri I²C veri yolunu nasıl etkiler?

Yanıtlar:


66

I 2 C veri yolu için doğru çekiş direnci, veri yolu üzerindeki toplam kapasitansa ve veri yolunu çalıştırmak istediğiniz frekansa bağlıdır.

ATmega168 veri sayfasından (resmi I 2 C özelliklerinden geldiğine inanıyorum) verilen formül -

Frekans<100kHzR,min=Vcc-0.4V3mA,R,maksimum=1000nsCotobüs

Frekans>100kHzR,min=Vcc-0.4V3mA,R,maksimum=300nsCotobüs

Microchip 24LC256, 10pF'lik bir maksimum pin kapasitansı belirtir (ki bu oldukça tipiktir). Veriyolunda paralel olarak sahip olduğunuz cihaz sayısını sayın ve işe yarayacak bir dizi değeri hesaplamak için yukarıdaki formülü kullanın.

Pilleri kapatıyorsanız, aralığın en üstündeki değerleri kullanırdım. Güç kaynaklarında güç sınırı yoksa ya da IC'lerde güç tüketimi sorunları yoksa, aralığın alt ucundaki değerleri kullanırdım.

Bazı kitleri I 2 C RTC (DS1337) ile satıyorum. Kit içerisinde çoğu kullanıcı için makul bir uzlaşma gibi görünen 4K7 dirençler var.


Tipik olarak otobüste boşta (hayal kırıklığına uğramış) zamanın büyük bir çoğunluğu olduğunu hayal ediyorum, bu nedenle bir akü uygulaması için I2C çekişlerini optimize etmeye çalışmaktan daha önemli bir sorun var: P
Nick T

5
ekleyeceğim tek şey veri yolu üzerindeki aygıtların toplam kapasitansının üstünde bir tampon. İzin yanı sıra lehim bağlantılarının pedlerden pimlere kadar olan kısımları da bir empedansa sahip olacaktır. Daha uzun otobüslerde iz / telin kapasitansı, cihazların pin kapasitansından daha büyük olabilir. Üretim panolarını tasarlarken, elimde bir prototip olana kadar son çekme değerini genellikle belirlemiyorum ve veri yolu çeşitli değerlerle kapsamalı.
Mark

14

Daha yüksek frekansların daha düşük dirençli çekmeye ihtiyaç duyduğu anlamındadır: daha düşük bir direnç, kablonun kapasitansını daha hızlı şarj eder / deşarj eder, bu da daha dik kenarlara neden olur. Daha düşük frekansların daha geniş darbeleriyle daha az dik bir kenar darbenin şeklini etkilemez.

Bu nedenle, I2C spesifikasyonu , üç hız sınıfı için veri yolu kapasitansının bir fonksiyonu olarak çekme dirençleri için maksimum değerler verir:

görüntü tanımını buraya girin

Minimum değerler bus voltajının fonksiyonunda tanımlanmıştır ve akımı sürücüler üzerinden sınırlandırmalıdır.


3
3 yıl sonra Texas Instruments bu cevaba oldukça yakın bir uygulama notu yazdı .
Nick Alexeev

EDN makalesi: Sağlam I2C iletişimi için tasarım hesaplamaları . [Sadece referans materyali kadar kazık.]
Nick Alexeev

11

Doğru bir değer aralığı vardır, ancak o aralığın tam olarak ne olduğunu açıklamak zordur. Genellikle, 10k çalışır.

Dijital çıkışların akımı beslemek veya batmak için belirli bir yeteneği vardır. Çıktınız 5 mA batırabiliyorsa ve çıkış 5 V'a kadar çekip bağlandıysa ve 0 olarak ayarlandıysa, minimum 1k direnç gerekir. 1k'den daha az kullanırsanız, çıkış pimi 0V'a kadar tamamen çekmek için yeterli akımı kesemez. 10k gibi daha büyük bir değer kullanırsanız, pimin yalnızca 0,5 mA batması gerekir;

Dijital girişlerde belirli bir kaçak akım var. Bu bir girişte 0 veya 1 “tutmak” için gereken akımın bir tür. Yukarı çekme direnciniz çok büyükse, kaçak akımın üstesinden gelemez. Sadece kaçak akımın zorlukla üstesinden gelirse, devredeki herhangi bir gürültü girişi değiştirmek için yeterli olabilir.

Akımı batırabilen ve kaynaklayabilen dijital çıkışlar kullanılırken ("totem direği sürücüsü", "itmeli-çekmeli sürücü"), çekme veya çekme dirençleri kullanmamaya özen gösterebilirsiniz. Ancak, CMOS girişlerinin yüzmesine izin verilmemesi veya aşırı akım çekmeleri çok önemlidir ... ve çift yönlü MCU pimlerinin genellikle giriş olarak geldiğini unutmak çok kolaydır!


I2C ve bunun gibi diğer protokoller "açık tahliye" (veya "açık kolektör") çıkışları kullanır. Yukarı ve aşağı çekebilen çıkışlara sahip olmak yerine ve açık tahliye çıkışlarını yalnızca aşağı çekebilir. Harici çekme direncinin gerekli olmasının nedeni budur. Artık çekme dirençleri yelpazesinde ek kısıtlamalar vardır; yukarı çekme değeri veri yolu kapasitanslı bir RC devresi oluşturacaktır. Bir değerin çok küçük olması, bir kez daha çıkış sürücülerinin pimi 0'a kadar tamamen çekmek için yeterli akımı batmasını önler. Ancak, çok büyük bir değerin veri yolu kapasitansını doldurması çok uzun sürecektir.

İhlal etmenize izin verilmeyen kurulum / bekletme süreleri varsa, bunlar bir RC zaman sabiti belirlemenize yardımcı olur. Veriyolu kapasitansı büyük ölçüde PCB yerleşim düzeni tarafından belirlenir, böylece dijital girişiniz için kurulum / tutma süresi içinde rahatça bir değer sağlamak üzere C ile birleşen bir R değeri seçebilirsiniz.


7

Düşük çekme değerleri (daha düşük direnç), sinyal geçişlerinin kenarlarını iyileştirebilir, ancak bazen çok sert olabilir - veri yolu üzerindeki cihazlar çekme akımını batıramazsa, gerçekten düşük olan mantık 'düşük' olur , iletişim hatalarına neden olabilir (ve çok fazla acı.)

Size güvenilir iletişim sağlayan en yüksek çekme direnciyle giderdim.


5

Düşük frekanslar için değer gerçekten önemli değildir, ancak yüksek frekanslar için devredeki diğer kapasitanslarla kombinasyon halinde sinyal üzerinde bir filtreleme etkisi olabilir, bu yüzden farklı hızlar için farklı değerler tavsiye ederler.


2

Henüz bahsetmediğim bir sorun, güç tüketimi. Biri 3.3 voltluk bir besleme kullanıyorsa, toprağa 3.3K'lık bir direnç, bir çıkış düşük olduğunda 1mA akım harcar (3.3mW güç). 10K'lık bir direnç kullanmak hem akımı hem de gücü üç kat azaltır. I2C veriyolu üzerinde çok fazla iletişim olacaksa, bu güç tüketimi, özellikle veri yolu uzun süre düşük tutabiliyorsa, genel güç tüketiminin önemli bir kısmı olabilir. Örneğin, biri 100 bayt / saniye okuyorsa ancak her baytı okuduktan sonra veriyolu bir sonraki baytın ilk bitini çıkaran cihazla bırakılır ve bu baytların çoğu MSB'yi temizler. SCL ve SDA düşük olduğunda süre. Sistemin yaptığı başka şeylere bağlı olarak, bu güç çekişini büyük ölçüde artırabilir.

Güçten tasarruf etmek için, VDD yerine bir G / Ç pimine bağlı bir "çekme" direncinin olması yararlı olabilir. Donanım görmedim, ancak I2C uygulamaları bunun için destek sağlıyor; ana çıkış verilerini, açık kollektör kullanan bir sürücü ve sabit bir çekme direnci kullanmak yerine, dirençle otobüse bağlanan ayrı bir G / Ç piminde kullanmaktan kaçınmak Master bir "0" üretmek istediğinde akım boşa. Ek olarak, eğer master SDA'dakileri önemsemeden bir süre SCK'yı düşük bırakacaksa, master biraz daha iletişim için hazır olana kadar çekişi devre dışı bırakabilir. Cihazlardan hiçbirinin saat gerdirme kullanması gerekmiyorsa, ana ünite SCK için doğrudan bir çıktı kullanabilir ve bu kablodaki herhangi bir çekme ile uğraşmaz.

Eğer biri hızlı bir işlemci ile bit-bit yazılım kullanıyorsa ve biri yüksek veri yolu kapasitansına rağmen iyi bir performans elde etmek istiyorsa, yukarıdaki yaklaşım bir işlemcinin yerleşik zayıf çekişlerinin kullanımı ile birleştirilebilir. Verileri okurken, SCK'nin düşen her kenarından hemen sonra kısa bir süre için çok güçlü bir çekiş açın ve ardından zayıf çekmeye geçin. Güçlü çekme, kapasitansa rağmen hattı yukarı çekecektir ve hat yüksek çekildiğinde zayıf çekme yüksek tutabilecektir. Bir cihaz, hattı güçlü çekişe karşı alçaltmakta zorlansa bile, güçlü çekiş kapatıldıktan sonra bunu yapabilir.



-1

Burada 400 kilo / saniye (200 KHz 101010 dalga formu) için dalga formları var. RC, 4.7K ohm ve 212pF'dir. RC değeri 2 TAU yerleşmesine izin verir.

görüntü tanımını buraya girin


Bu cevap sadece yanlıştır. 200 kHz saat 400 değil 200 kb / s verir. Sadece yükselen kenarlar çekme direncinden etkilenir. Grafikler kafa karıştırıcı görünüyor, tıpkı bir çeşit modülasyon olduğu gibi. Fiziksel büyüklükler ve birimleri aralarında boşluk (veya ince boşluk) ile yazılır. Tau bir kısaltma değildir, bir semboldür.
venny

@venny Bu, çökelme süresi için çok hızlı çalışan bir otobüs için tipik dalga formlarıdır. Sadece 2 TAU yerleşmesiyle, dalga formlarında düz bir tepe yoktur, bu nedenle "bir tür modülasyon" vardır; sözde rastgele bir model olsaydı, yerleşme değişkenliği çok açık olurdu; "veri gözü" nü okuyun. Son olarak, 200KHz saat 2.5uS için yüksek, 2.5uS için düşüktür; 2.5uS dönemi tam olarak bahsettiğim 400KHz veridir.
analogsystemsrf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.