Co się stanie, jeśli pominę rezystory podciągające na liniach I2C?

33

Właśnie teraz zdałem sobie sprawę, że linie danych i zegara I 2 C (SDA i SCL) muszą mieć rezystory podciągające.

Cóż, zbudowałem kilka zegarów przy użyciu DS1307 RTC (patrz arkusz danych ) zgodnie ze schematem poniżej. Zauważ, że pominąłem oba rezystory pullup.

Schemat mojego zegara bez rezystorów podciągających na liniach I2C

Oba zegary działają dobrze, jeden z nich działa już ponad 3 miesiące. Jak to możliwe? W każdym razie chciałem wiedzieć:

  1. Co się stanie, gdy pominięte zostaną podciągnięcia I 2 C?

  2. Czy brak podciągnięć może uszkodzić którykolwiek z tych dwóch układów scalonych na mojej planszy?

Jestem po odpowiedziach, które dotyczą mojego konkretnego przypadku podłączenia ATmega328P do DS1307 RTC, jak na schematach, które podałem, ale jeśli pytanie nie stanie się zbyt szerokie, dobrze byłoby wiedzieć, co się stanie, gdy pomija się podciągnięcia , tj. w innych scenariuszach operacji I 2 C.

PS. Przeszukałem sieć, by znaleźć odpowiedź, ale mogłem znaleźć artykuły na temat wymiarowania podciągnięć.

Aktualizacja: Używam Arduino IDE 1.03, a moje oprogramowanie układowe obsługuje RTC przy użyciu biblioteki DS1307RTC Arduino lib (poprzez jego funkcje RTC.read()i RTC.write()). Ta biblioteka z kolei używa Wire.hdo rozmowy z RTC.

Aktualizacja 2: Poniżej znajduje się seria zdjęć z zakresu, które zrobiłem, aby wyjaśnić, jak działa I 2 C bez zewnętrznych podciągnięć.

Strzał z zakresu 1 Strzał z zakresu 2

Aktualizacja 3 (po dodaniu podciągnięć I 2 C): Poniżej znajduje się kolejna seria ujęć lunety, które zrobiłem po dodaniu odpowiednich rezystorów podciągania (4K7) do linii I 2 C (na tej samej płycie). Czasy narastania spadły z około 5 µs do 290 ns. I 2 C jest teraz znacznie szczęśliwszy.

Strzał z zakresu 3 Strzał z zakresu 4

Ricardo
źródło
2
Czy twój kod wyłącza podciągnięcia na tych pinach?
Ignacio Vazquez-Abrams,
@ IgnacioVazquez-Abrams W moim kodzie nie ma bezpośredniej wzmianki o pinach SDA i SCD (18 i 19). Obsługuję RTC za pomocą lib Arduino lib DS1307RTC i jego funkcji RTC.read () i RTC.write ().
Ricardo
Ta biblioteka z kolei używa Wire.h do rozmowy z RTC.
Ricardo
3
Tak, zdecydowanie używając wewnętrznych podciągnięć. Zwróć uwagę na krzywe zamiast ostrych krawędzi.
Ignacio Vazquez-Abrams

Odpowiedzi:

28

1) Co dzieje się, gdy pomija się podciągnięcia I2C?

Brak komunikacji na magistrali I 2 C. W ogóle. MCU nie będzie w stanie wygenerować warunku początkowego I 2 C. MCU nie będzie w stanie przesłać adresu I 2 C.

Zastanawiasz się, dlaczego to działało przez 3 miesiące? Czytaj.

2) Brak podciągnięć może uszkodzić którykolwiek z tych dwóch układów scalonych na mojej planszy?

Prawdopodobnie nie. W tym konkretnym przypadku (MCU, RTC, nic więcej) zdecydowanie nie.

3) Dlaczego MCU było w stanie komunikować się z urządzeniem slave I 2 C? I 2 C wymaga rezystorów podciągających. Ale nie zostały uwzględnione w schemacie.

