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.
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.
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.
źródło
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”
źródło
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)
źródło
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.
źródło
Teraz jest odpowiedź - Linear Tech ma serię translatorów adresów LTC4316 / 17/18. Są stosunkowo nowe, a ich dostępność jest niepewna.
źródło
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
źródło
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.
źródło