Dzisiaj chciałbym zaprezentować niezwykły skaner i tester urządzeń magistrali i2c!
Magistrala i2c, mimo, że dość wiekowa, ani trochę nie straciła na swojej popularności, wręcz przeciwnie, ciągle pojawiają się coraz to nowe układy korzystające z jej dobrodziejstw. Często zdarza się (przynajmniej mi), że mając nowy układ, po przeczytaniu datasheeta mam ochotę sprawdzić, czy dobrze zrozumiałem funkcje poszczególnych rejestrów, czy wartości zwracane przez procesor są takie, jakich się spodziewam. Zwykle w takim wypadku piszę prosty programik na procesor, montuję procesor do płytki prototypowej, podłączam go do ft232, programuję procesor i za pomocą terminala odczytuje dane. Jeśli coś pójdzie nie tak, odczytam nie ten rejestr, wpiszę złą wartość do innego, muszę poprawić program, przekompilować go, zaprogramować procesor i liczyć, że wszystko będzie ok! Kilka dni temu wpadłem na pomysł, jak procedurę testowania uprościć i w tym celu napisałem program IIC Tester.
Program wykorzystuje moduł FT232 do komunikacji z urządeniem i2c. Dzięki funkcji “bitbang” układu ft232 obywa się to bez pośrednictwa procesora!
Podłączenie
Aby używać modułu, wystarczy podłączyć linie SDA i SCL badanego układu do którejś z następujących linii układu FT232 (lub przejściówki opartej na tym układzie): TXD; RXD; RTS#; CTS#; DTR#; DSR#; DCD#; RI#. Oczywiście pamiętać należy o rezystorach podciągających obie linie do VCC! Następnie zaznaczamy w programie, które linie zostały wybrane i nacisnąć “Scan for I2C devices”. Urządzenia powinny zostać wykryte:
UWAGA: adresy urządzeń podawane są w formie 7 bitowej, niektóre datasheety podają adresy w formacie 8 bitowym, aby zamienić format 7 bitowy na 8 bitowy, wystarczy adres pomnożyć przez 2 i na odwrót).
Testowanie urządzenia
W celu komunikacji z urządzeniem, zapisywania i odczytywania z niego danych stworzyłem kilka prostych komend, za pomocą których opisujemy transmisję. Oto te komendy:
1 2 3 4 5 |
start adres r/w (noack) write bajt_do_zapisania (noack) read Etykieta repstart adres r/w (noack) stop |
oraz dwóch dodatkowych komend nie związanych z transmisją:
1 2 |
cls delay czas_w_ms |
Dla osób znających transmisję i2c komendy powinny być jasne, dlatego opiszę je skrótowo:
start – rozpoczęcie transmisji adres – adres urządzenia – w formacie 7-bitowym, w formacie szestnastkowym, r/w – wybieramy, czy chcemy zapisywać, do urządzenia, czy odczytywać, noack – opcjonalnie możemy wybrać, by nie wyświetlać, czy urządzenie zwróciło, czy nie bit potwierdzenia (ACK)
write – zapis bajtu do urządzenia, bajt_do_zapisania – w formacie szestnastkowym;
read – odczyt bajtu z urządzenia; Etykieta – etykieta pod jaką pojawi się odczytany bajt;
repstart – powtórzony start (repeated start), argumenty jak w przypadku start
stop – koniec transmisji.
cls – czyści prawe pole tekstowe
delay – opóźnienie o podaną ilość milisekund
Uwaga, wszystkie zapisy w formacie szestnastkowym muszą być w formacie “0x”, potem wartość, np: 0xFA, 0x03 itd.
Myślę, że łatwiej to będzie zrozumieć patrząc na kilka przykładów:
Zapis bajtu 0x00 pod adresem 0x6B do urządzenia o adresie 0x68:
1 2 3 4 5 |
cls start 0x68 w write 0x6B write 0x00 stop |
Odczyt dwóch bajtów z urządzenia o adresie 0x68 , rozpoczynając od pozycji 0x43:
1 2 3 4 5 6 |
start 0x68 w write 0x43 repstart 0x68 r read GYRO_H read GYRO_L stop |
Wynikiem powyżsego powinno być:
1 2 3 4 5 |
Ack Ack Ack GYRO_H = 0xAB GYRO_L = 0xCD |
Gdzie 0xAB i 0xCD to przykładowe wartości odczytane z urządzenia.
Myślę, że teraz wszystko powinno być jasne. Jeśli jednak nie będzie – zapytaj w komentarzu!
Dodaj komentarz