Witam.
Krótki wstęp dlaczego wykonałem komunikację między uC wykorzystując magistralę TWI.
Na potrzeby swojej pracy dyplomowej potrzebowałem wykonać komunikację między mikrokontrolerami AVR po TWI (UART już miałem zajęty do komunikacji z komputerem). Jeden uC odpowiedzialny był za obsługę RFM12B oraz komunikację z komputerem. Natomiast drugi stanowił interfejs użytkownika z klawiaturą oraz wyświetlaczem LED.
Dlaczego użyłem pojęć "JEDEN" oraz "DRUGI" zamiast MASTER i SLAVE - ponieważ podczas pracy programu zmieniałem konfigurację danego uC w zależności od potrzeby.
Pracę dyplomową obroniłem już jakiś czas temu, ale dopiero teraz udało mi się znaleźć trochę czasu, żeby poprawić biblioteki. Udostępniam je z tego względu, gdyż w sieci nie znalazłem w naszym języku prostych bibliotek - na czas kiedy pisałem pracę dyplomową, w chwili obecnej mogło się to zmienić.
Pisząc biblioteki wzorowałem się w pewnym stopniu na bibliotekach zawartych na stronie
http://www.ermicro.com/blog/?p=1239, oraz książkach Mirka (za które bardzo dziękuję).
Na początku umieszczę pliki biblioteki, a następnie krótko opiszę najważniejsze fragmenty kodu. Całość jest do pobrania w załączniku wraz z przykładowym programem do testowania.
ds_twi.c
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ds_twi.h
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Bibliotekę starałem wykonać się tak, aby była ona uniwersalna. Dlatego też, ramkę danych wykonałem na podstawie not katalogowych urządzeń komunikujących się za pomocą I2C.
Ramka danych ma następujący format:
- dla zapisu w urządzeniu Slave
- dla odczytu z urządzenia Slave
Podczas odczytu danych z urządzenia SLAVE, nie jest konieczne wysyłanie do SLAVE rejestru. Można od razu rozpocząć odbiór danych.
W przypadku wysłania rejestru, należy ustawić czas opóźnienia T wysłania ponownego startu. Czas T powinien być na tyle długi, aby program zdążył przygotować dane.
Konfiguracja.Konfiguracji dokonujemy w pliku
ds_twi.h do komentarza "
nie zmieniać".
Adres jaki nasze urządzenie SLAVE będzie posiadało. Ja wykorzystywałem litery jako adres z tą uwagą, aby najmłodszy bit miał wartość 0. Na najmłodszym bicie przesyłana jest informacja czy następuje odczyt czy zapis do SLAVE.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Podczas odczytu z urządzenia SLAVE może występować opóźnienie w celu przygotowania danych do odesłania (np. w celu wykonania pomiarów, bądź odczytu danych z innych urządzeń) - czas podawany jest w ms.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Układ może również reagować na ogólne wywołanie za pomocą adresu 0x00 (General Call)
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Rozmiary bufora obioru, oraz wysyłania.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dane odbierane przez układ Master mogą mieć różną długość - w takim przypadku w pierwszych 2 bajtach przesyłana jest liczba w kodzie ASCII informująca o ilości danych. Gdy ilość danych jest stała, TWI_SLAVE_SEND_LENGTH należy ustawić na 0, w przeciwnym razie 1.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Funkcje, dla użytkownika:
Inicjalizacja TWI. Gdy układ ma pracować jako MASTER, argument przesyłany do funkcji powinien mieć wartość 0. Natomiast gdy urządzenie ma pracować jako SLAVE, argumentem jest adres tego urządzenia.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Funkcje do wykorzystania w przypadku, gdy ramka danych zdefiniowana w następnych funkcjach nie pokrywa się z ramką danych obsługiwanego urządzenia.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wysyłanie danych z MASTER do SLAVE. Pod wskazany adres (address) urządzenia wysyłany jest ciąg znaków (send_data) do podanego rejestru (registry).
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Odczyt danych z SLAVE przez MASTER. Z podanego adresu urządzenia (address), oraz rejestru (registry) odczytywana jest odpowiednia ilość danych (nr_data) i zapisywana do bufora read_data. W przypadku gdy ilość odczytywanych danych jest zmienna argument nr_data musi mieć wartość 0.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Funkcje umożliwiające odczytanie statusu magistrali TWI oraz obsługi TWI dla SLAVE
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Obsługa zdarzeń TWI, oraz rejestracja odpowiednich funkcji do obsługi tego zdarzenia.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dane które mają zostać przygotowane do wysyłania są przesyłane jako argument funkcji:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Odebrany rejestr przechowywany jest w pierwszych komórkach bufora odbioru. Przygotowanie danych do wysłania można wykonać po odebraniu rejestru w zdarzeniu do obsługi TWI, bądź gdziekolwiek w programie gdy jest taka potrzeba.
Przykładowe zastosowanie zdarzenia TWI dla układu SLAVE:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Poszczególne fragmenty kodu opatrzone są komentarzami.
W przypadku jakichkolwiek pytań, należy pytać!
Jeżeli w jakimś miejscu pojawiły się jakieś błędy - też pisać. Każdy może się pomylić.
W przyszłości mam zamiar wykonać timeout w celu zabezpieczenia programu tam gdzie zostały zastosowane pętle while(), oraz wykonać szerszą obsługę magistrali TWI w układzie SLAVE (np. w przypadku nie odebrania danych, bądź powtórne wysłania danych).
Proszę o wyrozumiałość;)
P.S.
Przykład zastosowania obejmuje dwa mikrokontrolera pierwszy MASTER - ATmega 8 połączona z komputerem przez uart. Wysyłając wartość "1" przez terminal (19200 bps) wysyłane jest polecenie odbioru danych. Natomiast wpisanie dowolnego krótkiego tekstu (około 8 znaków) do terminala i wciśnięcie enter zapisuje dane w SLAVE. Układ taktowany wewnętrznym kwarcem 4MHz.
Układ Slave to Atmega32 taktowana zewnętrznym kwarcem 4MHz. Podłączony jest do niej wyświetlacz lcd 2 wierszowy. Odebrane dane z Master są wyświetlane na LCD.
Rezystory podciągające magistralę o wartości 4,7k znajdują się przy Master.
Jeżeli ktoś mógłby przetestować działanie tych bibliotek na innych AVR byłbym wdzięczny.
P.S. 2
Jeżeli znajdę trochę więcej czasu to postaram się dokładniej opisać sposób komunikacji oraz działania tych bibliotek i umieścić w jakimś pdf - w bliżej nieokreślonym czasie.
Pozdrawiam