- szerokiemu zakresowi napięć zasilania 1,8–5,5 V,
- aktywny kanał (jeden lub kilka) wybierany poprzez bezpośrednią konfigurację jednego rejestru,
- nie wymaga dodatkowych wyprowadzeń sterujących,
- na jednej magistrali może współpracować do ośmiu takich układów, co daje możliwość współpracy z 64 układami slave.
Moduł bazuje na układzie multipleksera magistrali I2C typu TCA9548A, którego schemat wewnętrzny został pokazany na rysunku 2. W swojej strukturze układ zawiera ośmiokanałowy multiplekser cyfrowy, którego aktywny kanał (jeden lub kilka) wybierany jest poprzez bezpośrednią konfigurację rejestru i nie wymaga dodatkowych wyprowadzeń sterujących. Dzięki elastycznej adresacji na jednej magistrali może współpracować do ośmiu takich układów, co daje możliwość współpracy z 64 układami slave pozbawionymi możliwości zmiany adresacji, o ile utrzymamy parametry elektryczne magistrali I2C.
Budowa i działanie
Schemat ideowy modułu jest pokazany na rysunku 1. Sygnały magistrali I2C wraz z zasilaniem (3,3 V) dla części cyfrowej doprowadzone są ze złącza GPIO, gdy moduł podłączony jest do Raspberry Pi lub ze złącz I2CA, I2CB w przypadku innych płytek uruchomieniowych.
Magistrala I2C od strony układu master doprowadzona jest do wejścia multipleksera – wyprowadzenia SC, SDA U1. Linie magistrali wraz z zasilaniem dla układów slave wyprowadzone sa na dwie grupy złącz I2C0...I2C7 (PH 2 mm) i I2C01...I2C67 (szpilkowe 2,54 mm).
Dioda LD sygnalizuje obecność zasilania, rezystory RP1...RP5 podciągają wstępnie magistralę, ich wartość można zoptymalizować w zależności od docelowego napięcia zasilania układu. Zwory A0...A2 umożliwiają zdefiniowanie adresu bazowego TCA9548A pomiędzy 0x70...0x77. Domyślnie na płytce wszystkie ustawione są w stan wysoki (zwarcie do V33), a układ U1 widoczny jest pod adresem 0x77.
Układ TCA9548A ma tylko jeden 8 bitowy rejestr kontrolny pod ustawionym adresem bazowym, który można odczytywać i zapisywać. Domyślnie po włączeniu zasilania wszystkie magistrale są odłączone i w rejestrze inicjowana jest wartość 0x00. Ustawienie kolejne bitów od B0 do B7 aktywuje klucze odpowiadające magistralom I2C0 do I2C7. Zapis wartości 0x01 wybiera odpowiednio magistralę I2C0, zapis 0x80 magistralę I2C7. TCA9548A umożliwia jednoczesne załączenie kilku magistral, po ustawieniu w rejestrze sterującym odpowiadających im bitów – trzeba zwrócić szczególną uwagę czy taka sytuacja nie doprowadzi do zablokowania lub nie przekroczy dopuszczalnych pojemności obciążenia magistrali.
Montaż i uruchomienie
Moduł został zmontowany na dwustronnej płytce drukowanej, której schemat został pokazany na rysunku 3. Sposób montażu jest klasyczny i nie wymaga opisu. Zmontowany moduł pokazuje fotografia tytułowa. Zamiennie do ukłądu TCA9548A (TI) można zastosować układ PCA9548A (NXP).
Dla sprawdzenia modułu podłączonego do Raspberry Pi można użyć narzędzia z pakietu i2ctools. Sprawdzamy obecność modułu na magistrali:
pi@raspberrypi:~ $ i2cdetect -y 1, efekt został pokazany na listingu 1.
pi@raspberrypi:~ $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- 04 -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77
Po włączeniu zasilania TCA9548A widoczny jest pod adresem 0x77 i ma odłączone wszystkie wyjścia multipleksera. Aktywny kanał I2C0, wybieramy poleceniem:
po ponownym skanowaniu magistrali widoczne są wszystkie zainstalowane na module przetworniki dostępne poprzez I2C0 oraz układy dostępne po „pierwotnej” stronie multipleksera – listing 2.
pi@raspberrypi:~ $ i2cset -y 1 0x77 0x01
pi@raspberrypi:~ $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- 04 -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- 29 -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU 49 -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- 58 -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77
Aby wybrać drugi kanał I2C1 wykonujemy polecenie:
i ponownie sprawdzamy magistralę. Tym razem widoczne są czujniki z kanału I2C1. Metoda współpracy z TCA9548A jest bardzo prosta, ale wymaga każdorazowego przełączenia się na odpowiednią magistralę.
Drugą znacznie bardziej efektywną metodą jest użycie sterownika systemowego. W tym celu w pliku config.txt dodajemy linię:
Jeżeli mamy ustawiony inny adres zworami A0...A2, to musimy odpowiednio zmodyfikować parametr adrr. Po restarcie systemu poleceniem:
powinien zostać uruchomiony driver dla TCA9548A. Magistralę po „wtórnej” stronie multipleksera (i2c-1-mux) są teraz „zmapowane” od i2c-mux-7 do i2cmux-13 i w taki sposób należy odwoływać się do nich w systemie. Sprawdzenie mapowania odbywa się poleceniem:
Odpowiedź została pokazana na listingu 3.
pi@raspberrypi:~ $ i2cdetect -l
i2c-13 i2c i2c-1-mux (chan_id 6) I2C adapter
i2c-1 i2c bcm2835 I2C adapter I2C adapter
i2c-11 i2c i2c-1-mux (chan_id 4) I2C adapter
i2c-8 i2c i2c-1-mux (chan_id 1) I2C adapter
i2c-14 i2c i2c-1-mux (chan_id 7) I2C adapter
i2c-12 i2c i2c-1-mux (chan_id 5) I2C adapter
i2c-9 i2c i2c-1-mux (chan_id 2) I2C adapter
i2c-10 i2c i2c-1-mux (chan_id 3) I2C adapter
i2c-7 i2c i2c-1-mux (chan_id 0) I2C adapter
Mapowanie magistral zależy od konfiguracji Raspberry Pi, poszczególne magistrale mogą mieć nadane inne identyfikatory, sposób użycia pozostaje jednak nie zmieniony. Przykładowo sprawdzenie układów na magistrali I2C3, (chan_id 3) odbywa się poleceniem:
Adam Tatuś, EP
- RP1…RP5: 4,7 kΩ drabinka rezystorowa SMD CRA06S08
- C1…C4, C8, C9: 4,7 µF SMD0603
- C5, C7: 0,1 µF SMD0603
- LD: dioda LED SMD0805
- U1: TCA9458APWR (TSSOP24)
- A0…A2: zwora SMD0603
- GPIO: złącze IDC żeńskie
- I2C0, I2C1…I2C7: złącze PH 2 mm 4 piny proste
- I2C01, I2C23, I2C45, I2C67: złącze IDC kątowe męskie 2×4 piny 2,54 mm
- I2CA: złącze SIP proste męskie 1×4 piny 2,54 mm
- I2CB: złącze JST 1 mm 4 piny kątowe