I2C hatlarındaki çekme dirençlerini atlarsam ne olur?


33

Şimdi, I 2 C verilerinin ve saat satırlarının (SDA ve SCL) çekme dirençlerine sahip olması gerektiğini fark ettim.

Şey, aşağıdaki şemaya göre DS1307 RTC'yi ( veri sayfasına bakınız ) kullanarak birkaç saat inşa ettim . Her iki çekme direncini de çıkardığımı fark et.

I2C hatlarında çekme dirençleri olmadan saatimin şematik

Her iki saat de iyi çalışıyor, bunlardan biri 3 aydan fazla bir süredir çalışıyor. Bu nasıl mümkün olabilir? Her durumda bilmek istedim:

  1. I 2 C toplamaları çıkarıldığında ne olur ?

  2. Çıkarmaların olmaması, anakartımdaki bu iki IC'den herhangi birine zarar verebilir mi?

Ben, ATmega328P’yi, verdiğim şemalardaki gibi bir DS1307 RTC’ye bağlanma konusundaki özel davamı ele alan cevapların peşindeyim, ancak soru çok geniş olmazsa, genel olarak alımların genel olarak ihmal edildiğinde ne olacağını bilmek faydalı olacaktır. yani, bir diğer senaryolarda 2 C işlemi.

PS. Cevabı bulmak için Net'i araştırdım, ancak çekişlerin boyutlandırılmasıyla ilgili makaleleri bulabilirim.

Güncelleme: Arduino IDE 1.03 kullanıyorum ve ürün bilgim DS1307RTC Arduino lib'i kullanarak RTC'yi kullanıyor (fonksiyonlarını RTC.read()ve işlevlerini kullanarak RTC.write()). Bu lib, sırayla Wire.hRTC ile konuşmayı kullanır .

Güncelleme 2: Aşağıda, I 2 C'nin harici çekmeler olmadan nasıl çalıştığını açıklamak için çektiğim bir seri çekim dizisi bulunmaktadır .

Kapsam atış 1 Kapsam atış 2

Güncelleme 3 (I 2 C pullup'lar eklendikten sonra ): Aşağıda, I 2 C satırlarına (aynı panodaki) uygun (4K7) çekme dirençleri ekledikten sonra çektiğim bir başka seri çekim serisi aşağıdadır . Yükselme süreleri yaklaşık 5 µs'den 290 ns'ye düştü. Ben 2 C şimdi çok daha mutlu.

Kapsam atış 3 Kapsam atış 4


2
Kodunuz bu pinlerdeki çekimleri etkisiz hale getiriyor mu?
Ignacio Vazquez-Abrams,

@ IgnacioVazquez-Abrams Kodumda SDA ve SCD pinlerinden (18 & 19) doğrudan söz edilmiyor. RTC'yi DS1307RTC lib Arduino lib ve RTC.read () ve RTC.write () fonksiyonlarını kullanarak idare ediyorum .
Ricardo

Bu lib, RTC ile konuşmak için Wire.h'yi kullanır.
Ricardo

3
Evet, kesinlikle dahili çekmeler kullanıyor. Keskin kenarlar yerine eğrilere dikkat edin.
Ignacio Vazquez-Abrams

Yanıtlar:


28

1) I2C toplamaları çıkarıldığında ne olur?

I 2 C veriyolunda iletişim kurulamayacak. Hiç. MCU, I 2 C başlangıç ​​koşulunu oluşturamaz. MCU, I 2 C adresini iletemez .

Neden 3 ay çalıştığını merak ediyor musun? Okumaya devam etmek.

2) Çıkarmaların olmaması, kartımdaki bu iki IC’den herhangi birine zarar verebilir mi?

Muhtemelen değil. Bu özel durumda (MCU, RTC, başka hiçbir şey), kesinlikle değil.

3) MCU neden ilk önce I 2 C slave cihazı ile iletişim kurabildi ? I 2 C pull-up dirençleri gerektirir. Fakat şemada yer almadılar.

