Krzysztof Wesołowski Programowanie, elektronika, automatyka – doświadczenia i projekty

9wrz/09

Obsługa interfejsu I2C/TWI w mikrokontrolerach AVR na przykładzie DS1338

Interfejs TWI/I2C

To dwa określenia dotyczące tej samej magistrali. Jej twórcą była firma PHILIPS, która do teraz jest właścicielem znaku handlowego I2C. Dlatego też inne implementacje tego standardu są często określane w inny sposób - np.  Atmel nazywa ten interfejs TWI. Na połączenie składają się dwie linie, zegarowa (oznaczana najczęściej SCK/SCL) i danych (oznaczana SDA), łącząca wszystkie urządzenia na danej magistrali. Więcej o samym sposobie działania i podłączania można przeczytać w internecie12.

Obsługa interfejsu I2C w mikrokontrolerach AVR

Zakładam, że korzystamy z mikrokontrolera posiadającego sprzętowe wsparcie dla tego interfejsu. Pozwala nam to obsługiwać ten interfejs na poziomie bajtów, z prędkościami nieosiągalnymi przy emulacji za pomocą zmian stanów portów (bitbang). Przykład, który tutaj zamieszczam został sprawdzony na uC ATmega8, jednak powinien być w pełni przenośny na każdy mikrokontroler AVR ze sprzętowym wsparciem I2C.

Program obsługuje zegar czasu rzeczywistego Maxim/Dallas,DS13383. Ze względu na stosunkowo rzadkie odczyty zrezygnowałem z trudniejszej obsługi za pomocą przerwań - odczyty i zapisy blokują pracę mikrokontrolera. Obsługę podzielono na dwa fragmenty:

  • twi_basics.c, twi_basics.h, zawierające funkcje odnoszące się bezpośrednio do rejestrów kontrolnych (TWCR) i danych (TWDR) oraz oczekujące na ukończenie operacji.
  • ds1338.c,ds1338.h, zawierające funkcje do bezpośredniej obsługi podłączonego zegara, odczyt/zapis czasu, wykorzystanie pozostałych 56bajtów NVRAM.

Cała obsługa sprawdza wartości zwracane przez magistralę i informuje o wyniku operacji za pomocą kodów błędu zdefiniowanych w plikach nagłówkowych. Ułatwia to znajdowanie ewentualnych problemów,  nie eliminuje niestety wszystkich możliwych problemów4.

Obsługę innych urządzeń można łatwo skonstruować korzystając z funkcji zawartych w twi_basics, dodając tylko interfejs do danego układu. Dla wielu urządzeń istniejąca biblioteka ds1338 będzie wymagała tylko niewielkich zmian, gdyż filozofia dostępu do danych jest identyczna.

Do samych plików dołączam przykład ilustrujący działaniem wystarczający do zrozumienia jej wykorzystania. Zachęcam do samodzielnego studiowania źródeł, zarówno tych jak i innych spotykanych w internecie, w celu lepszego zrozumienia problemu.

Załącznik:

Biblioteka DS1338, oparta o TWI

  1. http://pl.wikipedia.org/wiki/I2C[]
  2. http://en.wikipedia.org/wiki/I2C[]
  3. konkretnie modelu ds1338z-33+, odpornego na zasilanie 5V, co jednak nie ma wpływu na stronę programową[]
  4. Gdy ze względu na stan magistrali AVR nie potrafi wygenerować sygnału STOP, program zawiesza się w tym fragmencie. Zjawisko to nie występuje w sprawnym układzie, pod warunkiem nie wygenerowania zbędnych sygnałów stop przez samego użytkownika, dlatego nie rozwiązywałem go na poziomie biblioteki - wystarczający będzie Watchdog lub ręczne ograniczenie ilości obiegów pętli oczekującej.[]
Tagged as: , , , , Komentarze
Komentarze (0) Trackbacks (0)

Przepraszam, dodawanie komentarzy zablokowane.

Trackbacks are disabled.