Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATmega32

2-przewodowy interfejs szeregowy

obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

Cechy


Na początek:  podrozdziału   strony 

Definicja 2-przewodowej magistrali szeregowej

2-przewodowy interfejs szeregowy (ang. Two-wire Serial Interface, TWI) nadaje się idealnie do typowych zastosowań mikrokontrolerów. Protokół TWI umożliwia projektantowi systemu połączenie ze sobą do 128 różnych urządzeń przy użyciu tylko dwóch dwukierunkowych linii, jednej dla zegara (SCL) i jednej dla danych (SDA). Jedynym zewnętrznym elementem potrzebnym do zaimplementowania tej magistrali jest pojedynczy opornik podciągający dla każdej z linii magistrali TWI. Wszystkie urządzenia podłączone do magistrali posiadają indywidualne adresy, a mechanizmy rozwiązywania konfliktów magistralowych są bezpośrednio zawarte w protokole TWI.

Połączenie za pomocą magistrali TWI

Terminologia 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.

Połączenie elektryczne

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.


Na początek:  podrozdziału   strony 

Przesył danych i format ramki

Przesyłanie bitów

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

Stany START i STOP

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

Format pakietu adresu

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

Format pakietu danych

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

Łączenie pakietów adresowych i danych w transmisję

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.


Na początek:  podrozdziału   strony 

Systemy z wieloma układami Master, arbitraż i synchronizacja

Protokół TWI zezwala na systemy magistral z kilkoma układami Master. Podjęto specjalne starania, aby zapewnić, iż transmisje będą prowadzone jak zwykle, nawet jeśli dwa lub więcej układy Master zainicjują transmisję w tym samym czasie. W systemach z wieloma układami Master powstają dwa problemy:

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.


Na początek:  podrozdziału   strony 

Przegląd modułu TWI

Moduł TWI złożony jest z kilku podmodułów, co pokazuje poniższy rysunek. Wszystkie rejestry opisane tłustym drukiem są dostępne poprzez magistralę danych AVR.

Końcówki SCL i SDA

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.

Moduł generatora szybkości przesyłania bitów

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".

Moduł interfejsu magistrali

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ł zgodności adresu

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

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:


Na początek:  podrozdziału   strony 

Opis rejestrów TWI

TWBR – TWI Bit Rate Register – Rejestr szybkości transmisji bitów TWI

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  

Bity 7..0 – TWI Bit Rate Register – Rejestr szybkości transmisji bitów TWI

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".

TWCR – TWI Control Register – Rejestr sterujący TWI

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.

Bit 7 – TWINT: TWI Interrupt Flag – Znacznik przerwania TWI

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 6 – TWEA: TWI Enable Acknowledge Bit – Włączenie bitu potwierdzenia TWI

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:

  1. Został odebrany własny adres Slave układu.
  2. Zostało odebrane wywołanie ogólne, gdy jest ustawiony bit TWGCE w TWAR.
  3. Został odebrany bajt danych w trybie odbiornika Master lub Slave.

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.

Bit 5 – TWSTA: TWI START Condition Bit – Bit stanu START TWI

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.

Bit 4 – TWSTO: TWI STOP Condition Bit – Bit stanu STOP

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 3 – TWWC: TWI Write Collision Flag – Znacznik kolizji zapisu TWI

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 2 – TWEN: TWI Enable Bit – Bit włączania TWI

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.

Bit 1 – Bit zarezerwowany

Ten bit jest zarezerwowany i zawsze daje odczyt zero.

Bit 0 – TWIE: TWI Interrupt Enable – Włączenie przerwań TWI

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..


TWSR – TWI Status Register – Rejestr stanu TWI

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  

Bity 7...3 – TWS: TWI Status – Stan TWI

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.

Bit 2 – Zarezerwowane

Ten bit jest zarezerwowany i zawsze daje odczyt zero.

Bity 1...0 – TWPS: TWI Prescaler Bits – Bity preskalera TWI

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.


TWDR – TWI Data Register – Rejestr danych TWI

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.

Bity 7...0 – TWD: TWI Data Register – Rejestr danych TWI

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.


TWAR – TWI (Slave) Address Register – Rejestr adresu (Slave) TWI

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.

Bity 7...1 – TWA: TWI (Slave) Address Register – Rejestr adresu Slave

Te siedem bitów przechowuje adres Slave modułu TWI.

Bit 0 – TWGCE: TWI General Call Recognition Enable Bit – Bit uaktywnienia rozpoznawania wywołania ogólnego