Prawdopodobnie masz włączone wewnętrzne podciągnięcia w ATmega. Z tego, co przeczytałem 1 , ATmega ma wewnętrzne podciągnięcia 20kΩ, które można włączyć lub wyłączyć z oprogramowania. 20kΩ jest zdecydowanie za słaby dla podciągania I 2 C. Ale jeśli magistrala ma niską pojemność (fizycznie małą), a komunikacja jest wystarczająco wolna, wówczas 20 kΩ nadal może sprawić, że magistrala będzie działać. Jednak nie jest to dobra niezawodna konstrukcja w porównaniu do używania dyskretnych rezystorów podciągających.

1 Sam nie jestem facetem z ATmega.

aktualizacja: W odpowiedzi I 2 C przebiegi, które zostały dodane do OP
Przebiegi w OP mają bardzo długą stałą czasową narastania. Oto jak zwykle wyglądają przebiegi I 2 C.

wprowadź opis zdjęcia tutaj

PIC18F4550, Vcc = + 5 V, podciągnięcia 2,2 kΩ. Przebieg pokazuje SCL. Czas narastania SDA jest mniej więcej taki sam. Rozmiar fizyczny magistrali jest umiarkowany: 2 urządzenia podrzędne, długość płytki drukowanej ≈100 mm.

Nick Alexeev
źródło
Dzięki za odpowiedź! Tak, ATmega ma podciągnięcia, które muszą być włączone w moim przypadku. Dokładnie sprawdzę kod i biblioteki, których używam, a także wprowadzę tablicę do zakresu. Mam nadzieję, że to trochę wyjaśni.
Ricardo
1
Możesz najpierw sprawdzić dwukrotnie w arkuszu danych swojego urządzenia slave. Jeśli dobrze pamiętam, podciągnięcia na bankomatach mogą wynosić od 30 do 60 tysięcy (zależy to od Vcc, temperatury i wielu innych czynników; nie można naprawdę na nich polegać, jeśli chodzi o niezawodną odporność). Chcesz mieć pewność, że wysyłasz wystarczającą ilość prądu do urządzenia podrzędnego, aby zapewnić prawidłową logikę 1. Jeśli rezystancja jest zbyt duża, urządzenie podrzędne nie pobierze wystarczającej ilości prądu i będziesz w tym samym miejscu, w którym jesteś teraz.
audiFanatic
4
@audiFanatic +1. BTW, IMO, w tym rezystory podciągające w płytach zabezpieczających i ich instalacja domyślnie jest błędem. Wyobraź sobie, co się stanie, jeśli ktoś ma wiele płyt zabezpieczających na jednej magistrali I2C. Każde podciągnięcie wynosi zwykle około 2,2 kΩ. Rezystory podciągające na wszystkich wyłamywanych płytach pojawiają się równolegle. Połączone podciąganie staje się zbyt sztywne dla I2C. [Więcej o tym potencjalnym problemie tu i tutaj .]
Nick Alexeev
2
@ Ricardo To nie jest szczęśliwa magistrala I2C na twoich strzałach z zakresu [pierwszy zestaw strzałów z zakresu w PO]. Do mojej odpowiedzi dodałem także lunetę.
Nick Alexeev
3
W tym artykule przedstawiono niektóre przebiegi dobrych i złych sygnałów i2c: dsscircuits.com/index.php/articles/…
ford
16

Używana biblioteka i biblioteki, od których ona zależy (Wire), umożliwiają wewnętrzne podciąganie ATMega. Są to słabe podciągnięcia i podczas normalnego użytkowania uzupełniają wszelkie zewnętrzne podciągnięcia (dwa rezystory równolegle). Ze względu na stosunkowo wysoką rezystancję od 20k do 70k, nie powodują one większych problemów w użyciu.

Co się stanie, gdy pominięte zostaną podciągnięcia I2C?

Teraz bez zewnętrznych rezystorów słabe wewnętrzne podciągnięcia są jedyną rzeczą, która napędza linię wysoko. W zależności od układu płytki, prędkości linii i2c, częstotliwości dostępu do niej, zewnętrznych zakłóceń itp., Mogą działać, mogą nie. Masz szczęście. Masz podciągnięcia, po prostu nie te, których się spodziewałeś.