Muhtemelen, ATmega'da etkin olan dahili çekicilere sahipsiniz. Okuduğum kadarıyla 1 , ATmega etkin veya firmware devre dışı bırakılabilir 20kΩ iç barfiks var. 20kΩ, I 2 C çekmesi için çok zayıf . Ancak veri yolu düşük kapasiteye sahipse (fiziksel olarak küçük) ve iletişim yeterince yavaşsa, 20kΩ hala veri yolu çalışmasını sağlayabilir. Ancak, ayrık çekme dirençleri kullanmakla karşılaştırıldığında bu iyi bir güvenilir tasarım değildir.

1 Kendimi bir ATmega adamı değil.

güncelleme: Yanıt olarak OP'ye eklenen I 2 C dalga formları, OP'deki
dalga formlarının çok uzun bir yükselme zaman sabiti vardır. İşte ben 2 C dalga formları genellikle benziyor

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

PIC18F4550, Vcc = + 5V, 2.2kΩ yukarı çeker. Dalga biçimi SCL'yi gösterir. SDA'da yükselme süresi yaklaşık olarak aynı. Veri yolunun fiziksel büyüklüğü orta: 2 köle cihazı, PCB uzunluğu mm100mm.


Cevabınız için teşekkürler! Evet, ATmega benim durumumda etkinleştirilmesi gereken çekişlere sahip. Kullandığım kodu ve lib'leri iki kez kontrol edeceğim ve ayrıca panoyu kapsamın içine koyacağım. Umarım bu işleri biraz giderir.
Ricardo

1
Önce köle cihazınızın veri sayfasını kontrol etmek isteyebilirsiniz. Doğru hatırlıyorsam, ATMega’daki artışlar 30k-60k’dan herhangi bir yerde olabilir (Vcc, sıcaklık ve diğer birçok faktöre bağlıdır; güvenilir bir direnç için bunlara güvenemezsiniz). Uygun bir mantık sağlamak için köleye yeterince akım gönderdiğinizden emin olmak istiyorsunuz 1. Direnç çok büyükse, köle cihazınız yeterli miktarda akım almaz ve içinde bulunduğunuz noktada kalırsınız şimdi.
audiFanatic

4
@audiFanatic +1. BTW, IMO, koparma panolarına pull-up dirençleri dahil etmek ve bunları varsayılan olarak kurmak bir hatadır. Birinin bir I2C veriyolunda birden fazla koparma kartı varsa, ne olacağını bir hayal edin. Her pull-up genellikle 2.2kΩ ya da kadardır. Bütün panolarda bulunan dirençler paraleldir. Birleşik çekme, I2C için çok sertleşir. [ Buradaki ve buradaki potansiyel sorun hakkında daha fazlası .]
Nick Alexeev