Jeśli zostanie ustawiony, to bit ten włączy rozpoznawanie wywołania ogólnego z 2-przewodowej magistrali szeregowej.


Na początek:  podrozdziału   strony 

Używanie TWI

Moduł AVR TWI jest zorientowany na bajty i oparty na przerwaniach. Przerwania są emitowane po wszystkich zdarzeniach magistrali, takich jak odbiór bajtu lub wysłanie stanu START. Ponieważ TWI jest oparte na przerwaniach, to aplikacja może swobodnie wykonywać inne działania podczas przesyłania bajtu przez TWI. Zwróć uwagę, iż bit włączania przerwań TWI (ang. TWI Interrupt Enable bit, TWIE) w rejestrze TWCR wraz z bitem globalnego uaktywniania przerwań I w rejestrze SREG pozwalają aplikacji zdecydować, czy ustawienie znacznika TWINT powinno lub nie powinno generować żądania przerwania. Jeśli bit TWIE jest wyzerowany, to aplikacja musi sprawdzać stan znacznika TWINT, aby wykrywać działania na magistrali TWI.

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.

  1. Pierwszym krokiem w transmisji TWI jest wysłanie stanu START. Wykonuje się to przez wpisanie specyficznej wartości do rejestru TWCR, co instruuje moduł TWI, aby wytransmitować stan START. Dalej opisujemy, jaką wartość należy wpisać. Jednakże ważne jest, aby we wpisywanej wartości był ustawiony bit TWINT. Zapis jedynki logicznej do bitu TWINT zeruje ten znacznik. Moduł TWI nie rozpocznie żadnego działania tak długo, jak bit TWINT w TWCR jest ustawiony. Natychmiast po wyzerowaniu przez aplikację znacznika TWINT moduł TWI zainicjuje transmisję stanu START.
  2. Gdy stan START został wysłany, znacznik TWINT w TWCR jest ustawiany, a rejestr TWSR zostaje uaktualniony kodem stanu oznaczającym, że stan START został wysłany z sukcesem.
  3. Oprogramowanie aplikacji powinno teraz sprawdzić wartość w rejestrze TWSR, aby upewnić się, że stan START został wysłany z sukcesem. Jeśli TWSR informuje inaczej, oprogramowanie aplikacji może podjąć jakieś specjalne działania, jak wywołanie procedury błędu. Zakładając, iż kod stanu jest taki, jak oczekiwano, aplikacja musi załadować SLA+W do rejestru TWDR. Pamiętaj, że rejestr TWDR jest używany zarówno na adres jak i na dane. Po załadowaniu rejestru TWDR pożądanym adresem Slave z bitem zapisu SLA+W, specyficzna wartość musi być zapisana do rejestru TWCR, instruująca moduł TWI, aby wysłać SLA+W obecne w rejestrze TWDR. Dalej opisujemy, jaką wartość należy wpisać. Jednakże ważne jest, aby we wpisywanej wartości był ustawiony bit TWINT. Zapis jedynki logicznej do bitu TWINT zeruje ten znacznik. Moduł TWI nie rozpocznie żadnego działania tak długo, jak bit TWINT w TWCR jest ustawiony. Natychmiast po wyzerowaniu przez aplikację znacznika TWINT moduł TWI zainicjuje transmisję pakietu adresowego.
  4. Gdy pakiet adresowy został wysłany, ustawiany jest znacznik TWINT w TWCR, a rejestr TWSR zostaje uaktualniony kodem stanu, oznaczającym wysłanie pakietu adresowego z sukcesem. Kod stanu będzie również odzwierciedlał, czy układ Slave potwierdził, czy nie potwierdził ten pakiet.
  5. Oprogramowanie aplikacji powinno teraz sprawdzić wartość w rejestrze TWSR, aby upewnić się, że pakiet adresowy został wysłany z sukcesem i bit ACK ma spodziewaną wartość. Jeśli TWSR wskazuje inaczej, oprogramowanie aplikacji może podjąć jakieś specjalne działania, jak wywołanie procedury błędu. Zakładając, iż kod stanu ma spodziewaną wartość, aplikacja musi załadować pakiet danych do TWDR. Następnie specyficzna wartość musi być wpisana do TWCR, instruując moduł TWI, aby przesłać pakiet danych obecny w rejestrze TWDR. Dalej opisujemy, jaką wartość należy wpisać. Jednakże ważne jest, aby we wpisywanej wartości był ustawiony bit TWINT. Zapis jedynki logicznej do bitu TWINT zeruje ten znacznik. Moduł TWI nie rozpocznie żadnego działania tak długo, jak bit TWINT w TWCR jest ustawiony. Natychmiast po wyzerowaniu przez aplikację znacznika TWINT moduł TWI zainicjuje transmisję pakietu danych.
  6. Gdy pakiet danych został wysłany, ustawiany jest znacznik TWINT w TWCR, a rejestr TWSR zostaje uaktualniony kodem stanu, oznaczającym wysłanie pakietu danych z sukcesem. Kod stanu będzie również odzwierciedlał, czy układ Slave potwierdził, czy nie potwierdził ten pakiet.
  7. Oprogramowanie aplikacji powinno teraz sprawdzić wartość rejestru TWSR, aby się upewnić, że pakiet danych został wysłany z sukcesem i że wartość bitu ACK jest zgodna z oczekiwaniem. Jeśli TWSR informuje inaczej, oprogramowanie aplikacji może podjąć jakieś specjalne działania, jak wywołanie procedury błędu. Zakładając, iż kod stanu jest taki, jak oczekiwano, aplikacja musi wpisać specyficzną wartość do TWCR, instruując moduł TWI, aby wysłał stan STOP. Dalej opisujemy, jaką wartość należy wpisać. Jednakże ważne jest, aby we wpisywanej wartości był ustawiony bit TWINT. Zapis jedynki logicznej do bitu TWINT zeruje ten znacznik. Moduł TWI nie rozpocznie żadnego działania tak długo, jak bit TWINT w TWCR jest ustawiony. Natychmiast po wyzerowaniu przez aplikację znacznika TWINT moduł TWI zainicjuje transmisję stanu STOP. Zwróć uwagę, iż TWINT NIE jest ustawiane po wysłaniu stanu STOP.

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

