Jak rozwiązać konflikty adresów I2C?

39

Chcę podłączyć wiele urządzeń podrzędnych I2C do mikrokontrolera, wszystkie na tym samym zestawie pinów, ale wszystkie urządzenia I2C mają ten sam adres. Adresy są ustalone w sprzęcie.

Czy istnieje sposób na połączenie wielu urządzeń z tym samym adresem?

Być może jakiś moduł translacji adresów I2C dla każdego urządzenia z konfigurowalnym adresem, aby móc przypisać własne adresy do każdego z nich.

Simon P. Stevens
źródło

Odpowiedzi:

24

Nie ma nic wbudowanego w I2C, aby to zrobić, normalnie urządzenia podrzędne będą miały niektóre zewnętrzne styki, które można ustawić na 0 lub 1, aby przełączać kilka bitów adresu, aby uniknąć tego problemu. Alternatywnie miałem do czynienia z kilkoma producentami, którzy mają 4 lub 5 numerów części dla jednej części, jedyną różnicą jest jej adres I2C.

Większość urządzeń ma określony sprzęt, który obsługuje komunikację I2C, to znaczy, że slave ACK jest w sprzęcie, więc naprawdę nie możesz się włamać.

Jeśli chodzi o moduł tłumaczący, możesz kupić jakieś 0,50 USD PIC z 2 magistralami I2C i napisać szybki kod, aby działały jak translatory adresów.

znak
źródło
Dzięki. Tak, te urządzenia mają wybór adresu, ale tylko między dwoma adresami i chcę podłączyć urządzenia 5+, więc nadal będę się starał. Nie myślałem o użyciu PIC. To powinno działać. Czy z półki nie ma nic, co robi takie rzeczy?
Simon P Stevens,
11
NXP tworzy kilka multiplekserów / przełączników dla I2C, możesz być w stanie zmontować coś z tych: ics.nxp.com/products/i2cmuxes, na przykład możesz stworzyć w swoim przypadku 3 gałęzie podrzędne, każdy z 2 urządzeniami na nim i użyj jednego z przełączników NXP, aby osiągnąć swój cel.
Mark
Świetnie, właśnie tego szukałem. Po prostu nie znałem imienia. Dzięki.
Simon P Stevens,
Ta odpowiedź ma 7 lat, więc uważam, że mogła być najlepsza w chwili jej zaoferowania. Jednak w przypadku innych, którzy przechodzą teraz, niektóre z dużo nowszych odpowiedzi (obecnie niżej umieszczone na liście) oferują potencjalnie lepsze podejście w oparciu o nowsze komponenty, które są obecnie na rynku.
Cegła
6

Właśnie napotkałem ten problem z wieloma urządzeniami I2C o stałym adresie. Naszym rozwiązaniem było użycie linii I / O na mikrokontrolerze do wymuszenia linii SDA wysoko na urządzeniach, których nie chcemy adresować, podczas gdy linia I / O dla urządzenia, na które celujemy, jest ustawiona jako wejście (wysoka impedancja ). Oznacza to, że tylko urządzenie docelowe jest zgodne z jego adresem I2C, a pozostałe ignorują kolejne dane.

Wiele urządzeń I2C o tym samym adresie

Rezystory na linii SDA dla nieaktywnych urządzeń ostatecznie działają jako podciągnięcia dla magistrali, więc dokładna wartość będzie zależeć od liczby posiadanych urządzeń i tego, jakiego podciągania potrzebujesz dla swojej magistrali. Więc jeśli wybierzesz rezystory 10K, 3 nieaktywne urządzenia podciągną 3K3.

Diody Schottky'ego zapewniają, że urządzenie nadal może wystarczająco nisko przeciągnąć linię SDA podczas przesyłania danych z powrotem do hosta.

Peter Gibson
źródło
Doceniam to, że śledziłeś i opublikowałeś to. To dość genialne rozwiązanie, jestem pewien, że będzie pomocne dla innych.
Simon P. Stevens,
Ładna nisza, która może być używana w niektórych aplikacjach. Bardzo to lubię.
Harry Svensson,
5

Jeśli żadne z urządzeń I2C nie używa rozciągania zegara (uzgadniania), a jeśli bit-banging w I2C master, prosty hack polega na tym, że niektóre urządzenia zamieniają zegar i piny danych. Podczas transmisji bajtu urządzenie z zamienionym zegarem i pinami danych zobaczy każdy bit „0” jako nieistnienie (dane rosną i spadają bez zegara) i zobaczy każdy bit „1” jako zatrzymanie I2C i start (wzrost zegara, gdy dane są niskie, odliczanie wzrostu i spadku danych, a następnie spadek zegara). Celowe warunki zatrzymania i uruchomienia dla jednego urządzenia mogą być postrzegane przez drugi jako bity danych, ale chyba że jedno urządzenie ma nadmierną liczbę warunków uruchomienia i zatrzymania między bitami „1”, jest mało prawdopodobne, aby jakiekolwiek urządzenie „przypadkowo”