2
@Ricardo Bu, skop çekimlerinizde mutlu bir I2C otobüsü değil [OP'deki ilk kapsam çekimleri]. Cevabımı da bir kapsam vurdu ekledi.
Nick Alexeev

3
Bu makale bazı iyi ve kötü i2c sinyallerinin dalga biçimlerine sahiptir: dsscircuits.com/index.php/articles/…
ford

16

Kullandığınız kütüphane ve buna bağlı olan kütüphaneler (Wire), ATMega'nın dahili çekimlerini sağlar. Bunlar zayıf pull-up'lar ve normal kullanımda, harici pull-up'ları destekler (paralel olarak iki direnç). 20k ila 70k arasındaki nispeten yüksek direnç nedeniyle, harici kullanımda herhangi bir sorun varsa fazla bir neden olmaz.

I2C toplamaları çıkarıldığında ne olur?

Şimdi, harici dirençler olmadan, zayıf iç çekimler, çizgiyi yükselten tek şeydir. Tahta düzeninize bağlı olarak, i2c hattınızın hızı, buna ne sıklıkta eriştiğiniz, harici parazit vb. İşe yarayabilir, çalışmayabilir. Sen dışarı çıktın. Çekmenlerin var, beklediğin gibi değil.

Toplamaların olmaması, kartımdaki iki IC'den herhangi birine zarar verebilir mi?

Dahili pull-up'lar olmadan bile, pull-up'ların eksikliği IC'ye zarar vermez. İ2c cihazı SCl ve SDA hatlarının dahili yapısı NPN transistörleri gibidir. Bunlar Açık Kollektörler , temelde akım kontrollü / anahtarlamalı diyotlar.

ATMega'nız 5v olduğunda ve i2c aygıtı yalnızca 3.3v olduğunda, dahili çekmeleri açarak dikkat edilmesi gereken son şey sorunlara neden olabilir. Veya dahili çekişe sahipseniz ve bir 3.3v veya başka bir voltaja bağlı harici dirençler de sorunlara neden olabilir. Temel olarak, Wire kitaplığında bilerek yok sayılan bir hata.


4
+1 - You do have pull-ups, just not ones you expected.- Sanırım çivilenmiş. Teşekkürler!
Ricardo

Sadece, bilirsin, kurulumumda neler olup bittiğini netleştirmek için birkaç çekim ekledim.
Ricardo,

2
@Ricardo yep 33khz'de onları görüyor. Belirtilen en düşük i2c hızının üçte biri ve sinyal hala çok kötü. 100khz veya 400khz'de, çalışma iletişiminiz olmazdı. Yine de harika bir şey, birçok i2c cihazı maksimum hızın bir kısmıyla çalışıyor. Unutma, dahili çekimler 70k ohm'a kadar çıkabilir, tipik bir i2c direnci 4.7k'dır
Passerby

8

Genellikle bir I 2 C arayüz devresi için çekme dirençlerine sahip olmanız gerekir . Arayüz, kabloların her iki ucunda gerçekten tam bir I 2 C ise, dirençsiz sinyal hatları asla yüksek seviyeye gidemez. Düşük kalabilirler veya her iki uçtaki parçalardaki kaçak akım tarafından belirlenen bir ara seviyeye gidebilirler. Bunun nedeni, gerçek I 2 C'nin bir açık tahliye otobüsü olmasıdır.

Bazı cihazlar , parça üzerindeki I 2 C arayüzü kullanılmadığında, sadece arabirim pimlerini yüksek etkin olmayan bir seviyede tutmak için 20K ila 100K ohm aralığında çip üstü dirençlere sahip olabilir . Basit ve kısa arayüzler için, bu çekme dirençleri, saatler ve / veya veriler işaretlenirken çizgileri yükseğe çekmek için gereken akımı sağlamak için yeterli olabilir.

Şematik bilgilerinizden söylemek zordur, ancak bazı durumlarda I 2 C arayüzleri genel amaçlı G / Ç bağlantı noktası pimleri kullanılarak uygulanır ve daha sonra yazılımlara çarpılır. Bazen uygulayıcı bu konfigürasyondaki G / Ç pimlerini açık bir tahliye metodolojisi kullanarak çalıştıramayabilir ve bu, çekme dirençleri olmayan bir arayüzün neden işe yarayabileceğini belirleyen bir faktör olabilir.

Günün sonunda, arayüzdeki 1 ve 0'ların spesifik voltaj seviyelerinde çalışıp çalışmadığını görmek için bir osiloskop kullanarak önceki saatlerinizden birinin sinyalini kontrol etmeyi muhtemelen kendinize borçlusunuz. Öyleyse, bu uygulamada inanılmaz derecede şanslı olup olmadığınızı veya yukarıda bahsettiğim faktörlerden birinin oyunda olup olmadığını kesin olarak bileceksiniz.


4

I2C toplamaları kullanılmadığında ne olur?

Büyük olasılıkla, I2C veri yolu işe yaramayacak.

Toplamaların olmaması, kartımdaki iki IC'den herhangi birine zarar verebilir mi?

Büyük olasılıkla değil.


3

I2C hatlarınız hiç çalışmayacak. Yanılmıyorsam, I2C sadece düşük sinyaller verir, ancak onları yüksek bir duruma geri döndürmez, bu yüzden bu dirençlere ihtiyacınız var.

Herhangi bir pull-up eksikliği hiçbir IC'ye zarar vermemelidir.


I2C pimleri açık boşalıyor.
Matt Young

1

I2C, bir TTL-mantık protokolüdür; bu yüzden verileriniz ve saat çizgileriniz açık boşalıyor. Başka bir deyişle, I2C donanımı yalnızca bu çizgileri düşük sürdürebilir; sıfır olmadıklarında yüzmeye bırakılırlar. Kaldırma dirençlerinin girdiği yer burasıdır. Bu basitleştirilmiş bir şemadır, ancak bir saniye benimle çalışın.

şematik

bu devreyi simüle et - CircuitLab kullanılarak oluşturulan şematik


Gördüğün gibi; TTL mantığı çıkışı düşük tutmuyorsa, çıkışta bir mantık 1 görülmesini sağlamak için çekme direnci gerekir. TTL mantığı, daha önce de bahsettiğim gibi satırları yüksek süremez. Eğer bu olmasaydı, çıkış yüzer halde kalırdı ve çıkışta görebilecekleriniz tahmin edilemezdi (herkesin bildiği gibi, mikrodalganız veya iş arkadaşlarınızın şeker içermeyen sakızlı bir ayının neden olduğu bağırsak fonksiyonlarının bozulmasına neden olabilirdi) dalgalanma değeri).

