Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Połączenie za pomocą magistrali TWI
Termin | Opis |
Master | Urządzenie nadrzędne inicjujące i kończące transmisję. Układ Master generuje również zegar SCL. |
Slave | Urządzenie podporządkowane adresowane przez Master. |
Nadajnik | Urządzenie umieszczające dane na magistrali. |
Odbiornik | Urządzenie odczytujące dane z magistrali. |
Jak przedstawia rysunek powyżej obie linie magistrali są połączone z dodatnim napięciem zasilania poprzez oporniki podciągające R1 i R2. Drajwery magistrali we wszystkich układach zgodnych z TWI są typu otwarty dren lub otwarty kolektor. Wprowadza to funkcję iloczynu montażowego, która jest istotna w pracy tego interfejsu. Niski poziom na magistrali TWI powstaje, gdy jedno lub więcej urządzeń TWI wyprowadza zero. Wysoki poziom powstaje, gdy wszystkie urządzenia TWI przechodzą w stan wysokiej impedancji na swoich wyjściach, co pozwala opornikom podciągającym podnieść napięcie na linii do stanu wysokiego. Zauważ, iż wszystkie urządzenia AVR podłączone do magistrali TWI muszą być zasilane, aby magistrala mogła pracować.
Liczba urządzeń, które mogą być podłączone do magistrali, jest ograniczona jedynie przez graniczną pojemność 400 pF i 7-bitową przestrzeń adresową układów Slave. Przedstawiono tutaj dwie specyfikacje, jedną dla szybkości magistrali poniżej 100 kHz i jedną dla szybkości magistrali do 400 kHz.
Każdemu przesyłanemu bitowi danych na magistrali TWI towarzyszy impuls na linii zegarowej. Poziom linii danych musi być stabilny w czasie, gdy linia zegarowa ma stan wysoki. Jedynym wyjątkiem od tej reguły jest generowanie stanów START i STOP.
Ważność danych
Układ Master inicjuje i kończy transmisję danych. Transmisja rozpoczyna się, gdy Master umieszcza stan START na magistrali, a kończy się, gdy Master umieszcza stan STOP. Pomiędzy stanami START i STOP magistrala jest uważana za zajętą i żaden inny układ Master nie powinien próbować przejęcia kontroli nad magistralą. Specjalny przypadek występuje, gdy nowy stan START zostaje wysłany pomiędzy stanami START i STOP. Nosi on nazwę stanu REPEATED START (stanu powtórzonego startu) i jest on używany, gdy Master życzy sobie zainicjować nowy przesył bez porzucania kontroli nad magistralą. Po stanie REPEATED START magistrala jest uważana za zajętą aż do następnego STOP. Stan ten jest identyczny z zachowaniem się stanu START i dlatego START opisuje oba stany START i REPEATED START przez resztę tej instrukcji, chyba że zaznaczono inaczej. Jak zilustrowano poniżej stany START i STOP są sygnalizowane przez zmianę poziomu linii SDA podczas stanu wysokiego na linii SCL.
Stany START,
REPEATED START i STOP
Wszystkie pakiety adresu przesyłane po magistrali TWI mają długość 9 bitów i składają się z 7 bitów adresowych, jednego bitu sterującego odczytem/zapisem (ang. READ/WRITE) i bitu potwierdzenia. Jeśli bit READ/WRITE jest ustawiony, to ma być wykonana operacja odczytu, w przeciwnym razie powinna zostać wykonana operacja zapisu. Gdy układ Slave rozpozna, iż został zaadresowany, powinien potwierdzić to przez wysterowanie SDA stanem niskim w dziewiątym takcie SCL (takt ACK – ang. acknowledge, potwierdzenie). Jeśli zaadresowany układ Slave jest zajęty lub z jakiegoś innego powodu nie może obsłużyć żądania układu Master, to linia SDA powinna być pozostawiona w stanie wysokim w takcie zegarowym ACK. Wtedy Master może wysłać stan STOP lub REPEATED START w celu zainicjowania nowej transmisji. Pakiet adresu złożony z adresu Slave i bitu READ/WRITE nazywa się odpowiednio SLA+R lub SLA+W.
Najstarszy bit bajtu adresowego (ang. MSB – Most Significant Bit, bit najbardziej znaczący, LSB – Least Significant Bit, bit najmniej znaczący) jest wysyłany najpierw. Adresy Slave mogą być swobodnie przydzielane przez projektanta, lecz adres 0000 000 jest zarezerwowany na wywołanie ogólne (ang. general call).
Gdy zostanie wysłane wywołanie ogólne, wszystkie układy Slave powinny na nie odpowiedzieć przez ściągnięcie linii SDA w stan niski podczas taktu ACK. Wywołanie ogólne jest używane wtedy, gdy Master życzy sobie przesłać tą samą wiadomość do kilku układów Slave w systemie. Gdy za adresem wywołania ogólnego następuje bit WRITE (zapis) na magistrali, wszystkie układy Slave skonfigurowane do potwierdzania wywołania ogólnego ściągną linię SDA do stanu niskiego w takcie potwierdzenia ACK. Wysyłane teraz pakiety danych zostaną odebrane przez wszystkie układy SLAVE, które potwierdziły wywołanie ogólne. Zwróć uwagę, że wysyłanie adresu wywołania ogólnego z bitem READ (odczyt) nie ma żadnego znaczenia, ponieważ doprowadziłoby to do konfliktów, jeśli kilka układów SLAVE rozpoczęłoby transmisję różnych danych.
Wszystkie adresy formatu 1111 xxx powinny być zarezerwowane do przyszłych celów.
Format pakietu adresowego
Wszystkie pakiety danych przesyłanych po magistrali TWI mają długość 9 bitów i składają się z jednego bajtu danych i bitu potwierdzenia. Podczas przesyłu danych układ Master generuje zegar oraz stany START i STOP, podczas gdy odbiornik jest odpowiedzialny za potwierdzanie odbioru. Potwierdzenie (ACK) jest sygnalizowane przez odbiornik ściągnięciem linii SDA w stan niski podczas dziewiątego taktu SCL. Jeśli odbiornik pozostawi linię SDA w stanie wysokim, sygnalizowany jest brak potwierdzenia (NACK). Gdy odbiornik otrzymał ostatni bajt lub z jakiegoś powodu nie może odebrać więcej bajtów, powinien poinformować nadajnik przez wysłanie NACK po końcowym bajcie. Najpierw wysyłany jest najstarszy bit (MSB) danych.
Format pakietu danych
Transmisja składa się głównie ze stanu START, pakietu adresowego SLA+R/W, jednego lub więcej pakietów danych i ze stanu STOP. Pusta wiadomość składająca się ze stanu START, za którym następuje stan STOP, nie jest dozwolona. Zwróć uwagę, iż stosowanie iloczynu montażowego linii SCL może zostać użyte do zaimplementowania potwierdzeń pomiędzy układem Master a układem Slave. Układ Slave może wydłużyć okres stanu niskiego na linii SCL przez przeciągnięcie jej w stan niski. Jest to przydatne, gdy prędkość zegarowa ustawiona przez Master jest zbyt duża dla Slave lub Slave potrzebuje dodatkowy czas na przetwarzanie pomiędzy transmisjami danych. Układ Slave wydłużający okres stanu niskiego na linii SCL nie będzie wpływał na okres stanu wysokiego linii SCL, który jest określany przez Master. W rezultacie SLAVE może zmniejszać szybkość przesyłu danych TWI przez wydłużanie taktu SCL.
Poniższy rysunek przedstawia typową transmisję danych. Zauważ, iż pomiędzy SLA+R/W a stanem STOP może być przesłane kilka bajtów danych, co zależy od protokołu programowego zaimplementowanego przez program aplikacji.
Używanie iloczynu montażowego na liniach magistrali umożliwia rozwiązanie obu tych problemów. Zegary szeregowe ze wszystkich układów Master zostaną poddane iloczynowi montażowemu, dając w wyniku wynikowy zegar z okresem wysokim równym najkrótszemu okresowi wysokiemu. Okres niski sygnału zegarowego jest równy okresowi niskiemu układu Master, którego niski okres zegara jest najdłuższy. Zauważ, iż wszystkie układy Master nasłuchują linii SCL i faktycznie rozpoczynają mierzenie swoich wysokich i niskich okresów SCL, gdy wspólna linia SCL przechodzi odpowiednio w stan wysoki lub niski.
Synchronizacja pomiędzy
wieloma układami Master
Arbitraż jest przeprowadzany przez wszystkie układy Master, które ciągle monitorują linię SDA po wyprowadzaniu danych. Jeśli wartość odczytana z linii SDA nie zgadza się z wartością wyprowadzoną przez dany układ Master, to przegrał on arbitraż. Zauważ, iż układ Mater może przegrać arbitraż tylko wtedy, gdy wyprowadza wartość wysoką SDA, a inny układ Master wyprowadza wartość niską. Przegrywający układ Master powinien natychmiast przejść do trybu Slave, sprawdzając, czy nie został zaadresowany przez wygrywający Master. Linia SDA powinna być pozostawiona w stanie wysokim, lecz przegrywającym układom Master wolno generować sygnał zegarowy do końca bieżącego pakietu danych lub pakietu adresowego. Arbitraż jest kontynuowany aż do pozostania tylko jednego układu Master, a to może zająć wiele bitów. Jeśli kilka układów Master próbuje zaadresować ten sam układ Slave, to arbitraż będzie trwał aż do pakietu danych.
Arbitraż pomiędzy dwoma
układami Master
Zauważ, iż arbitraż nie jest dozwolony pomiędzy:
Odpowiedzialność leży po stronie oprogramowania użytkownika, aby zapewnić, iż te nielegalne warunki arbitrażu nigdy nie wystąpią. Wynika z tego, iż w systemach z wieloma układami Master wszystkie przesyły danych muszą korzystać z tej samej budowy pakietów SLA+R/W i pakietów danych. Innymi słowy: wszystkie transmisje muszą zawierać tę samą liczbę pakietów danych, inaczej wynik arbitrażu staje się nieokreślony.
Te końcówki pośredniczą pomiędzy modułem AVR TWI a resztą systemu mikrokontrolerowego. Drajwery wyjściowe zawierają ogranicznik szybkości narastania zbocza sygnału, aby podporządkować się specyfikacji TWI. Stopnie wejściowe zawierają tłumienie impulsów szpilkowych krótszych niż 50 ns. Zwróć uwagę, że wewnętrzne oporniki podciągające można uaktywnić przez ustawienie bitów rejestru PORT odpowiadających końcówkom SCL i SDA, co jest wyjaśnione w rozdziale "Porty we/wy". Wewnętrzne oporniki podciągające mogą w niektórych systemach wyeliminować potrzebę stosowania zewnętrznych.
Ten moduł kontroluje okres SCL w trybie Master. Okres ten jest kontrolowany przez ustawienia w rejestrze szybkości bitów TWI (ang. TWI Bit Rate Register, TWBR) oraz bity preskalera w rejestrze stanu TWI (ang. TWI Status Register, TWSR). Praca w trybie Slave nie zależy od ustawień szybkości bitów czy preskalera, lecz częstotliwość zegarowa mikroprocesora musi być co najmniej 16 razy wyższa od częstotliwości SCL. Zauważ, iż układy Slave mogą przedłużać niski okres SCL, przez co zmniejszają średni okres zegarowy magistrali TWI. Częstotliwość SCL jest generowana zgodnie z następującym równaniem:
Uwaga: Wartość opornika podciągającego powinna być wybierana zgodnie z częstotliwością SCL oraz obciążeniem pojemnościowym linii magistralowej. Wartość opornika podciągającego znajdziesz w rozdziale "Parametry elektryczne".
Ten moduł zawiera Rejestr przesuwający dane i adres (ang. Data and Address Shift Register, TWDR), sterownik stanów START/STOP sieć logiczną wykrywania arbitrażu. TWDR zawiera adres lub bajty danych do przesłania albo adres i bajty danych odebrane. Dodatkowo do 8-bitowego rejestru TWDR moduł interfejsu magistrali zawiera również rejestr przechowujący bit (N)ACK do wysłania lub odebrany. Ten rejestr (N)ACK nie jest bezpośrednio dostępny dla oprogramowania aplikacji. Jednakże przy odbiorze można go ustawiać lub zerować poprzez manipulowanie rejestrem sterującym TWI (ang. TWI Control Register, TWCR). W trybie nadajnika wartość odebranego bitu (N)ACK można określić przez wartość w rejestrze stanu TWI, TWSR.
Sterownik stanu START/STOP odpowiada za generację i wykrywanie stanów START, REPEATED START i STOP. Sterownik ten potrafi wykrywać stany START i STOP nawet, gdy mikrokontroler AVR jest w jednym z trybów uśpienia, co pozwala mikrokontrolerowi wybudzić się, jeśli zostanie zaadresowany przez jakiś układ Master.
Jeśli TWI zainicjowało transmisję jako Master, to sieć wykrywania arbitrażu ciągle monitoruje transmisję starając się określić, czy pojawił się arbitraż. Jeśli TWI przegrało arbitraż, to zostanie o tym poinformowany moduł sterujący. Wtedy może zostać podjęte właściwe działanie i mogą zostać wygenerowane odpowiednie kody stanu.
Moduł ten sprawdza, czy odebrane bajty adresu pasują do siedmiobitowego adresu w rejestrze adresu TWI (ang. TWI Address Register, TWAR). Jeśli bit uaktywnienia rozpoznawania ogólnego wywołania TWI (ang. TWI General Call Recognition Enable bit, TWGCE) w rejestrze TWAR zostanie zapisany logiczną jedynką, to wszystkie nadchodzące bity adresowe będą również porównywane z adresem wywołania ogólnego. Przy zgodności adresu informowany jest moduł sterujący, co pozwala podjąć właściwe działanie. TWI może, lecz nie musi potwierdzać swój adres, w zależności od ustawień w TWCR. Moduł zgodności adresu potrafi porównywać adresy nawet wtedy, gdy mikrokontroler AVR jest w trybie uśpienia, co pozwoli go wybudzić, jeśli został zaadresowany przez jakiś układ Master. Jeśli podczas zgodności adresu w trybie wyłączenia pojawi się inne przerwanie (na przykład INT0) i wybudzi mikroprocesor, TWI przerwie swoją pracę i powróci do swojego stanu bezczynności. Jeśli stwarza to jakiekolwiek problemy, to upewnij się, iż zgodność adresu TWI jest jedynym uaktywnionym przerwaniem przy wejściu w tryb wyłączenia zasilania.
Moduł sterujący monitoruje magistralę TWI i generuje odpowiedzi zgodnie z ustawieniami w rejestrze sterującym TWI (ang. TWI Control Register, TWCR). Gdy na magistrali TWI pojawi się zdarzenie wymagające uwagi aplikacji, nastąpi ustawienie znacznika przerwania TWI (ang. TWI Interrupt Flag, TWINT). W następnym takcie zegarowym zostanie uaktualniony rejestr stanu TWI, TWSR, kodem stanu identyfikującym zdarzenie. Rejestr TWSR zawiera ważny kod stanu tylko wtedy, gdy potwierdza to znacznik przerwania TWI. W każdym innym przypadku TWSR zawiera specjalny kod stanu oznaczający, iż nie jest dostępna żadna informacja stanu. Tak długo jak znacznik TWINT jest ustawiony, linia SCL jest utrzymywana w stanie niskim. Pozwala to oprogramowaniu aplikacji wykonać swoje zadania, zanim transmisja TWI będzie mogła być dalej kontynuowana.
Znacznik TWINT jest ustawiany w następujących wypadkach:
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x00 (0x20) | TWBR7 | TWBR6 | TWBR5 | TWBR4 | TWBR3 | TWBR2 | TWBR1 | TWBR0 | TWBR |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Rejestr TWBR wybiera współczynnik podziału dla generatora szybkości przesyłu bitów. Generator ten jest dzielnikiem częstotliwości, który generuje częstotliwość zegarową SCL w trybach Master. Zobacz do podrozdziału "Moduł generatora szybkości przesyłania bitów".
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x36 (0x56) | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE | TWCR |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Rejestr TWCR jest wykorzystywany to kontrolowania pracy modułu TWI. umożliwia on włączanie TWI, inicjowanie dostępu w trybie Master przez umieszczenie na magistrali stanu START, generowanie potwierdzenia przez odbiornik, generowanie stanu STOP i wstrzymywanie magistrali, gdy dane z niej są zapisywane w TWDR. Informuje on również o kolizji zapisu, jeśli następuje próba zapisu danych do rejestru TWDR, a ten jest niedostępny.
Ten bit jest ustawiany sprzętowo, gdy TWI skończyło swoją bieżącą pracę i oczekuje na reakcję ze strony aplikacji. Jeśli są ustawione bity I w rejestrze stanu SREG i TWIE w TWCR, to mikrokontroler wykona skok do wektora przerwań TWI. Gdy jest ustawiony znacznik TWINT, następuje rozciąganie niskiego okresu SCL. Znacznik TWINT musi zostać wyzerowany programowo przez zapis do niego logicznej jedynki. Zwróć uwagę, iż ten znacznik nie ulega automatycznemu wyzerowaniu przy wykonaniu procedury przerwania. Również zwróć uwagę, iż wyzerowanie tego znacznika rozpoczyna pracę TWI, zatem wszystkie dostępy do rejestru adresowego TWI (TWAR), do rejestru stanu TWI (TWSR) i do rejestru danych TWI (TWDR) muszą zostać zakończone przed wyzerowaniem znacznika.
Bit TWEA kontroluje generację impulsu potwierdzenia. Jeśli do TWEA zostanie wpisana jedynka, to będzie wygenerowany impuls ACK na magistrali TWI, jeśli są spełnione następujące warunki:
Przez wpisanie zera do bitu TWEA mikrokontroler może czasowo zostać wirtualnie odłączony od magistrali TWI. Następnie można przywrócić rozpoznawanie adresu przez ponowne zapisanie jedynki w bicie TWEA.
Aplikacja wpisuje jedynkę do bitu TWSTA, jeśli chce się stać układem Master na magistrali TWI. Sieć logiczna TWI sprawdza, czy magistrala jest dostępna i generuje stan START na magistrali, jeśli jest wolna. Jednakże przy zajętej magistrali TWI czeka na wykrycie stanu STOP, a następnie generuje nowy stan START, aby przejąć magistralę jako układ Master. TWSTA musi być zerowane programowo, gdy został nadany stan START.
Wpisanie jedynki do bitu TWSTO w trybie Master wygeneruje stan STOP na magistrali TWI. Gdy stan STOP pojawi się na magistrali, bit TWSTO zostanie automatycznie wyzerowany. W trybie Slave ustawienie bitu TWSTO może być użyte do wyjścia ze stanu błędu. Nie wygeneruje to stanu STOP, lecz TWI powróci do dobrze zdefiniowanego niezaadresowanego trybu Slave i zwolni linie SCL iSDA przechodząc w stan wysokiej impedancji.
Bit TWWC jest ustawiany przy próbie zapisu do rejestru danych TWI – TWDR, gdy znacznik TWINT jest w stanie niskim. Bit TWWC jest zerowany przez zapis do rejestru TWDR, gdy TWINT ma stan wysoki.
Bit TWEN włącza pracę modułu TWI i aktywuje interfejs TWI. Gdy bit TWEN zostanie zapisany logiczną jedynką, TWI przejmie kontrolę nad końcówkami we/wy połączonymi z końcówkami SCL i SDA, uaktywniając ograniczniki narastania zboczy i filtry zakłóceń szpilkowych. Gdy bit ten zostanie zapisany zerem, moduł TWI zostaje wyłączony i zakończone zostają wszystkie transmisje TWI bez względu na ich bieżący postęp.
Ten bit jest zarezerwowany i zawsze daje odczyt zero.
Gdy ten bit zostanie zapisany stanem jeden i jest ustawiony bit I w SREG, to zostają uaktywnione żądania przerwań TWI tak długo, jak znacznik TWINT ma stan wysoki..
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x01 (0x21) | TWS7 | TWS6 | TWS5 | TWS4 | TWS3 | – | TWPS1 | TWPS0 | TWSR |
Zapis/Odczyt | O | O | O | O | O | O | Z/O | Z/O | |
Wartość początkowa | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
Te 5 bitów odzwierciedla stan modułu TWI oraz stan magistrali TWI. W dalszej części tego rozdziału opisane są różne kody stanu. Zauważ, iż wartość odczytana z TWSR zawiera zarówno wartość 5-bitowego stanu jak i 2-bitową wartość preskalera. Projektant aplikacji powinien wymaskować bity preskalera na zero przy sprawdzaniu bitów stanu. To uczyni sprawdzanie stanu niezależne od ustawień preskalera. To rozwiązanie jest używane w tej instrukcji, o ile nie zaznaczono inaczej.
Ten bit jest zarezerwowany i zawsze daje odczyt zero.
Te bity można odczytywać i zapisywać. Sterują one preskalerem szybkości transmisji bitów.
TWPS1 | TWPS0 | Wartość preskalera |
0 | 0 | 1 |
0 | 1 | 4 |
1 | 0 | 16 |
1 | 1 | 64 |
Aby obliczyć szybkość transmisji bitów, zaglądnij do podrozdziału "Moduł generatora szybkości przesyłania bitów". W równaniu używana jest wartość TWPS1...0.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x03 (0x23) | TWD7 | TWD6 | TWD5 | TWD4 | TWD3 | TWD2 | TWD1 | TWD0 | TWDR |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
W trybie nadawania rejestr TWDR zawiera następny bajt do wysłania. W trybie odbioru rejestr TWDR zawiera ostatnio odebrany bajt. Rejestr jest zapisywalny w czasie, gdy TWI nie jest w toku przesuwania bajtu. Występuje to wtedy, gdy znacznik przerwani TWI (TWINT) został ustawiony sprzętowo. Zauważ, iż rejestr danych nie może być inicjowany przez użytkownika przed wystąpieniem pierwszego przerwania. Dane w TWDR pozostają niezmienione tak długo, jak TWINT jest ustawiony. W czasie wysuwania danych na zewnątrz dane z magistrali są jednocześnie wsuwane do rejestru. TWDR zawsze zawiera ostatni bajt obecny na magistrali, z wyjątkiem stanu po wybudzeniu z trybu uśpienia przez przerwanie TWI. W tym wypadku zawartość rejestru TWDR jest nieokreślona. W przypadku przegrania arbitrażu magistrali żadne dane nie są tracone przy przejściu z trybu Master na tryb Slave. Obsługa bitu potwierdzenia ACK jest wykonywana automatycznie przez sieć logiczną TWI, mikroprocesor nie ma bezpośredniego dostępu do bitu ACK.
Te osiem bitów składa się na następny bajt danych do wysłania lub ostatnio odebrany bajt danych na 2-przewodowej magistrali szeregowej.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x02 (0x22) | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE | TWAR |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Rejestr TWAR powinien zostać załadowany 7-bitowym adresem Slave (w 7 najbardziej znaczących bitach rejestru TWAR), na który TWI będzie reagować jako Nadajnik Slave lub odbiornik Slave, a który nie jest potrzebny w trybach Master. W systemach z wieloma układami Master rejestr TWAR musi być ustawiany w układach Master, które mogą być adresowane jako układy Slave przez inne układy Master.
Najmłodszy bit rejestru TWAR używany jest do włączania rozpoznawania adresu wywołania ogólnego (0x00). Z rejestrem tym jest powiązany komparator adresów, który szuka adresu Slave (lub adresu wywołania ogólnego, jeśli został on uaktywniony) w odebranym adresie z magistrali szeregowej. Jeśli zostanie stwierdzona zgodność, następuje generacja żądania przerwania.
Te siedem bitów przechowuje adres Slave modułu TWI.
Jeśli zostanie ustawiony, to bit ten włączy rozpoznawanie wywołania ogólnego z 2-przewodowej magistrali szeregowej.
Gdy zostanie ustawiony znacznik TWINT, to TWI skończyło pewną operację i oczekuje na reakcję aplikacji. W takim przypadku rejestr stanu TWI (ang. TWI Status Register, TWSR) zawiera wartość oznaczającą bieżący stan magistrali TWI. Oprogramowanie aplikacji może następnie zdecydować przez manipulowanie rejestrami TWCR i TWDR, jak powinien się zachować moduł TWI w następnym cyklu magistrali TWI. Poniższy rysunek jest prostym przykładem sposobu interakcji aplikacji z modułem TWI. W tym przykładzie pewien układ Master pragnie wysłać pojedynczy bajt danych do jakiegoś układu Slave. Ten opis jest dosyć abstrakcyjny, bardziej szczegółowe wyjaśnienie znajduje się dalej w tym rozdziale. Przedstawiono również prosty przykład kodu implementującego pożądane zachowanie.
Chociaż ten przykład jest prosty, to jednak pokazuje zasady związane ze wszystkimi transmisjami TWI. Można je podsumować następująco:
Poniżej przedstawiona jest implementacja w asemblerze i w języku C podanego przykładu. Zwróć uwagę, iż poniższy kod zakłada wykonanie kilku definicji przez użycie np. dołączanych plików nagłówkowych.
Asembler | Język C | Komentarze | |
1. |
ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR, r16 |
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) |
Wyślij stan START. |
2. |
wait1: in r16,TWCR sbrs r16,TWINT rjmp wait1 |
while(!(TWCR&(1<<TWINT))) ; |
Czekaj na ustawienie znacznika TWINT. Oznacza to, iż stan START został wysłany. |
3. |
in r16,TWSR andi r16,0xF8 cpi r16,START brne ERROR |
if((TWSR&0xF8)!=START) ERROR(); |
Sprawdź wartość rejestru stanu TWI. Wymaskuj bity preskalera. Jeśli stan ma wartość różną od START, przejdź do ERROR. |
ldi r16,SLA_W out TWDR,r16 ldi r16,(1<<TWINT)|(1<<TWEN) out TWCR,r16 |
TWDR=SLA_W; TWCR=(1<<TWINT)|(1<<TWEN); |
Załaduj SLA_W do rejestru TWDR. Wyzeruj bit TWINT w TWCR, aby rozpocząć transmisję adresu. | |
4. |
wait2: in r16,TWCR sbrs r16,TWINT rjmp wait2 |
while(!(TWCR&(1<<TWINT))) ; |
Czekaj na ustawienie znacznika TWINT. Oznacza to, iż SLA+W zostało przesłane i otrzymano ACK/NACK. |
5. |
in r16,TWSR andi r16,0xF8 cpi r16,MT_SLA_ACK brne ERROR |
if((TWSR&0xF8)!=MT_SLA_ACK) ERROR(); |
Sprawdź wartość rejestru stanu TWI. Wymaskuj bity preskalera. Jeśli stan ma wartość różną od MT_SLA_ACK, przejdź do ERROR. |
ldi r16,DATA out TWDR,r16 ldi r16,(1<<TWINT) | (1<<TWEN) out TWCR,r16 |
TWDR=DATA; TWCR=(1<<TWINT)|(1<<TWEN); |
Załaduj dane DATA do rejestru TWDR. Wyzeruj bit TWINT w TWCR, aby rozpocząć transmisję danych. | |
6. |
wait3: in r16,TWCR sbrs r16,TWINT rjmp wait3 |
while(!(TWCR&(1<<TWINT))) ; |
Czekaj na ustawienie znacznika TWINT. Oznacza to, iż dane DATA zostały wysłane i otrzymano ACK/NACK. |
7. |
in r16,TWSR andi r16,0xF8 cpi r16,MT_DATA_ACK brne ERROR |
if((TWSR&0xF8)!=MT_DATA_ACK) ERROR(); |
Sprawdź wartość rejestru stanu TWI. Wymaskuj bity preskalera. Jeśli stan ma wartość różną od MT_DATA_ACK, przejdź do ERROR. |
ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO) out TWCR,r16 |
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO); |
Wyślij stan STOP |
Kolejne podrozdziały opisują każdy z tych trybów. Opisane są możliwe kody stanu wraz z rysunkami wyjaśniającymi szczegółowo transmisję danych w każdym z trybów. Na rysunkach spotkasz następujące skróty:
S: stan START
Rs: stan REPEATED START
R: bit odczytu (wysoki poziom na SDA)
W: bit zapisu (niski poziom na SDA)
A: bit potwierdzenia (niski poziom na
SDA)
A: bit
negatywnego potwierdzenia (wysoki poziom na SDA)
DATA: 8-bitowy bajt danych
P: stan STOP
SLA: Adres Slave
GCA: Adres wywołania ogólnego
Koła na rysunkach są używane do wskazywania, iż został ustawiony znacznik TWINT. Liczby w kołach pokazują kod stanu przechowywany w rejestrze TWSR z wymaskowanymi na zero bitami preskalera. W tych miejscach aplikacja musi podjąć działania, aby kontynuować lub zakończyć transfer TWI. Transfer ten jest wstrzymywany aż do wyzerowania przez program znacznika TWINT.
Gdy znacznik TWINT jest ustawiony, kod stanu w rejestrze TWSR jest używany do określania właściwego działania ze strony oprogramowania. Dla każdego kodu stanu pożądane działanie programowe wraz ze szczegółami następnego transferu szeregowego opisują tabelki. W tych tabelach bity preskalera zastały wymaskowane na zero.
W trybie Nadajnika Master pewna liczba bajtów danych jest transmitowana do Odbiornika Slave (zobacz na poniższy rysunek). W celu wejścia w tryb Master należy wysłać stan START. Format następującego za stanem START pakietu adresowego określa, czy ma nastąpić wejście w tryb Nadajnika Master lub w tryb Odbiornika Master. Jeśli zostaje przesłane SLA+W, wejście jest do trybu MT, a jeśli przesyłane jest SLA+R, nastąpi wejście w tryb MR. Wszystkie kody stanu wspomniane w tym podrozdziale zakładają wymaskowanie bitów preskalera na zero.
Transfer danych w trybie
Nadajnika Master
Stan START jest wysyłany po zapisie następującej wartości w rejestrze TWCR:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 1 | X | 1 | 0 | X | 1 | 0 | X |
Bit TWEN musi być ustawiony, aby włączyć 2-przewodowy interfejs szeregowy, bit TWSTA musi być zapisany logiczną jedynką, aby wysłać stan START i bit TWINT musi być zapisany jedynką, aby wyzerować znacznik TWINT. Wtedy moduł TWI przetestuje 2-przewodową magistralę szeregową i wygeneruje stan START, gdy tylko ta magistrala zostanie zwolniona. Po wytransmitowaniu stanu START znacznik TWINT zostaje ustawiony sprzętowo, a kod stanu w rejestrze TWSR przyjmie wartość 0x08. Aby wejść w tryb MT (Nadajnik Master) należy wytransmitować SLA+W. Odbywa się to przez zapis SLA+W do rejestru danych TWDR. Po tej operacji należy wyzerować bit TWINT (przez zapisanie w nim logicznej jedynki), aby kontynuować transfer. Realizuje się to przez zapis następującej wartości w rejestrze TWCR:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 1 | X | 0 | 0 | X | 1 | 0 | X |
Gdy SLA+W zostało wysłane i otrzymano bit potwierdzenia, znacznik TWINT jest ponownie ustawiany, a w rejestrze TWSR może pojawić pewna liczba kodów stanu. W trybie master mogą to być kody 0x18, 0x20 lub 0x38. Tabelka podana niżej wymienia szczegółowe działania do podjęcia dla każdego z tych kodów stanu. Gdy SLA+W zostało wysłane z powodzeniem, należy wysłać pakiet danych. Wykonuje się to przez zapis bajtu danych do rejestru TWDR. Rejestr ten musi być zapisany tylko wtedy, gdy znacznik TWINT ma stan wysoki. Jeśli tak nie jest, zapis zostanie skasowany i będzie ustawiony bit kolizji zapisu (ang. Write Collision bit, TWWC) w rejestrze TWCR.
Po uaktualnieniu TWDR bit TWINT należy wyzerować (przez zapis do niego jedynki), aby kontynuować transfer. Realizuje się to przez zapis następującej wartości w rejestrze TWCR:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 1 | X | 0 | 0 | X | 1 | 0 | X |
Ten schemat jest powtarzany aż do przesłania ostatniego bajtu, po czym transfer kończy się wygenerowaniem stanu STOP lub powtórzonego stanu START. Stan STOP jest generowany przez zapis następującej wartości do TWCR:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 1 | X | 0 | 1 | X | 1 | 0 | X |
Stan REPEATED START jest generowany przez zapis następującej wartości do TWCR:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 1 | X | 1 | 0 | X | 1 | 0 | X |
Po stanie REPEATED START (stan 0x10) 2-przewodowa magistrala szeregowa może ponownie uzyskać dostęp do tego samego układu Slave lub do nowego układu SLAVE bez transmitowania stanu STOP. REPEATED START umożliwia układowi Master przełączanie pomiędzy układami Slave oraz przełączanie pomiędzy trybami Nadajnika Master i Odbiornika Master bez utraty kontroli nad magistralą.
Kod stanu (TWSR) z wymaskowanymi bitami preskalera | Stan magistrali TWI i modułu TWI | Odpowiedź aplikacji | Następne działanie podejmowane przez moduł TWI. | ||||
z/do TWDR | do TWCR | ||||||
STA | STO | TWINT | TWEA | ||||
0x08 | Wysłano stan START | Załaduj SLA+W | 0 | 0 | 1 | X | Zostanie wysłane SLA+W. Odebrane będzie ACK lub NACK. |
0x10 | Wysłano stan REPEATED START | Załaduj SLA+W | 0 | 0 | 1 | X | Zostanie wysłane SLA+W, odebrane będzie ACK lub NACK. |
Załaduj SLA+R | 0 | 0 | 1 | X | Zostanie wysłane SLA+R; logika przełączy się w tryb odbiornika Master. | ||
0x18 | Wysłano SLA+W, otrzymano ACK | Załaduj bajt danych | 0 | 0 | 1 | X | Wysłanie bajt danych i będzie otrzymane ACK lub NACK. |
Brak działania na TWDR | 1 | 0 | 1 | X | Zostanie wysłany stan REPEATED START. | ||
0 | 1 | 1 | X | Zostanie wysłany stan STOP i będzie wyzerowany znacznik TWSTO. | |||
1 | 1 | 1 | X | Zostanie wysłany stan STOP, za którym wystąpi stan START, a znacznik TWSTO będzie zresetowany. | |||
0x20 | Wysłano SLA+W, otrzymano NACK | Załaduj bajt danych | 0 | 0 | 1 | X | Wysłanie bajtu danych i będzie otrzymane ACK lub NACK. |
Brak działania na TWDR | 1 | 0 | 1 | X | Zostanie wysłany stan REPEATED START. | ||
0 | 1 | 1 | X | Zostanie wysłany stan STOP i będzie wyzerowany znacznik TWSTO. | |||
1 | 1 | 1 | X | Zostanie wysłany stan STOP, za którym wystąpi stan START, a znacznik TWSTO będzie zresetowany. | |||
0x28 | Wysłano bajt danych, otrzymano ACK | Załaduj bajt danych | 0 | 0 | 1 | X | Wysłanie bajt danych i będzie otrzymane ACK lub NACK. |
Brak działania na TWDR | 1 | 0 | 1 | X | Zostanie wysłany stan REPEATED START. | ||
0 | 1 | 1 | X | Zostanie wysłany stan STOP i będzie wyzerowany znacznik TWSTO. | |||
1 | 1 | 1 | X | Zostanie wysłany stan STOP, za którym wystąpi stan START, a znacznik TWSTO będzie zresetowany. | |||
0x30 | Wysłano bajt danych, otrzymano NACK | Załaduj bajt danych | 0 | 0 | 1 | X | Wysłanie bajtu danych i zostanie odebrane ACK lub NACK. |
Brak działania na TWDR | 1 | 0 | 1 | X | Zostanie wysłany stan REPEATED START. | ||
Brak działania na TWDR | 0 | 1 | 1 | X | Zostanie wysłany stan STOP i będzie wyzerowany znacznik TWSTO. | ||
1 | 1 | 1 | X | Zostanie wysłany stan STOP, za którym wystąpi stan START, a znacznik TWSTO będzie zresetowany. | |||
0x38 | Przegrany arbitraż w SLA+W lub w bajtach danych | Brak działania na TWDR | 0 | 0 | 1 | X | Zostanie zwolniona magistrala TWI i nastąpi przejście w tryb niezaadresowanego układu Slave. |
1 | 0 | 1 | X | Gdy magistrala stanie się wolna, nastąpi wysłanie stanu START. |
Formaty i stany w trybie
nadajnika Master
W trybie odbiornika Master (ang. Master Receiver mode, MR) pewna liczba bajtów danych jest odbierana od nadajnika Slave (zobacz na poniższy rysunek). Aby wejść w jakiś tryb Master, należy wysłać na magistralę TWI stan START. Format następującego za nim pakietu adresowego określa, czy nastąpi wejście w tryb Nadajnika Master lub w tryb Odbiornika Master. Jeśli jest wysyłane SLA+W, wejście jest w tryb MT, jeśli wysyłane jest SLA+R, wejście jest w tryb MR. Wszystkie kody stanu wspomniane w tym podrozdziale zakładają wymaskowanie bitów preskalera na zero.
Transfer danych w trybie
odbiornika Master
Stan START jest wysyłany po zapisie następującej wartości w rejestrze TWCR:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 1 | X | 1 | 0 | X | 1 | 0 | X |
Bit TWEN musi być ustawiony, aby włączyć 2-przewodowy interfejs szeregowy, bit TWSTA musi być zapisany logiczną jedynką, aby wysłać stan START i bit TWINT musi być zapisany jedynką, aby wyzerować znacznik TWINT. Wtedy moduł TWI przetestuje 2-przewodową magistralę szeregową i wygeneruje stan START, gdy tylko ta magistrala zostanie zwolniona. Po wytransmitowaniu stanu START znacznik TWINT zostaje ustawiony sprzętowo, a kod stanu w rejestrze TWSR przyjmie wartość 0x08. Aby wejść w tryb MR (Odbiornik Master) należy wytransmitować SLA+R. Odbywa się to przez zapis SLA+R do rejestru danych TWDR. Po tej operacji należy wyzerować bit TWINT (przez zapisanie w nim logicznej jedynki), aby kontynuować transfer. Realizuje się to przez zapis następującej wartości w rejestrze TWCR:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 1 | X | 0 | 0 | X | 1 | 0 | X |
Gdy SLA+R zostało wysłane i otrzymano bit potwierdzenia, znacznik TWINT jest ponownie ustawiany, a w rejestrze TWSR może pojawić pewna liczba kodów stanu. W trybie master mogą to być kody 0x38, 0x40 lub 0x48. Tabelka podana niżej wymienia szczegółowe działania do podjęcia dla każdego z tych kodów stanu. Odebrane dane można odczytać z rejestru TWDR, gdy znacznik TWINT zostanie ustawiony sprzętowo. Ten schemat jest powtarzany aż do odebrania ostatniego bajtu. Gdy to się stanie odbiornik Master powinien poinformować nadajnik Slave wysłaniem negatywnego potwierdzenia NACK po ostatnim odebranym bajcie. Transfer jest kończony przez wygenerowanie stanu STOP lub stanu REPEATED START. Stan STOP jest generowany przez zapis następującej wartości do TWCR:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 1 | X | 0 | 1 | X | 1 | 0 | X |
Stan REPEATED START jest generowany przez zapis następującej wartości do TWCR:
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 1 | X | 1 | 0 | X | 1 | 0 | X |
Po stanie REPEATED START (stan 0x10) 2-przewodowa magistrala szeregowa może ponownie uzyskać dostęp do tego samego układu Slave lub do nowego układu SLAVE bez transmitowania stanu STOP. REPEATED START umożliwia układowi Master przełączanie pomiędzy układami Slave oraz przełączanie pomiędzy trybami Nadajnika Master i Odbiornika Master bez utraty kontroli nad magistralą.
Kod stanu (TWSR) z wymaskowanymi bitami preskalera | Stan magistrali TWI i modułu TWI | Odpowiedź aplikacji | Następne działanie podejmowane przez moduł TWI. | ||||
z/do TWDR | do TWCR | ||||||
STA | STO | TWINT | TWEA | ||||
0x08 | Wysłano stan START | Zaaduj SLA+R | 0 | 0 | 1 | X | Zostanie wysłane SLA+R. Odebrane będzie ACK lub NACK. |
0x10 | Wysłano stan REPEATED START | Załaduj SLA+R | 0 | 0 | 1 | X | Zostanie wysłane SLA+R, odebrane będzie ACK lub NACK. |
Załaduj SLA+W | 0 | 0 | 1 | X | Zostanie wysłane SLA+W; logika przełączy się w tryb nadajnika Master. | ||
0x38 | Przegrany arbitraż w SLA+R lub bit NACK | Brak działania na TWDR | 0 | 0 | 1 | X | Zostanie zwolniona magistrala TWI i nastąpi przejście w tryb niezaadresowanego układu Slave. |
1 | 0 | 1 | X | .Gdy magistrala będzie wolna, zostanie wysłany stan START. | |||
0x40 | Wysłano SLA+R, otrzymano ACK | Brak działania na TWDR | 0 | 0 | 1 | 0 | Zostanie odebrany bajt danych i zwrócony NACK. |
0 | 0 | 1 | 1 | Zostanie odebrany bajt danych i zwrócony ACK. | |||
0x48 | Wysłano SLA+R, otrzymano NACK | Brak działania na TWDR | 1 | 0 | 1 | X | Zostanie wysłany stan REPEATED START. |
0 | 1 | 1 | X | Zostanie wysłany stan STOP i będzie wyzerowany znacznik TWSTO. | |||
1 | 1 | 1 | X | Zostanie wysłany stan STOP, za którym wystąpi stan START, a znacznik TWSTO będzie zresetowany. | |||
0x50 | Odebrano bajt danych, zwrócono ACK | Odczytaj bajt danych | 0 | 0 | 1 | 0 | Odbiór bajtu danych i zostanie zwrócony NACK. |
Odczytaj bajt danych | 0 | 0 | 1 | 1 | Odbiór bajtu danych i zostanie zwrócony ACK. | ||
0x58 | Bajt danych został odebrany, zwrócono NACK | Odczytaj bajt danych | 1 | 0 | 1 | X | Zostanie wysłany stan REPEATED START. |
Odczytaj bajt danych | 0 | 1 | 1 | X | Zostanie wysłany stan STOP i będzie wyzerowany znacznik TWSTO. | ||
Odczytaj bajt danych | 1 | 1 | 1 | X | Zostanie wysłany stan STOP, za którym wystąpi stan START, a znacznik TWSTO będzie zresetowany. |
Formaty i stany a trybie
odbiornika Master
W trybie odbiornika Slave pewna liczba bajtów zostaje odebrana z nadajnika Master (zobacz na poniższy rysunek). Wszystkie kody stanu wspomniane w tym podrozdziale zakładają wymaskowanie bitów preskalera na zero.
Transfer danych w trybie
odbiornika Slave
Aby zainicjować tryb odbiornika Slave, rejestry TWAR i TWCR należy ustawić następująco:
TWAR | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE |
wartość | Własny adres Slave urządzenia |
7 górnych bitów jest adresem, na który będzie reagował moduł TWI, gdy
zostanie zaadresowany przez jakiś układ Master. Jeśli najmłodszy bit jest
ustawiony, to TWI będzie reagować na adres wywołania ogólnego
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 0 | 1 | 0 | 0 | 0 | 1 | 0 | X |
Do bitu TWEN musi być wpisana jedynka, aby włączyć moduł TWI. Bit TWEA musi być zapisany jedynką, aby włączyć potwierdzenie własnego adresu Slave urządzenia lub adresu wywołania ogólnego. Bity TWSTA i TWSTO należy zapisać zerami. Gdy rejestry TWAR i TWCR zostały zainicjowane, moduł TWI czeka, aż zostanie zaadresowany swoim własnym adresem Slave (lub adresem wywołania ogólnego, jeśli został on włączony) za którym wystąpi bit kierunku danych. Jeśli bit kierunku ma stan "0" (zapis), moduł TWI będzie pracował w trybie SR, w przeciwnym razie nastąpi wejście w tryb ST. Po odbiorze własnego adresu Slave i bitu zapisu, zostaje ustawiony znacznik TWINT, a ważny kod stanu można odczytać z rejestru TWSR. Kod stanu jest używany do określenia właściwego działania ze strony oprogramowania, które opisuje tabela poniżej. Przejście w tryb odbiornika Slave może również nastąpić, jeśli wystąpiło przegranie arbitrażu, gdy moduł TWI pracował w trybie Master (zobacz na kody stanu 0x68 i 0x78).
Jeśli bit TWEA zostanie zresetowany podczas przesyłu danych, moduł TWI zwróci "brak potwierdzenia" ("1") na linii SDA po następnym odebranym bajcie danych. Może to zostać użyte do poinformowania, że Slave nie jest w stanie przyjąć więcej bajtów. Gdy TWEA ma stan zero, TWI nie potwierdza swojego własnego adresu Slave. Jednakże magistrala TWI jest wciąż monitorowana i rozpoznawanie adresu może zostać ponownie włączone w dowolnej chwili przez ustawienie TWEA. Wynika z tego, iż bitu TWEA można użyć do chwilowej izolacji modułu TWI od magistrali TWI.
We wszystkich trybach uśpienia innych niż tryb bezczynny (ang. Idle mode) system zegarowy modułu TWI jest wyłączony. Jeśli bit TWEA jest ustawiony, interfejs wciąż może potwierdzać swój własny adres Slave przez wykorzystanie zegara z magistrali TWI jako źródła zegarowego. W takim przypadku mikrokontroler wybudzi się z uśpienia, a moduł TWI będzie utrzymywał linię zegarową SCL w stanie niskim podczas wybudzania do czasu, aż znacznik TWINT zostanie wyzerowany (przez zapis jedynki). Dalszy odbiór danych będzie wykonywany jak zwykle przy działających jak zwykle zegarach AVR. Zauważ, że jeśli mikrokontroler AVR został skonfigurowany do długiego czasu uruchamiania się, linia SCL może być przetrzymywana w stanie niskim przez długi czas, co blokuje inne transmisje danych. Zwróć uwagę, iż rejestr danych TWI – TWDR nie odzwierciedla ostatniego bajtu obecnego na magistrali, gdy mikrokontroler wybudzi się z tych trybów uśpienia.
Kod stanu (TWSR) z wymaskowanymi bitami preskalera | Stan magistrali TWI i modułu TWI | Odpowiedź aplikacji | Następne działanie podejmowane przez moduł TWI. | ||||
z/do TWDR | do TWCR | ||||||
STA | STO | TWINT | TWEA | ||||
0x60 | Odebrano własny SLA+W; zwrócono ACK | Brak działania na TWDR | X | 0 | 1 | 0 | Zostanie odebrany bajt danych i wysłany brak potwierdzenia NACK. |
X | 0 | 1 | 1 | Zostanie odebrany bajt danych i wysłane potwierdzenie ACK. | |||
0x68 | Przegranie arbitrażu w SLA+R/W jako Master; odebrany własny SLA+W; zwrócono ACK | Brak działania na TWDR | X | 0 | 1 | 0 | Zostanie odebrany bajt danych i wysłany brak potwierdzenia NACK. |
X | 0 | 1 | 1 | Zostanie odebrany bajt danych i wysłane potwierdzenie ACK. | |||
0x70 | Odebrano GCA; zwrócono ACK | Brak działania na TWDR | X | 0 | 1 | 0 | Zostanie odebrany bajt danych i wysłany brak potwierdzenia NACK. |
X | 0 | 1 | 1 | Zostanie odebrany bajt danych i wysłane potwierdzenie ACK. | |||
0x78 | Przegranie arbitrażu w SLA+R/W jako Master; odebrany CGA; zwrócono ACK | Brak działania na TWDR | X | 0 | 1 | 0 | Zostanie odebrany bajt danych i wysłany brak potwierdzenia NACK. |
X | 0 | 1 | 1 | Zostanie odebrany bajt danych i wysłane potwierdzenie ACK. | |||
0x80 | Poprzednio zaadresowany własnym SLA+W; dane odebrano; zwrócono ACK | Odczyt bajtu danych | X | 0 | 1 | 0 | Zostanie odebrany bajt danych i wysłany brak potwierdzenia NACK. |
Odczyt bajtu danych | X | 0 | 1 | 1 | Zostanie odebrany bajt danych i wysłane potwierdzenie ACK. | ||
0x88 | Poprzednio zaadresowany własnym SLA+W; dane odebrano; zwrócono NACK | Odczyt bajtu danych | 0 | 0 | 1 | 0 | Przełączony na niezaadresowany tryb Slave; brak rozpoznania własnego SLA lub GCA. |
Odczyt bajtu danych | 0 | 0 | 1 | 1 | Przełączony na niezaadresowany tryb Slave; własny SLA będzie rozpoznany; GCA będzie rozpoznany, jeśli TWGCE = “1”. | ||
Odczyt bajtu danych | 1 | 0 | 1 | 0 | Przełączony na niezaadresowany tryb Slave; brak rozpoznawania własnego SLA lub GCA; gdy magistrala zostanie zwolniona, będzie wysłany stan START. | ||
Odczyt bajtu danych | 1 | 0 | 1 | 1 | Przełączony na niezaadresowany tryb Slave; własny SLA będzie rozpoznany; GCA będzie rozpoznany, jeśli TWGCE = “1”; gdy magistrala zostanie zwolniona, będzie wysłany stan START. | ||
0x90 | Poprzednio zaadresowany przez CGA; dane odebrano; wysłano ACK | Odczyt bajtu danych | X | 0 | 1 | 0 | Zostanie odebrany bajt danych i wysłany brak potwierdzenia NACK. |
Odczyt bajtu danych | X | 0 | 1 | 1 | Zostanie odebrany bajt danych i wysłane potwierdzenie ACK. | ||
0x98 | Poprzednio zaadresowany przez CGA; dane odebrano; wysłano NACK | Odczyt bajtu danych | 0 | 0 | 1 | 0 | Przełączony na niezaadresowany tryb Slave; brak rozpoznawania własnego SLA lub GCA. |
Odczyt bajtu danych | 0 | 0 | 1 | 1 | Przełączony na niezaadresowany tryb Slave; własny SLA będzie rozpoznany; GCA będzie rozpoznany, jeśli TWGCE = “1”. | ||
Odczyt bajtu danych | 1 | 0 | 1 | 0 | Przełączony na niezaadresowany tryb Slave; brak rozpoznawania własnego SLA lub GCA; gdy magistrala zostanie zwolniona, będzie wysłany stan START. | ||
Odczyt bajtu danych | 1 | 0 | 1 | 1 | Przełączony na niezaadresowany tryb Slave; własny SLA będzie rozpoznany; GCA będzie rozpoznany, jeśli TWGCE = “1”; gdy magistrala zostanie zwolniona, będzie wysłany stan START. | ||
0xA0 | Odebrano stan STOP lub stan REPEATED START przy pracy jako zaadresowany Slave | Brak działania na TWDR | 0 | 0 | 1 | 0 | Przełączony na niezaadresowany tryb Slave; brak rozpoznawania własnego SLA lub GCA. |
0 | 0 | 1 | 1 | Przełączony na niezaadresowany tryb Slave; własny SLA będzie rozpoznany; GCA będzie rozpoznany, jeśli TWGCE = “1”. | |||
1 | 0 | 1 | 0 | Przełączony na niezaadresowany tryb Slave; brak rozpoznawania własnego SLA lub GCA; gdy magistrala zostanie zwolniona, będzie wysłany stan START. | |||
1 | 0 | 1 | 1 | Przełączony na niezaadresowany tryb Slave; własny SLA będzie rozpoznany; GCA będzie rozpoznany, jeśli TWGCE = “1”; gdy magistrala zostanie zwolniona, będzie wysłany stan START. |
Formaty i stany w trybie
odbiornika Slave
W trybie nadajnika Slave (ang. Slave Transmitter mode, ST) pewna liczba bajtów danych jest transmitowana do odbiornika Master (zobacz na rysunek poniżej). Wszystkie kody stanu wspomniane w tym podrozdziale zakładają wymaskowanie bitów preskalera na zero.
Transfer danych w trybie
nadajnika Slave
Aby zainicjować tryb nadajnika Slave, rejestry TWAR i TWCR należy ustawić następująco:
TWAR | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE |
wartość | Własny adres Slave urządzenia |
7 górnych bitów jest adresem, na który będzie reagował moduł TWI, gdy
zostanie zaadresowany przez jakiś układ Master. Jeśli najmłodszy bit jest
ustawiony, to TWI będzie reagować na adres wywołania ogólnego
TWCR | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | – | TWIE |
wartość | 0 | 1 | 0 | 0 | 0 | 1 | 0 | X |
Do bitu TWEN należy wpisać jedynkę, aby włączyć moduł TWI. Bit TWEA musi być zapisany jedynką, aby włączyć potwierdzanie własnego adresu Slave urządzenia lub adresu wywołania ogólnego. Bity TWSTA i TWSTO muszą być zapisane zerami.
Gdy rejestry TWAR i TWCR zostały zainicjowane, moduł TWI będzie czekał, aż do zaadresowania go jego własnym adresem Slave (lub adresem wywołania ogólnego, jeśli jest uaktywnione), za którym nadejdzie bit kierunku danych. Jeśli bit kierunku ma stan "1" (odczyt), to moduł TWI będzie pracował w trybie nadajnika Slave, ST, w przeciwnym razie nastąpi wejście w tryb odbiornika Slave, SR. Po odbiorze własnego adresu Slave i bitu zapisu, ustawiany jest znacznik TWINT i ważny kod stanu można odczytać z rejestru TWSR. Kod stanu jest wykorzystywany do określania odpowiedniego działania ze strony oprogramowania, co szczegółowo opisuje tabelka poniżej. Wejście w tryb nadajnika Slave może również nastąpić, jeśli wystąpi przegranie arbitrażu, gdy moduł TWI pracuje w trybie Master (zobacz na kod stanu 0xB0).
Jeśli bit TWEA zostanie zapisany zerem podczas przesyłu danych, moduł TWI wyśle ostatni bajt transferu. Nastąpi wejście w stan 0xC0 lub 0xC8 w zależności od tego, czy odbiornik Master transmituje NACK lub ACK po końcowym bajcie. Moduł TWI przełącza się w niezaadresowany tryb Slave i będzie ignorował układ Master, jeśli ten kontynuuje transfer. W ten sposób odbiornik Master otrzymuje same "1" jako dane szeregowe. Wejście w stan 0xC8 wykonywane jest, jeśli Master żąda dodatkowych bajtów danych (przez wysyłanie ACK), nawet jeśli Slave przesłał ostatni bajt (TWEA zero i oczekiwanie na NACK od Master).
Gdy bit TWEA ma stan zero, moduł TWI nie odpowiada na swój własny adres Slave. Slave. Jednakże magistrala TWI jest wciąż monitorowana i rozpoznawanie adresu może zostać ponownie włączone w dowolnej chwili przez ustawienie TWEA. Wynika z tego, iż bitu TWEA można użyć do chwilowej izolacji modułu TWI od magistrali TWI.
We wszystkich trybach uśpienia innych niż tryb bezczynny (ang. Idle mode) system zegarowy modułu TWI jest wyłączony. Jeśli bit TWEA jest ustawiony, interfejs wciąż może potwierdzać swój własny adres Slave przez wykorzystanie zegara z magistrali TWI jako źródła zegarowego. W takim przypadku mikrokontroler wybudzi się z uśpienia, a moduł TWI będzie utrzymywał linię zegarową SCL w stanie niskim podczas wybudzania do czasu, aż znacznik TWINT zostanie wyzerowany (przez zapis jedynki). Dalsza transmisja danych będzie wykonywana jak zwykle przy działających jak zwykle zegarach AVR. Zauważ, że jeśli mikrokontroler AVR został skonfigurowany do długiego czasu uruchamiania się, linia SCL może być przetrzymywana w stanie niskim przez długi czas, co blokuje inne transmisje danych. Zwróć uwagę, iż rejestr danych TWI – TWDR nie odzwierciedla ostatniego bajtu obecnego na magistrali, gdy mikrokontroler wybudzi się z tych trybów uśpienia.
Kod stanu (TWSR) z wymaskowanymi bitami preskalera | Stan magistrali TWI i modułu TWI | Odpowiedź aplikacji | Następne działanie podejmowane przez moduł TWI. | ||||
z/do TWDR | do TWCR | ||||||
STA | STO | TWINT | TWEA | ||||
0xA8 | Odebrano własny SLA+R; zwrócono ACK | Załaduj bajt danych | X | 0 | 1 | 0 | Ostatni bajt danych będzie nadany i NACK powinien zostać odebrany. |
Załaduj bajt danych | X | 0 | 1 | 1 | Bajt danych będzie nadany i ACK powinien zostać odebrany. | ||
0xB0 | Przegranie arbitrażu w SLA+R/W jako Master; odebrano własne SLA+R; zwrócono ACK | Załaduj bajt danych | X | 0 | 1 | 0 | Ostatni bajt danych będzie nadany i NACK powinien zostać odebrany. |
Załaduj bajt danych | X | 0 | 1 | 1 | Bajt danych będzie nadany i ACK powinien zostać odebrany. | ||
0xB8 | Bajt danych w TWDR został wysłany; odebrano ACK | Załaduj bajt danych | X | 0 | 1 | 0 | Ostatni bajt danych będzie nadany i NACK powinien zostać odebrany. |
Załaduj bajt danych | X | 0 | 1 | 1 | Bajt danych będzie nadany i ACK powinien zostać odebrany. | ||
0xC0 | Bajt danych w TWDR został wysłany; odebrano NACK | Brak działania na TWDR | 0 | 0 | 1 | 0 | Przełączony w tryb niezaadresowanego Slave; brak rozpoznawania własnego SLA lub GCA. |
0 | 0 | 1 | 1 | Przełączony w tryb niezaadresowanego
Slave; własny SLA będzie rozpoznawany, CGA będzie rozpoznawany,
jeśli |
|||
1 | 0 | 1 | 0 | Przełączony w tryb niezaadresowanego Slave; brak rozpoznawania własnego SLA lub GCA; gdy magistrala się zwolni zostanie nadany stan START. | |||
1 | 0 | 1 | 1 | Przełączony w tryb niezaadresowanego
Slave; własny SLA będzie rozpoznawany, CGA będzie rozpoznawany,
jeśli |
|||
0xC8 | Ostatni bajt w TWDR został nadany (TWEA = 0); otrzymano ACK | Brak działania na TWDR | 0 | 0 | 1 | 0 | Przełączony w tryb niezaadresowanego Slave; brak rozpoznawania własnego SLA lub GCA. |
0 | 0 | 1 | 1 | Przełączony w tryb niezaadresowanego
Slave; własny SLA będzie rozpoznawany, CGA będzie rozpoznawany,
jeśli |
|||
1 | 0 | 1 | 0 | Przełączony w tryb niezaadresowanego Slave; brak rozpoznawania własnego SLA lub GCA; gdy magistrala się zwolni zostanie nadany stan START. | |||
1 | 0 | 1 | 1 | Przełączony w tryb niezaadresowanego
Slave; własny SLA będzie rozpoznawany, CGA będzie rozpoznawany,
jeśli |
Formaty i stany w trybie nadajnika Slave
Istnieją dwa kody stanu, które nie odpowiadają zdefiniowanemu stanowi TWI (zobacz do tabelki poniżej).
Stan 0xF8 oznacza, iż nie jest dostępna żadna istotna informacja, ponieważ znacznik TWINT nie jest ustawiony. Zdarza się to pomiędzy innymi stanami oraz wtedy, gdy moduł TWI nie jest zaangażowany w przesyłanie szeregowe.
Stan 0x00 oznacza, iż zdarzył się błąd magistrali podczas przesyłu na 2-przewodowej magistrali szeregowej. Błąd magistrali występuje, gdy pojawią się stany START lub STOP na niedozwolonych pozycjach formatu ramki. Przykładami takich niedozwolonych pozycji są transmisje szeregowe bajtu adresowego, bajtu danych lub bitu potwierdzenia. Gdy wystąpi błąd magistrali, ustawiany jest znacznik TWINT. Aby wyjść z błędu magistrali, należy ustawić znacznik TWSTO i wyzerować znacznik TWINT zapisując w nim logiczną jedynkę. Powoduje to przejście modułu TWI w tryb niezaadresowanego Slave i wyzerowanie znacznika TWSTO (pozostałe bity w rejestrze TWCR nie są zmieniane). Linie SDA i SCL zostają uwolnione i nie jest transmitowany żaden stan STOP.
Kod stanu (TWSR) z wymaskowanymi bitami preskalera | Stan magistrali TWI i modułu TWI | Odpowiedź aplikacji | Następne działanie podejmowane przez moduł TWI. | ||||
z/do TWDR | do TWCR | ||||||
STA | STO | TWINT | TWEA | ||||
0xF8 | Brak dostępnej istotnej informacji; TWINT = 0 | Brak działania na TWDR | Brak działania na TWCR | Czekanie lub kontynuacja bieżącego przesłania. | |||
0x00 | Błąd magistrali z powodu niedozwolonego stanu START lub STOP | Brak działania na TWDR | 0 | 1 | 1 | X | Zmiany dotyczą tylko wewnętrznego modułu TWI, żaden stan STOP nie jest wysyłany na magistralę. We wszystkich przypadkach magistrala jest zwalniana, a TWSTO jest zerowane. |
W niektórych przypadkach należy połączyć kilka trybów TWI w celu wykonania pożądanego działania. Rozważmy przykładowo odczyt danych z szeregowej pamięci EEPROM. Typowo taki transfer angażuje następujące kroki:
Zwróć uwagę, iż dane są przesyłane zarówno od Master do Slave jak i na odwrót. Master musi poinstruować Slave, którą komórkę chce odczytać, co wymaga użycia trybu MT (nadajnika Master). Następnie dane muszą być odczytane od Slave, co wymaga użycia trybu MR (odbiornika Master). W ten sposób kierunek transferu musi być zmieniony. Podczas wszystkich tych kroków Master musi utrzymywać kontrolę nad magistralą, a kroki powinny być wykonywane jako operacja atomowa (niepodzielna czasowo). Jeśli zasada ta zostanie naruszona w systemie z wieloma układami Master, to inny Master może zmienić wskaźnik danych w EEPROM pomiędzy krokami 2 a 3, co spowoduje odczyt komórki spod złego adresu. Taka zmiana w kierunku przesłania uzyskiwana jest przez wysyłanie stanu REPEAT START pomiędzy transmisją bajtu adresowego a odbiorem danych. Po stanie REPEATED START Master utrzymuje posiadanie magistrali. Poniższy rysunek pokazuje przebieg tego transferu.
Łączenie kilku trybów TWI przy dostępie do szeregowej pamięci EEPROM
Przykład
arbitrażu
Podczas arbitrażu mogą powstać różne scenariusze, jak opisano poniżej:
Poniższy rysunek podsumowuje te przypadki. Możliwe wartości stanów są podane w kółkach.
Możliwe kody stanu spowodowane
arbitrażem
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.