Brak podciągnięć może uszkodzić którykolwiek z tych dwóch układów scalonych na mojej planszy?

Nawet bez wewnętrznych podciągnięć, brak podciągnięć nie uszkodzi ani IC. Wewnętrzna budowa linii SC1 i SDA urządzenia i2c przypomina tranzystory NPN. Są to otwarte kolektory , zasadniczo sterowane prądem / przełączane diody.

Ostatnią rzeczą do zapamiętania jest to, że włączenie wewnętrznych podciągnięć, gdy ATMega ma napięcie 5 V, a urządzenie i2c jest urządzeniem tylko 3,3 V, może powodować problemy. Lub jeśli masz wewnętrzne podciągnięcia i zewnętrzne rezystory podłączone do napięcia 3,3 V lub innego napięcia, mogą również powodować problemy. Zasadniczo jest to celowo zignorowany błąd w bibliotece Wire.

Przechodzień
źródło
4
+1 - You do have pull-ups, just not ones you expected.- Chyba go przybiłeś. Dzięki!
Ricardo
Właśnie dlatego wiesz, że dodałem kilka ujęć z zakresu, aby pomóc wyjaśnić, co się dzieje z moją konfiguracją.
Ricardo
2
@Ricardo tak, widząc je, w 33kHz. Jedna trzecia najniższej prędkości i2c, a sygnał jest nadal bardzo zły. Przy 100 kHz lub 400 kHz nie miałbyś działającej komunikacji. Świetną rzeczą jest to, że wiele urządzeń i2c działa z ułamkiem maksymalnych prędkości. Wystarczy pamiętać, wewnętrzne pullups może wynosić do 70k ohm, typowy rezystor I2C jest 4.7K
Przechodzień
8

Zasadniczo potrzebne będą rezystory podciągające dla obwodu interfejsu I 2 C. Jeśli interfejs ma naprawdę pełną specyfikację I 2 C na obu końcach przewodów, wówczas linie sygnałowe bez rezystorów nigdy nie będą mogły przejść na wysoki poziom. Mogą pozostawać na niskim poziomie lub przejść do poziomu pośredniego określonego przez prąd upływu w częściach na każdym końcu. Powodem tego jest fakt, że true I 2 C to autobus z otwartym odpływem.

Niektóre urządzenia mogą rzeczywiście mieć pull-up na chipie w 20K do 100K ohm wahać tylko trzymać piny interfejsu na wysokim poziomie nieaktywnym gdy mam 2 interfejs C na części nie jest w użyciu. W przypadku prostych i krótkich interfejsów te rezystory podciągające mogą być wystarczające do zapewnienia prądu potrzebnego do ciągnięcia linii wysoko podczas sygnalizowania zegarów i / lub danych.

Trudno powiedzieć na podstawie twojego schematu, ale w niektórych przypadkach interfejsy I 2 C są implementowane przy użyciu pinów portu we / wy ogólnego przeznaczenia, a następnie bitowane w oprogramowaniu. Czasami implementator może nie obsługiwać styków we / wy w tej konfiguracji przy użyciu metodologii otwartego spustu i może to mieć wpływ na to, dlaczego interfejs bez rezystorów pullup może wydawać się działać.

Pod koniec dnia prawdopodobnie jesteś to winien samemu sprawdzić sygnalizację na jednym ze swoich wcześniejszych zegarów za pomocą oscyloskopu, aby sprawdzić, czy cyfry 1 i 0 na interfejsie działają w ramach określonych poziomów napięcia. Wtedy na pewno będziesz wiedział, czy po prostu miałeś niewiarygodne szczęście z tą implementacją, czy też gra jeden z wyżej wymienionych czynników.

Michael Karas
źródło
4

Co się stanie, gdy podciągnięcia I2C zostaną pominięte?

Najprawdopodobniej magistrala I2C po prostu nie będzie działać.

Brak podciągnięć może uszkodzić którykolwiek z tych dwóch układów scalonych na mojej planszy?

