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:
Dla zainteresowanych, załączę przykładowy kod.
Pozdrawiam
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:
Dla zainteresowanych, załączę przykładowy kod.
Pozdrawiam
Fajne? Ranking DIY