Na początek:  podrozdziału   strony 

Tryby transmisji

Moduł TWI może pracować w jednym z czterech głównych trybów. Noszą one nazwy: Nadajnik Master (ang. Master Transmitter, MT), Odbiornik Master (ang. Master Receiver, MR), Nadajnik Slave (ang. Slave Transmitter, ST) i Odbiornik Slave (ang. Slave Receiver, SR). Kilka z tych trybów może być używane w tej samej aplikacji. Na przykład, moduł TWI może użyć trybu MT do zapisu danych do pamięci TWI EEPROM, trybu MR do odczytu danych z powrotem z tej pamięci EEPROM. Jeśli inne układy Master są obecne w systemie, niektóre z nich mogą transmitować dane do modułu TWI, a następnie zostałby użyty tryb SR. To oprogramowanie aplikacji decyduje, które tryby są legalne.

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.

Tryb Nadajnika Master – MT

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ą.

Kody stanu dla trybu nadajnika Master
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

Tryb odbiornika Master – MR

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ą.

Kody stanu dla trybu odbiornika Master
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

Tryb Odbiornika Slave

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 (0x00), w przeciwnym razie adres ten zostanie zignorowany.

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.

Kody stanu dla trybu odbiornika Slave
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

Tryb nadajnika 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 (0x00), w przeciwnym razie adres ten zostanie zignorowany.

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.

Kody stanu dla trybu nadajnika Slave
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  TWGCE = 1.
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  TWGCE = 1; gdy magistrala się zwolni zostanie nadany stan START.
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  TWGCE = 1.
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  TWGCE = 1; gdy magistrala się zwolni zostanie nadany stan START.


Formaty i stany w trybie nadajnika Slave

Inne stany

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.

Inne kody stanu
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.

Łączenie kilku trybów TWI

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:

  1. Transfer musi zostać zainicjowany.
  2. Pamięć EEPROM należy poinstruować, którą komórkę ma odczytać.
  3. Należy wykonać ten odczyt.
  4. Należy zakończyć transfer.

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


Na początek:  podrozdziału   strony 

Systemy z wieloma układami Master i arbitraż

Jeśli wiele układów Master jest podłączonych do tej samej magistrali, transmisje mogą być inicjowane równocześnie przez jeden lub więcej z nich. Standard TWI zapewnia, iż tego rodzaju sytuacje będą obsłużone w taki sposób, iż jeden z układów Master otrzyma pozwolenie kontynuowania transferu i że w trakcie tego procesu nie zostaną utracone żadne dane. Przykład sytuacji arbitrażu jest przedstawiony poniżej, gdzie dwa układy Master próbują przesłać dane do odbiornika Slave.

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


Na początek:  podrozdziału   strony 

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: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.