Najprawdopodobniej nie.

The Photon
źródło
3

Twoje linie I2C w ogóle nie będą działać. Jeśli się nie mylę, I2C po prostu zapewnia niskie sygnały, ale nie przywraca ich z powrotem do stanu wysokiego, dlatego potrzebujesz tych rezystorów.

Brak podciągnięć nie powinien uszkodzić żadnego układu scalonego.

Funkyguy
źródło
Piny I2C są otwarte.
Matt Young,
1

I2C jest protokołem logicznym TTL; więc twoje linie danych i zegara są otwarte. Innymi słowy, sprzęt I2C może prowadzić tylko te linie na niskim poziomie; pozostają zmienne, gdy nie są zerem. Tam właśnie wchodzą rezystory podciągające. To uproszczony schemat, ale działajcie ze mną przez chwilę.

schematyczny

symulacja tego obwodu - Schemat utworzony za pomocą CircuitLab


Jak widzisz; rezystor podciągający jest potrzebny do zapewnienia, że ​​logika 1 jest widoczna na wyjściu, gdy logika TTL nie powoduje niskiego poziomu wyjściowego. Logika TTL nie może prowadzić linii wysoko, jak już wspomniałem. Gdyby tego nie było, wynik pozostawiałby zmienny i byłoby nieprzewidywalne, co można zobaczyć na wyjściu (o ile wiesz, mikrofalówka lub zaburzenia jelitowe twoich współpracowników spowodowane przez pewnego pozbawionego cukru gumowatego niedźwiedzia mogą powodować wartość do zmiany).

Teraz, jeśli miałbyś zaimplementować I2C w oprogramowaniu z mikrokontrolerem, prawdopodobnie nie byłby to zbyt duży problem, ponieważ najprawdopodobniej użyłby logiki CMOS, która może napędzać wyjścia zarówno wysokie, jak i niskie.

audiFanatic
źródło
1
Cieszę się, że pomogło.
audiFanatic
2
Niezależnie od tego, czy urządzenia używają logiki TTL lub CMOS, nie ma znaczenia - normalne wyjścia TTL i normalne CMOS będą ciągnąć sygnał zarówno w górę, jak i w dół. Sygnały I2C to albo TTL z otwartym kolektorem, albo (bardziej prawdopodobne) CMOS z otwartym dnem - w obu przypadkach brak tranzystora, który wyciągałby wysoki sygnał ze stopnia wyjściowego źródła, więc rezystory podciągające są wymagane do pociągnij sygnały wysoko. Możliwe, że mikrokontroler ma wewnętrzne podciągnięcia na tych półkach.
Peter Bennett,
3
-1 Jak powiedział Peter Bennett, wiele z tych odpowiedzi jest po prostu błędnych. Nazywanie sygnałów TTL „open-drain” to gratka.
Joe Hass
Zauważ, że korzystanie z I2C z TTL ma zalety, a mianowicie to, że często nie potrzebujesz translatorów poziomów do obsługi komponentów o różnych napięciach zasilania podłączonych do tej samej magistrali. Po prostu ustawienie napięcia pullup na najwyższe akceptowalne napięcie wejściowe układu o najniższym napięciu jest wielokrotnie wystarczające dla stopni wejściowych TTL . W przypadku CMOS to nie działałoby.
Ben Voigt
@BenVoigt: Nie - wywoływanie konfiguracji „wymaga rezystora podciągającego” „TTL” jest nieprawidłowe, ponieważ takie ustawienie można wykonać z CMOS lub TTL, a DS1307 jest częścią CMOS. Arkusz danych Maxim wyraźnie stwierdza, że ​​wyjścia są otwarte, a schemat blokowy pokazuje FET dla jednego wyjścia.
Peter Bennett,
0

Kiedy bit Bang I2C z mikro jako master, który dostarcza zegar, byłem w stanie prowadzić SCL bez podciągania.

Jednak SDA musi mieć OC z pullupem, aby urządzenie slave mogło ściągnąć i odpowiednio zareagować.

pozdrowienia

Wayne
źródło