poniedziałek, 22 lutego 2016

Ustalanie adresów modułów I2C (TWI)

Ustalenie adresu modułu (układu) komunikującego się z  mikrokontrolerem po magistrali I2C (TWI według Atmel'owskiego nazewnictwa) bywa czasem problematyczne. Przy tworzeniu własnego modułu, na przykład z przetwornikiem DAC MCP4725 w moim przypadku, sprawa była prosta, Miałem tu pełną kontrolę nad ustaleniem adresu modułu zgodnie z regułami opisanymi w dokumentacji. Z drugiej strony, może się przytrafić  moduł, taki jak LM1602  służący do komunikacji mikrokontrolera z wyświetlaczem LCD (ze sterownikiem HD44780). W jego opisie na stronie aukcji nie było mowy o żadnym adresie i jedynie widoczne na pierwszy rzut oka rozmieszczone na płytce trzy zworki A[2...0] sugerujące coś wspólnego z ustalaniem adresu modułu. Teraz już wiem, że to duża podpowiedź co do adresu (zapoznawszy się uprzednio z dokumentacją użytego tam PCF8574). Pierwszy raz uruchamiając układ, nie byłem jednak taki mądry :)

Przechodząc do setna, chciałem  przedstawić kilka sposobów na rozwiązanie problemu z ustaleniem adresu.

Raspberry Pi

Najwygodniejszym i najszybszym sposobem na ustalenie adresu modułu I2C jest skorzystanie z Raspberry Pi, o ile je posiadamy. Dla samego zastosowania jako skaner magistrali I2C, to zdecydowanie za droga zabawka. Na szczęście ma dużo większe możliwości i przyda się do innych zastosowań.
Na Raspberry Pi można uruchomić pełnoprawny system operacyjny, w moim przypadku Raspian. Jest to wersja linuxa (debiana), co może stwarzać istotne problemy dla osób dotąd korzystających z Windows. W sieci można jednak znaleźć pod hasłem "raspberry pi i2c configuration" kilka poradników, w tym ten ze strony adafruit z którego ja korzystałem. Wprawdzie na początku trzeba trochę namęczyć się z konfiguracją, ale potem jest już z górki. Wystarczy podpiąć badany moduł pod piny SDA, SCL (najlepiej z użyciem "Rozszerzenia GPIO" do płytki stykowej) i wykonać polecenie z konsoli i2cdetect z odpowiednim parametrem. Poniżej dołączam zrzut ekranu z wyników działania tego programu dla modułu LM1602. Wyznaczony adres to 27 w zapisie szesnastkowym.

Wynik działania skanera I2C  - Raspberry Pi

Arduino Uno

Równie dobrym sposobem (i znacznie tańszym niż ten z Raspberry Pi), jest skorzystanie z Arduino Uno i skryptu i2c_scanner. Kod skryptu wklejamy do IDE Arduino i wgrywamy. Teraz wystarczy uruchomić okno "Szeregowego monitora". Uruchomiony skaner wyświetli adres naszego modułu. Na załączonym zrzucie przy sprawdzaniu modułu LM1602 skaner ustalił jego adres równy 0x27.

Wynik działania skanera I2C - Arduino Uno

ATmega 8

Leciwy mikrokontroler, ale akurat taki miałem pod ręką. Posłużył mi do realizacji prostego modułu do sterowania zasilaczem. W zamierzeniu ma on wykorzystać I2C m.in. do sterowania wyświetlaczem LCD. Nawiasem mówiąc, stąd w ogóle przyszedł mi pomysł na ten post. Mimo dobrych chęci nie udało mi się nic znaleźć w tym temacie w sieci (tj. skanera). Tak więc sam napisałem własny, prosty kod w C w oparciu o bibliotekę  I2C Petera Fleury'ego. Kod można pobrać pod tym linkiem. Zakłada on częstotliwość taktowania ATmegi 16MHz, a magistrali I2C 100kHz. W razie konieczności można zmienić te parametry modyfikując odpowiednio stałe F_CPU i SCL_CLOCK w pliku twimaster.c. Z kolei prędkość transmisji danych do terminala wynosi 9600bps co widać (i inne ustawienia) na dołączonym poniżej obrazku prezentującym efekt działania skanera.
Wynik działania skanera I2C  - ATmega, skrypt w C

Woltomierz

Inną możliwością, wspomnianą na wstępie, jest wyszukanie w dokumentacji układu scalonego (użytego w badanym module) informacji o pinach odpowiedzialnych za konfigurację adresu oraz ich wpływu na ostateczną postać adresu. Pomiar napięcia na tych pinach pozwoli poznać adres modułu.

Brak komentarzy:

Prześlij komentarz