supercat
źródło
6
Nie oddaję głosu, ale wydaje mi się to trochę ryzykowne. Moje doświadczenie z I2C polega na tym, że jest wystarczająco podatny na zakłócenia przy zwykłym połączeniu. Jednak używasz słowa „hack” i wspominasz o zastrzeżeniu „jeśli żadne z urządzeń i2c nie używa rozciągania zegara”, więc jeśli może to dla kogoś zadziałać, to dla niego więcej mocy.
Jason S
5

Rozważę użycie przełączników magistrali do multipleksowania magistrali I2C między urządzeniami z konfliktowymi adresami. Przełączniki magistrali mają bardzo niską pojemność i rezystancję, aw przeciwieństwie do buforów / sterowników, są prawdziwymi przełącznikami, które łączą lub rozłączają dwa węzły obwodu.

Przełączniki magistrali mają zwykle jedną dziwną cechę, która nie ma znaczenia dla I2C, ponieważ wykorzystuje urządzenia z otwartym drenem: przełącznik magistrali ma niską rezystancję podczas łączenia ze sobą napięć w pobliżu 0 (Vss), ale rezystancja rośnie dramatycznie w miarę zbliżania się napięć zasilacz Vdd. (Dzieje się tak, ponieważ są to w zasadzie tranzystory MOSFET z napięciami bramki na zasilaczu, kiedy się włączają, więc gdy napięcia przełączane zbliżają się do Vdd, dostępne Vgs są znacznie niższe)

Jason S.
źródło
1
Link jest zepsuty. fairchildsemi.com/product-technology/bus-switches działa lepiej.
florisla
4

Miałem dwa czujniki światła barwnego TCS3414, które chciałem porównać (pakiety FN i CS, które mają różne filtry). Adres I2C jest podłączony na stałe. Po przyjrzeniu się, jak działa I2C w odniesieniu do linii SCL (zegar) i SDA (dane), wydawało się, że wyłączenie linii SDA zapobiegnie uruchomieniu bitu startu lub stopu, a tym samym stanie się nieaktywne. Tak więc użyłem przełącznika analogowego CMOS (4066B) do włączenia lub wyłączenia linii SDA do każdego urządzenia. Działa to dobrze w przypadku przełączania między dwoma urządzeniami. Wiem, że to hack, a PCA9548 byłby znacznie lepszy, ale nie miałem jednej poręcznej.

David Hill
źródło
Właściwie to wcale nie jest hack i twierdzę, że to powinna być zaakceptowana odpowiedź. Widziałem to stosowane w kilku komercyjnych produktach i nie mogę wymyślić lepszego rozwiązania (chyba że nie masz dostępnego GPIO, a zatem potrzebujesz czystego rozwiązania I2C, takiego jak multipleksy specyficzne dla I2C). Dobre stare analogowe multipleksery mają dużą przepustowość i są szalenie tanie.
Jay Carlson
4

Teraz jest odpowiedź - Linear Tech ma serię translatorów adresów LTC4316 / 17/18. Są stosunkowo nowe, a ich dostępność jest niepewna.

użytkownik3608541
źródło
Bardzo interesujący komponent. Większość urządzeń I2C ma 2 stałe adresy, co może LTC4316 potencjalnie podwoić adresowanie przy rozsądnych kosztach.
Mehrad
4

Kilku producentów oferuje multipleksery i przełączniki z magistralą I2C.

Multiplekser może aktywować jeden kanał na raz; przełącznik może włączyć wiele z nich równolegle.

Sprawdź na przykład oferty NXP , TI i Maxim .

Do eksperymentów Adafruit ma tablicę TCA9548a .

Jeśli masz 8 układów docelowych z identycznymi adresami, wybierz MUX 8-to-one. Przed uzyskaniem dostępu do dowolnego z docelowych układów scalonych skonfiguruj MUX, aby aktywować prawidłową magistralę I2C.

Zalety

  • Nie wymaga programowania (podejście oparte na mikrokontrolerze)
  • Może obsługiwać funkcje I2C i potrzebne prędkości (w porównaniu ze zwykłymi multiplekserami magistrali analogowej / cyfrowej). Na przykład zwykły (nie-I2C) MUX nie przekaże ogólnych adresów połączeń do wszystkich swoich kanałów.
florisla
źródło
-1

Użyj prostego układu demultipleksera (np. 74HC139 afaik) i podłącz pin I2C CLK do wejścia (ponieważ pin I2C CLK jest tylko wyjściowy). Użyj pinów GPIO do kontrolowania pożądanego wyjścia. Następnie pin danych I2C może być współdzielony przez wszystkie urządzenia podrzędne.

Sokrates
źródło
6
SCL nie jest tylko wyjściem. Niewolnik może rozciągnąć zegar, jeśli będzie musiał go spowolnić.
stevenvh
Możesz użyć multipleksera analogowego (który jest dwukierunkowy), ale dekoder może nie działać z powodu podanego przez stevenh. Jeśli używasz multipleksera, będziesz potrzebować słabej pulpy po stronie slave, aby upewnić się, że jest nieaktywna. Zmieniaj także wybór multipleksera tylko wtedy, gdy magistrala nie pracuje.
Kevin White,