Şimdi, eğer I2C'yi mikrodenetleyicili bir yazılımla uygulamak isteseydiniz, bu, büyük olasılıkla çıkışları hem yüksek hem de düşük sürdürebilen CMOS mantığını kullanacağı için çok fazla bir sorun olmayacaktı.


1
Yardım etmesine sevindim.
audiFanatic

2
Cihazların TTL veya CMOS mantığı kullanıp kullanmadığı önemli değildir - normal TTL ve normal CMOS çıkışları hem yukarı hem aşağı sinyal çeker. I2C sinyalleri açık kollektör TTL veya (daha büyük olasılıkla) açık boşaltma CMOS'udur - her iki durumda da, sinyali yukarı çekecek transistör kaynağın çıkış aşamasından eksik, bu nedenle çekme dirençleri gerekli sinyalleri yükseğe çekin. Mikrokontrolörün bu bira bardağı üzerinde dahili çekmeleri olması mümkündür.
Peter Bennett

3
-1 Peter Bennett'in dediği gibi, bu cevabın çoğu yanlış. TTL sinyallerini "açık boşaltma" olarak adlandırmak hediyedir.
Joe Hass

TTL ile I2C yapmanın avantajları olduğunu, yani aynı veri yoluna bağlı farklı besleme gerilimi olan bileşenleri işlemek için genellikle seviye tercümanlarına ihtiyacınız olmadığını unutmayın. Sadece çekme voltajını en düşük voltaj çipinin en yüksek kabul gören giriş voltajına ayarlamak TTL giriş aşamalarında yeterlidir . CMOS'ta bu işe yaramaz.
Ben Voigt

@BenVoigt: Hayır - "pull-up rezistörü gerektirir" olarak adlandırılması "yapılandırması" TTL "yanlıştır, çünkü bu düzenleme CMOS veya TTL ile yapılabilir ve DS1307 bir CMOS parçasıdır. Maxim veri sayfası, çıktıların açık tahliye olduğunu açıkça belirtir ve blok şema, bir çıktı için bir FET gösterir.
Peter Bennett

0

I2C'yi saatimi besleyen ana olarak bir mikro ile çarptığımda, SCL'yi sökmeden sürebildim.

Bununla birlikte, SDA'nın çekme ile OC olması gerekir, böylece köle cihazı aşağı çekip doğru şekilde yanıt verebilir.

Saygılarımızla

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.