logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Konwerter adresów I2C dla INA3221 na Arduino

viayner 30 Kwi 2024 12:25 2025 8

TL;DR LABEL_AI_GENERATED

  • Powstał sprzętowy translator adresów I2C dla INA3221 na Arduino Leonardo MicroPro, który pozwala podłączyć drugi układ pomiarowy mimo konfliktu adresów na platformach Jetson/Xavier.
  • Arduino odbiera żądania na dowolnym adresie, dekoduje je sprzętowym I2C i odpyta INA3221 przez programowy I2C, po czym odsyła dane jak z innego adresu.
  • INA3221 pracuje na adresach 0x40–0x43, a przykładowy adres zastępczy w projekcie wynosi 0x37.
  • Takie mapowanie działa, ale obniża szybkość transmisji; w tym zastosowaniu nie stanowi to problemu, bo odczyt i tak jest wolniejszy od możliwości magistrali.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
Słuchaj:
  • Witam,
    chciałbym zaprezentować układ, który powstał w ciągu "paru minut" z potrzeby chwili.
    Od początku.
    Pracuję z układami, w których pracują układy Nvidia Jetson, Xavier itd. W skrócie CPU/GPU z Linuxem. Muszę do niego podłączyć INA3221 w celach pomiarowych. Proste, ale na płytkach jest już INA3221 stosowana do innych celów, podłączenie drugiego układu INA3221 powoduje, że przy bootowaniu sterownik rezerwuje dany adres I2C i komunikacja z danym układem jest zablokowana z punktu widzenia programu.
    Rozwiązaniem jest modyfikacja kernela, ale zdecydowałem się na dodanie sprzętowego translatora.
    Jak to działa?
    Prawie każdy mikrokontroler ma port I2C, nie każdy ma drugi port, ale tu można użyć programowego portu. Do projektu wybrałem Arduino Leonardo MicroPro (taki był pod ręką i jest stosunkowo mały).
    W skrócie, INA3221 komunikuje się na adresach 0x40-0x43, ale tych nie mogę u siebie użyć. Więc urządzenie master wysyła zadanie odczytu danych z INA3221 na adresie dobranym wg. potrzeb, przykładowo 0x37. Arduino (I2C sprzętowy) dekoduje adres i komendę, a następnie komunikuje się z INA3221 przez programowy I2C, odczytuje co potrzeba i wysyła sprzętowym I2C.
    Czyli sumarycznie INA3221 odpowiada/reaguje jakby była na innym fizycznym adresie.
    Oczywiście takie "machlojki" z adresami nie zostają bez wpływu na szybkość całej transmisji, ale to akurat u mnie nie jest czynnikiem, jako że odczyt danych jest o parę rzędów wolniejszy niż całość jest w stanie zapewnić.
    Zdjęcie prototypu:
    Zdjęcie prototypowego układu z Arduino Leonardo MicroPro i INA3221
    Dla zainteresowanych, załączę przykładowy kod.
    Pozdrawiam

    Fajne? Ranking DIY
    O autorze
    viayner
    Poziom 43  
    Offline 
    viayner napisał 10638 postów o ocenie 2052, pomógł 1563 razy. Mieszka w mieście Oulu. Jest z nami od 2006 roku.
  • REKLAMA
  • #2 21065532
    gulson
    Administrator Systemowy
    Posty: 29522
    Pomógł: 150
    Ocena: 6121
    Ciekawe zastosowanie Arduino :) Jak możesz się podzielić fragmentem kodu to byłoby super. Wyślij adres (może być do Finlandii) i prześlę mały upominek :)
    Przy okazji napisz, jak tam w Finlandii z branżą elektroniki i czy są bojowe nastroje? :)
  • REKLAMA
  • #3 21065706
    Konto nie istnieje
    Poziom 1  
  • #4 21067308
    viayner
    Poziom 43  
    Posty: 10638
    Pomógł: 1563
    Ocena: 2052
    Witam,
    Dziękuję za zainteresowanie.
    Układ powstał, jak wspomniałem, z potrzeby chwili i wykorzystałem to, co było pod ręką, dlatego wybór padł na Arduino Leonardo MicroPro. Testowałem w domu PIC'e i STM32F103xxx, jako że mają kilka sprzętowych I2C, całość działa równie dobrze, a zapewne ewentualne opóźnienia czy wpływ szybkości mogą być zminimalizowane.
    Z drugiej strony używanie zaawansowanych mikrokontrolerów do tak prostego zadania to przerost formy nad treścią, ale wykorzystuje się co się ma :)
    Obiecany kawałek kodu:
    Kod: Arduino
    Zaloguj się, aby zobaczyć kod

    To był mój punkt wyjścia, powstał w 10 minut z analizy kodów demo dołączanych do bibliotek. Realizuje on tylko odczyt rejestrów z INA3221 w moim przypadku.
    Pozdrawiam
    PS jeszcze odnośnie porównania do LTC4316.
    - zmiana adresu na Arduino chyba jest nieco łatwiejsza niż dobór rezystorów w LTC
    - koledzy u mnie już mają plany do czego wykorzystać wolne/pozostałe piny Arduino :)
    - Arduino może mieć nieco bardziej uniwersalne zastosowanie, dołożenie np. I2C na serial, SPI czy 1-wire to 5min.
  • REKLAMA
  • REKLAMA
  • #6 21068275
    viayner
    Poziom 43  
    Posty: 10638
    Pomógł: 1563
    Ocena: 2052
    Witam,
    irekplwr napisał:
    Zobacz manual ze strony
    https://www.ti.com/lit/ds/symlink/ina3221.pdf...f_url=https%253A%252F%252Fwww.google.com%252F
    dokładnie opisane jak ustawić adres INa3221. Na stronie 20 w tablicy 1 masz podane jak ustawić jeden z czterech adresów przez połaczenie wejścia A0 do Vcc, gnc, sda, scl
    Powodzenia

    Dziękuję za uwagę, przepraszam ale nie bardzo widzę do czego miałaby się przydać przynajmniej dla mnie i mojego zastosowania? Patrz/czytaj początek mojego pierwszego wpisu.
    Pozdrawiam
  • #7 21116186
    viayner
    Poziom 43  
    Posty: 10638
    Pomógł: 1563
    Ocena: 2052
    Witam,
    ostatnio miałem godzinkę "wolnego" i postanowiłem "wzbogacić" mój układ o funkcjonalność sugerowanego linera LTC4316.
    Załączam wersję prostszą posiadającą tylko jeden pin do podłączenia rezystorów określających translację adresów (u mnie A0), nic nie stoi na przeszkodzie aby dodać drugi pin i uzyskać XORL i XORH jak w przypadku linera. Załączam raczej demo jak do tego można podejść.
    Na początku jest wymagany delay około 1-2s na stabilizację, ja sprawdzam wartości translacji adresu tylko na początku ale działa to równie dobrze (z uwzględnieniem spadku szybkości) gdy jest to realizowane za każdym razem gdy zaczynamy transmisję. Kod nie jest optymalizowany, to raczej działające demo, że można tak zrobić.
    Pozdrawiam
    Kod: Arduino
    Zaloguj się, aby zobaczyć kod
  • #9 21127875
    viayner
    Poziom 43  
    Posty: 10638
    Pomógł: 1563
    Ocena: 2052
    Witam,
    Dziękuję za zainteresowanie.
    Może spojrz na pierwszy post, nie do końca szukam gotowego rozwiązania, a chwilowego rozwiązania.
    Pod ręką było Arduino, więc go wykorzystałem i jak się okazało, wyszło ciekawe rozwiązanie.
    W projekcie finalnym będę korzystał z Lineara głównie ze względu na rozmiary.
    Arduino było użyte raczej jako PoC.
    Twoje rozwiązanie ma jeden potencjalny problem, muszę go adresować, aby wybrać kanał, moje rozwiązanie jest transparentne, nie wymaga żadnych zmian w oprogramowaniu czy transmisji.
    Pozdrawiam
Słuchaj:

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zaprezentował rozwiązanie problemu z podłączeniem dwóch układów INA3221 do systemu opartego na Nvidia Jetson, gdzie konflikt adresów I2C uniemożliwiał komunikację. Zamiast modyfikacji kernela, zdecydował się na użycie Arduino Leonardo MicroPro jako sprzętowego translatora adresów I2C. W dyskusji poruszono różne podejścia, w tym użycie gotowych translatorów, takich jak LTC4316 oraz TCA9548A, które umożliwiają podłączenie wielu urządzeń o tym samym adresie. Użytkownik podzielił się fragmentem kodu oraz wskazówkami dotyczącymi konfiguracji adresów INA3221.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA