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

©2021 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATtiny25/45/85

USI – Uniwersalny 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 

Przegląd

Uniwersalny interfejs szeregowy (ang. Universal Serial Interface, USI), udostępnia podstawowe funkcje sprzętowe potrzebne do komunikacji szeregowej. W połączeniu z minimalnymi wymogami sterowania programowego, USI pozwala na znacząco wyższe szybkości przesyłania danych i zużycie mniejszej przestrzeni programu niż rozwiązania oparte jedynie na oprogramowaniu. Dostępne są przerwania w celu zmniejszenia obciążenia mikroprocesora.

Interfejs USI wykorzystuje następujące końcówki mikrokontrolera ATtiny25/45/85:

Na poniższym rysunku przedstawiony jest uproszczony schemat blokowy USI:

8-bitowy rejestr danych USI (ang. 8-bit USI Data Register, USIDR) zawiera nadchodzące i wychodzące dane. Jest on bezpośrednio dostępny  poprzez magistralę danych, lecz kopia jego zawartości  jest również umieszczana w rejestrze bufora USI (ang. USI Buffer Register, USIBR), skąd może być odczytana później. Jeśli rejestr USIDR jest odczytywany bezpośrednio, to należy to wykonać z największą możliwą szybkością, aby uniknąć utraty danych.

Najbardziej znaczący bit rejestru danych USI połączony jest do jednej z dwóch końcówek wyjściowych (w zależności od trybu konfiguracji, zobacz do rozdziału "Komparator analogowy"). Pomiędzy wyjściem rejestru danych USI a końcówką wyjściową znajduje się przerzutnik latch, który opóźnia zmianę wyjścia danych do pojawienia się przeciwnego zbocza zegara do zbocza używanego do próbkowania wejścia danych. Wejscie szeregowe jest zawsze próbkowane z końcówki DI (ang. Data Input, wejście danych) bez względu na konfigurację.

4-bitowy licznik można zapisywać i odczytywać poprzez magistralę danych i może on generować przerwanie przy przepełnieniu. Rejestr szeregowy oraz ten licznik są wspólnie taktowane z tego samego źródła zegarowego. Pozwala to licznikowi zliczać liczbę bitów odebranych lub wysłanych oraz generować przerwanie, gdy przesył zostanie zakończony. Zauważ, iż przy wyborze zewnętrznego źródła zegara licznik zlicza oba zbocza zegarowe. W tym przypadku licznik zliczy liczbę zboczy, a nie liczbę bitów. Zegar można wybrać z trzech różnych źródeł: końcówki USCK, przepełnienia timera 0 lub z programu.

Moduł sterujący zegarem dla trybu 2-przewodowego może generować przerwanie, gdy na magistrali 2-przewodowej zostanie wykryty stan startu. Może on również generować cykle oczekiwania przez wymuszenie stanu niskiego na końcówce zegarowej po wykryciu stanu startu lub po przepełnieniu licznika.

Na początek:  podrozdziału   strony 

Opis działania

Tryb 3-przewodowy

Tryb 3-przewodowy interfejsu USI jest zgodny z trybami 0 i 1 interfejsu SPI (ang. Serial Peripheral Interface), lecz nie posiada funkcji końcówki wyboru układu slave (ang. Slave Select, SS). Jednakże w razie konieczności można to zaimplementować programowo. Nazwy końcówek używanych w tym trybie to: DI (ang. Data Input, wejście danych), DO (ang. Data Output, wyjście danych) i USCK (ang. USI Serial ClocK, zegar szeregowy USI).

Rysunek powyżej pokazuje dwie jednostki USI współpracujące w trybie 3-przewodowym (ang. Three-wire mode), Jedna jest jednostką nadrzędną Master, a druga jest jednostką podporządkowaną Slave. Dwa rejestry przesuwające są ze sobą połączone w taki sposób, iż po ośmiu taktach zegara USCK dane w każdym z tych rejestrów zostaną wzajemnie wymienione. Ten sam zegar zwiększa również stan 4-bitowego licznika USI. Znacznik przerwania przy przepełnieniu licznika (ang. Counter Overflow interrupt Flag, USIOIF) można wtedy wykorzystać do określenia, czy przesył został zakończony. Zegar jest generowany przez urządzenie Master za pomocą zmian stanu końcówki USCK poprzez rejestr portu lub zapis jedynki do bitu USITC w rejestrze USICR.

Powyższy rysunek przedstawia wykres czasowy sygnałów w trybie 3-przewodowym. Na samej górze znajduje się informacja o cyklach. W każdym z tych cykli jeden bit jest wsuwany do rejestru przesuwającego USI (USIDR). Wykres czasowy sygnału USCK jest pokazany dla obu trybów zegara zewnętrznego. W trybie 0 zegara zewnętrznego (ang. External Clock mode 0, USICS0 = 0), końcówka DI jest próbkowana przy dodatnich zboczach, a końcówka DO zmienia stan (zawartość rejestru danych przesuwa się o 1 pozycję) przy zboczach ujemnych. Tryb 1 zegara zewnętrznego (ang. External Clock mode 1, USICS0 = 1) używa  zboczy w sposób przeciwny do trybu 0, tj. dane są próbkowane przy zboczach ujemnych, a wyjście zmienia się przy zboczach dodatnich. Tryby zegarowe USI odpowiadają trybom danych 0 i 1 SPI.

Zgodnie z powyższym wykresem czasowym, przesył po magistrali wymaga następujących kroków:

  1. Urządzenia Slave i Master ustawiają swoje wyjścia danych i zależnie od używanego protokołu uaktywniają wyjścia (znaczniki A i B). Wyjście jest ustawiane przez zapis danych do wysłania do szeregowego rejestru danych (ang. Serial Data Register). Uaktywnienie wyjścia jest wykonywane przez ustawienie odpowiedniego bitu w rejestrze kierunku danych portu (ang. Port Data Direction Register). Zauważ, iż punkty A i B nie posiadają określonej kolejności, lecz oba muszą wystąpić co najmniej na pół taktu USCK przed punktem C, w którym dane są próbkowane. Musi to zostać zrobione, aby zapewnić spełnienie wymogu ustawienia danych. 4-bitowy licznik zostaje zresetowany na zero.
  2. Master generuje impuls zegara przez programową dwukrotną zmianę stanu linii USCK (C i D). Wartość bitu na wejściach danych układu slave i master (DI) jest próbkowana przez USI przy pierwszym zboczu (C), a wyjście danych jest zmieniane przy zboczu przeciwnym (D). 4-bitowy licznik zliczy oba zbocza.
  3. Krok 2 jest powtarzany osiem razy dla pełnego przesłania rejestru (bajtu).
  4. Po ośmiu impulsach (tj. po 16 zboczach) licznik przepełni się i zgłosi zakończenie przesyłu. Przesłane bajty danych muszą teraz zostać przetworzone przed rozpoczęciem następnego przesyłu. Przerwanie przy przepełnieniu wybudzi procesor, jeśli został on wprowadzony w tryb bezczynny. W zależności od używanego protokołu urządzenie slave może teraz ustawić swoje wyjście w stan wysokiej impedancji.

Przykład dla układu master

Poniższy kod demonstruje sposób użycia modułu USI jako SPI Master:
Przykład w kodzie maszynowym
SPITransfer:
    out  USIDR,r16
    ldi  r16,(1<<USIOIF)
    out  USISR,r16
    ldi  r16,(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)
SPITransfer_loop:
    out  USICR,r16
    sbis USISR,USIOIF
    rjmp SPITransfer_loop
    in   r16,USIDR
    ret

Kod został zoptymalizowany na rozmiar i używa tylko ośmiu instrukcji (+ ret). Przykład ten zakłada, iż końcówki DO i USCK zostały ustawione jako wyjścia w rejestrze DDRB. Wartość umieszczona w rejestrze r16 przed wywołaniem tej funkcji jest przesyłana do urządzenia Slave, a gdy przesłanie się zakończy, dane odczytane z układu Slave są z powrotem umieszczane w rejestrze r16.

Druga i trzecia instrukcja zeruje znacznik przepełnienia licznika USI oraz zawartość tego licznika. Czwarta i piąta instrukcja ustawia tryb 3-przewodowy, dodatnie zbocze dla zegara rejestru przesuwającego, zliczanie przy strobie USITC oraz zmienia na przeciwny stan wyjścia USCK. Pętla wykonywana jest 16 razy.

Poniższy kod demonstruje użycie modułu USI jako SPI Master z maksymalną szybkością przesyłu (fsck = fck/2):
Przykład w kodzie maszynowym
SPITransfer_Fast:
    out USIDR,r16
    ldi r16,(1<<USIWM0)|(0<<USICS0)|(1<<USITC)
    ldi r17,(1<<USIWM0)|(0<<USICS0)|(1<<USITC)|(1<<USICLK)
    out USICR,r16 ; MSB
    out USICR,r17
    out USICR,r16
    out USICR,r17
    out USICR,r16
    out USICR,r17
    out USICR,r16
    out USICR,r17
    out USICR,r16
    out USICR,r17
    out USICR,r16
    out USICR,r17
    out USICR,r16
    out USICR,r17
    out USICR,r16 ; LSB
    out USICR,r17
    in  r16,USIDR
    ret

Przykład dla układu Slave

Poniższy kod demonstruje sposób użycia modułu USI jako SPI Slave:
Przykład w kodzie maszynowym
init:
    ldi  r16,(1<<USIWM0)|(1<<USICS1)
    out  USICR,r16
    ...
SlaveSPITransfer:
    out  USIDR,r16
    ldi  r16,(1<<USIOIF)
    out  USISR,r16
SlaveSPITransfer_loop:
    sbis USISR,USIOIF
    rjmp SlaveSPITransfer_loop
    in   r16,USIDR
    ret

Kod został zoptymalizowany na wielkość i składa się tylko z ośmiu instrukcji (+ ret). Przykład ten zakłada, iż końcówka DO została skonfigurowana jako wyjście, a końcówka USCK została skonfigurowana jako wejście w rejestrze DDR. Wartość umieszczona w rejestrze r16 przed wywołaniem tej funkcji zostanie przesłana do urządzenia Master, a gdy przesył się zakończy dane odebrane od Master zostaną z powrotem umieszczone w rejestrze r16.

Zwróć uwagę, iż pierwsze dwie instrukcje maja na celu inicjalizację interfejsu USI i muszą być wykonane tylko jeden raz. Ustawiają one tryb 3-przewodowy oraz taktowanie rejestru przesuwającego dodatnimi zboczami sygnału zegara. Pętla jest wykonywana aż do ustawienia znacznika przepełnienia licznika USI.

Tryb 2-przewodowy

Tryb 2-przewodowy USI nie wykorzystuje ograniczania szybkości zmian na wyjściach oraz filtrowania zakłóceń. W trybie tym używane końcówki mają nazwy SCL (ang. Serial CLock, zegar szeregowy) i SDA (ang. Serial DAta, dane szeregowe).

Powyższy rysunek przedstawia dwa moduły USI pracujące w trybie 2-przewodowym , jeden jako Master (nadrzędny) i drugi jako Slave (podporządkowany). Pokazana jest tutaj tylko warstwa fizyczna, ponieważ działanie tego systemu w dużej mierze zależy od używanego schematu przesyłu danych. Główną różnicą pomiędzy działaniem układu Master a Slave na tym poziomie jest generacja zegara szeregowego, którą zawsze wykonuje Master, a jedynie Slave wykorzystuje moduł sterowania zegarem. Generacja zegara musi być zaimplementowana programowo, lecz przesuwanie danych wykonywane jest automatycznie przez oba urządzenia. Zwróć uwagę, iż tylko taktowanie ujemnym zboczem przesuwu danych posiada praktyczne zastosowanie w tym trybie. Slave może wprowadzić stany oczekiwania na początku lub na końcu przesyłu poprzez wymuszenie stanu niskiego na linii zegarowej SCL. Oznacza to, iż Master musi zawsze sprawdzać, czy linia SCL rzeczywiście została zwolniona po tym, jak wygenerował dodatnie zbocze. Ponieważ zegar ten również zwiększa stan licznika, to przepełnienie licznika może być używane do wskazywania zakończenia przesyłu. Zegar jest generowany przez Master za pomocą zmiany stanu na przeciwny końcówki SCL poprzez rejestr PORT.

Kierunek przesyłu danych nie jest określany przez warstwę fizyczną. Do sterowania przepływem danych należy zaimplementować jakiś protokół, np. taki jak TWIbus.

Powyższy rysunek przedstawia przebiegi czasowe sygnałów w trybie 2-przewodowym. Zgodnie z nimi przesył przez magistralę obejmuje następujące kroki:

  1. Master generuje warunek startu przez wymuszenie stanu niskiego na linii SDA, podczas gdy linia SCL jest w stanie wysokim (A). Linia SDA może zostać sprowadzona w stan niski albo przez zapis zera do bitu 7 rejestru przesuwającego, albo przez ustawienie odpowiedniego bitu w rejestrze PORT na zero. Zwróć uwagę, iż bit w rejestrze kierunku danych musi być ustawiony na jeden, aby linia portu pracowała jako wyjście. Logika detektora startu urządzenia Slave (patrz – rysunek poniżej) wykrywa warunek startu (ang. start condition) i ustawia znacznik USISIF. Jeśli konieczne, znacznik ten może wygenerować przerwanie.
  2. Dodatkowo detektor startu utrzyma stan niski na linii SCL po wymuszeniu przez Master ujemnego zbocza na tej linii (B). Pozwala to układowi Slave na wybudzenie się ze stanu uśpienia lub zakończenie jego innych zadań przed ustawieniem rejestru przesuwającego w celu odbioru adresu. Wykonywane jest to przez wyzerowanie znacznika warunku startu i zresetowanie licznika.
  3. Master ustawia pierwszy bit do przesłania i zwalnia linię SCL (C). Układ Slave próbkuje dane i wsuwa je do szeregowego rejestru przy dodatnim zboczu (0 → 1) zegara SCL.
  4. Po przesłaniu ośmiu bitów zawierających adres docelowego układu Slave oraz kierunek danych (ang. R/W, read/write, odczyt/zapis) licznik Slave przepełnia się i na linii SCL zostaje wymuszony stan niski (D). Jeśli układ Slave nie jest tym, który zaadresował Master, to zwalnia linię SCL i oczekuje na nowy warunek startu.
  5. Jeśli Slave jest zaadresowany, to utrzymuje linię SDA w stanie niskim podczas cyklu potwierdzenia (ang. acknowledgment cycle, ACK) przed ponownym wymuszeniem stanu niskiego na linii SCL (tj. rejestr licznika musi zostać ustawiony na 14 przed zwolnieniem linii SCL w punkcie D). W zależności od bitu R/W Master lub Slave uaktywnia swoje wyjście. Jeśli bit ten był ustawiony, to rozpoczyna się operacja odczytu przez Master (tj. Slave steruje linią SDA). Slave może utrzymywać linię SCL w stanie niskim po potwierdzeniu (E).
  6. Teraz można przesłać wiele bajtów w tym samym kierunku, aż do pojawienia się warunku stopu ustawianego przez Master (F). Albo podania nowego warunku startu.

Jeśli Slave nie jest w stanie przyjąć więcej danych, nie potwierdza ostatnio odebranego bajtu danych. Gdy Master wykonuje operację odczytu, musi ją zakończyć przez wymuszenie stanu niskiego bitu potwierdzenia (ACK) po ostatnim przesłanym bajcie.

Detektor stanu startu

Powyższy rysunek przedstawia sieć logiczną detektora stanu startu (ang. start condition detector). Linia SDA jest opóźniana (w zakresie od 50 do 300 ns), aby zapewnić poprawne próbkowanie linii SCL.

Detektor stanu startu pracuje asynchronicznie i dlatego może wybudzać mikroprocesor w trybie uśpienia wyłączenia zasilania (ang. Power-down sleep mode). Jednakże używany protokół może posiadać ograniczenia czasu blokowania linii SCL. Z tego powodu w czasie wykorzystywania tej własności należy również brać pod uwagę czas startu oscylatora ustawiany przez bity bezpiecznikowe CKSEL (zobacz do podrozdziału "Systemy zegarowe i ich wykorzystanie").

Rozważania prędkości zegara

Maksymalna częstotliwość dla SCL i SCK wynosi fCK / 2. Jest to również maksymalna szybkość nadawania i odbierania w obu trybach dwu- i trój-przewodowym. W trybie dwu-przewodowym Slave moduł sterujący zegarem dwu-przewodowym (ang. Two-wire Clock Control Unit) wymusi stan niski na SCL, aż Slave będzie gotowy na przyjęcie więcej danych. Może to spowodować zmniejszenie faktycznej prędkości przesyłu danych w trybie dwu-przewodowym.

Na początek:  podrozdziału   strony 

Alternatywne wykorzystywanie USI

Gdy USI nie jest wykorzystywane do komunikacji szeregowej, to może wykonywać alternatywne zadania z uwagi na swoją uniwersalność.

Pół-dupleksowy asynchroniczny przesył danych

Przez wykorzystanie rejestru przesuwnego w trybie 3-przewodowym możliwe jest zaimplementowanie bardziej zwartego i szybszego w działaniu układu UART niż wersja jedynie programowa.

4-bitowy licznik

Licznik 4-bitowy USI może być używany jako samodzielny licznik z przerwaniem przy przepełnieniu. Zauważ, iż przy zewnętrznym taktowaniu licznika oba zbocza sygnału zegarowego powodują zwiększenie stanu licznika.

12-bitowy timer/licznik

Połączenie 4-bitowego licznika USI z timerem/licznikiem 0 pozwala im pracować jako licznik 12-bitowy.

Przerwanie zewnętrzne wyzwalane zboczem

Przez ustawienie licznika na wartość maksymalną (F,15) pozwala mu funkcjonować jako dodatkowe przerwanie zewnętrzne. Wtedy znacznik przepełnienia wraz z bitem włączenia przerwania są używane do generowania przerwań zewnętrznych. Ta opcja jest wybierana przez bit USICS1.

Przerwanie programowe

Przerwanie przy przepełnieniu licznika może być używane jako przerwanie programowe wyzwalane strobem zegarowym.

Na początek:  podrozdziału   strony 

Opis rejestrów USI

USIDR – USI Data Register – Rejestr danych USI

Bit 7 6 5 4 3 2 1 0  
0x0F MSB             LSB USIDR
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 danych USI można odczytywać bezpośrednio, lecz kopia danych znajduje się również w rejestrze bufora USI.

W zależności od stanu bitów USICS1:0 w rejestrze sterującym USI może być wykonana operacja przesuwu (w lewo). Przesuw może być synchronizowany ze zboczem zewnętrznego sygnału zegarowego, ze zgodnością porównania w timerze/liczniku 0 lub bezpośrednio z programu poprzez bit USICLK. Jeśli impuls zegara szeregowego pojawi się w chwili zapisu do rejestru, to rejestr będzie zawierał wpisaną wartość a przesuw nie zostanie wykonany.

Zauważ, iż nawet gdy nie jest wybrany tryb 2- ani 3-przewodowy (USIWM1:0 = 0), to zarówno zewnętrzne wejście danych (DI/SDA) jak i zewnętrzne wejście zegara (USCK/SCL) mogą wciąż być używane przez rejestr danych USI.

Używana końcówka wyjścia, DO lub SDA w zależności od trybu przewodowego, jest połączona poprzez wyjściowy przerzutnik latch do najbardziej znaczącego bitu (ang. most significant bit, MSB, bit 7) rejestru danych. Wyjściowy przerzutnik latch jest otwarty (przepuszcza dane) w czasie pierwszej połówki taktu zegara szeregowego, gdy zostało wybrane zewnętrzne źródło zegarowe (USICS1 = 1), a ciągle otwarty, gdy jest używane wewnętrzne źródło zegarowe (USICS1 = 0). Tak długo jak przerzutnik latch jest otwarty, wyjście zmienia się natychmiast, gdy będzie zapisany nowy bit MSB. Przerzutnik latch zapewnia, iż próbkowanie danych wejściowych i zmiana danych wyjściowych następują przy przeciwnych zboczach impulsu zegarowego.

Pamiętaj, iż w rejestrze kierunku danych należy ustawić odpowiedni bit tak, aby końcówka (DO/SDA) pracowała jako wyjście w celu umożliwienia wyprowadzania danych z rejestru przesuwającego.


USIBR – USI Buffer Register – Rejestr bufora USI

Bit 7 6 5 4 3 2 1 0  
0x10 MSB             LSB USIBR
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  

Zamiast odczytywania danych z rejestru danych USI (ang. USI Data Register, USIDR) można korzystać z rejestru buforowego USI (ang. USI Buffer Register, USIBR). Dzięki temu sterowanie modułem USI staje się mniej krytyczne czasowo, co daje mikroprocesorowi więcej czasu na zajmowanie się innymi zadaniami w programie. Znaczniki USI są ustawiane podobnie jak przy odczycie rejestru USIDR.

Zawartość rejestru danych USI jest ładowana do rejestru bufora USI, gdy przesył został zakończony.


USISR – USI Status Register – Rejestr stanu USI

Bit 7 6 5 4 3 2 1 0  
0x0E USISIF USIOIF USIPF USIDC USICNT3 USICNT2 USICNT1 USICNT0 USISR
Zapis/Odczyt Z/O Z/O Z/O O Z/O Z/O Z/O Z/O  
Wartość początkowa 0 0 0 0 0 0 0 0  

Rejestr stanu zawiera znaczniki przerwań, znaczniki stanu linii oraz wartość licznika.

Bit 7 – USISIF: Start Condition Interrupt Flag – Znacznik warunku startu

Gdy zostanie wybrany tryb 2-przewodowy, to znacznik USISIF jest ustawiany na 1 po wykryciu warunku startu. Gdy jest wybrany tryb wyłączający wyjście lub tryb 3-przewodowy i (USICSx = 0b11 & USICLK = 0) lub (USICS = 0b10 & USICLK = 0), to każde zbocze sygnału na końcówce  SCK ustawia ten znacznik. Jeśli są ustawione bity USISIE w rejestrze USICR oraz I w rejestrze stanu mikrokontrolera SREG, to ustawienie tego znacznika powoduje wygenerowanie przerwania. Znacznik jest zerowany tylko przez zapis 1 do bitu USISIF. Wyzerowanie tego bitu zakończy wstrzymywanie przy wykryciu startu linii USCL w trybie 2-przewodowym. Przerwanie od warunku startu wybudza procesor ze wszystkich trybów uśpienia.

Bit 6 – USIOIF: Counter Overflow Interrupt Flag – Znacznik przerwania przy przepełnieniu licznika

Ten znacznik ustawiony zostaje na 1, gdy 4-bitowy licznik przepełnia się (tj. przy przejściu z 15 na 0). Przerwanie będzie wygenerowane, gdy znacznik ustawi się na 1 przy ustawionych bitach USIOIE w rejestrze USICR oraz I w rejestrze stanu SREG. Znacznik jest zerowany tylko przez zapis 1 do bitu USIOIF. Wyzerowanie znacznika zwolni wstrzymanie linii SCL w trybie 2-przewodowym. Przerwanie przy przepełnieniu licznika wybudza mikrokontroler z trybu bezczynności (ang. Idle sleep mode).

Bit 5 – USIPF: Stop Condition Flag – Znacznik warunku stopu

Po wybraniu trybu 2-przewodowego znacznik USIPF jest ustawiany na 1, gdy zostanie wykryty warunek stopu. Znacznik jest zerowany przez zapis jedynki do tego bitu. Zauważ, iż nie jest to znacznik przerwania. Sygnał ten jest użyteczny przy implementacji arbitrażu master dla magistrali 2-przewodowej.

Bit 4 – USIDC: Data Output Collision – Kolizja danych wyjściowych

Bit ten przyjmuje wartość logiczną jeden, jeśli bit 7 rejestru przesuwającego różni się od fizycznego stanu końcówki wyjścia. Znacznik ma znaczenie tylko w trybie 2-przewodowym. Sygnał ten jest użyteczny przy implementacji arbitrażu master dla magistrali 2-przewodowej.

Bity 3...0 – USICNT3..0: Counter Value – Wartość licznika

Te bity odzwierciedlają bieżącą wartość licznika 4-bitowego. Mikroprocesor może bezpośrednio odczytywać i zapisywać ten licznik.

4-bitowy licznik zwiększa swoją zawartość przy wykryciu zbocza w zewnętrznym sygnale zegarowym, przy przepełnieniu timera/licznika 0 lub programowo za pomocą bitów strobowych USICLK lub USITC. Źródło zegarowe zależy od ustawienia bitów USICS1...0. Przy pracy na zegarze zewnętrznym istnieje specjalna możliwość tworzenia impulsu zegarowego przez zapis do bitu strobowego USITC. Opcja ta jest uaktywniana przez zapis jedynki do bitu USICLK przy ustawianiu zewnętrznego źródła zegarowego (USICS1 = 1). Zauważ, iż nawet gdy nie jest wybrany żaden tryb przewodowy (USIWM1...0 = 0), to wejście zegara zewnętrznego (USCK/SCL) wciąż może być używane przez licznik.


USICR – USI Control Register – Rejestr sterujący USI

Bit 7 6 5 4 3 2 1 0  
0x0D USISIE USIOIE USIWM1 USIWM0 USICS1 USICS0 USICLK USITC USICR
Zapis/Odczyt Z/O Z/O Z/O Z/O Z/O Z/O Z Z  
Wartość początkowa 0 0 0 0 0 0 0 0  

Rejestr sterujący zawiera sterowanie włączaniem przerwań, ustawianie trybu przewodowego, ustawianie wyboru zegara oraz strob zegarowy.

Bit 7 – USISIE: Start Condition Interrupt Enable – Włączanie przerwania od warunku startu

Ustawienie tego bitu na 1 włącza przerwania od detektora warunku startu. Jeśli jest jakieś przerwanie oczekujące, gdy są ustawiane na jeden bit  USISIE oraz bit I globalnego włączania przerwań w rejestrze stanu SREG, to oczekujące przerwanie zostanie natychmiast wykonane.

Bit 6 – USIOIE: Counter Overflow Interrupt Enable –  Włączanie przerwania przy przepełnieniu licznika

Ustawienie tego bitu na 1 włącza przerwania od przepełnienia licznika 4-bitowego USI. Jeśli jest jakieś przerwanie oczekujące, gdy są ustawiane na jeden bit  USIOIE oraz bit I globalnego włączania przerwań w rejestrze stanu SREG, to oczekujące przerwanie zostanie natychmiast wykonane.

Bity 5...4 – USIWM1..0: Wire Mode – Tryb przewodowy

Te bity wybierają rodzaj trybu przewodowego do używania przez USI. Właściwie bity te wpływają tylko na wyjścia. Wejścia danych i zegara nie ulegają zmianom przez wybrany tryb pracy USI i zawsze zachowują tę samą funkcję. Z tego powodu licznik oraz rejestr przesuwający mogą być taktowane zewnętrznie, a dane wejściowe mogą być próbkowane, nawet jeśli wyjścia są zablokowane. Poniższa tabelka podsumowuje zależności pomiędzy bitami USIWM1...0 a działaniem USI:

USIWM1 USIWM0 Opis
0 0 Wyłączenie wyjść, wstrzymywania zegara i detektora startu. Końcówki portu pracują normalnie.
0 1 Tryb 3-przewodowy. Używa końcówek DO, DI i USCK.
W tym trybie końcówka wyjścia danych (DO) przechwytuje odpowiadający jej bit w rejestrze PORT. Jednakże odpowiedni bit DDR wciąż określa kierunek przesyłu danych. Gdy końcówka portu pracuje jako wejście, to opornik podciągający tej końcówki jest kontrolowany przez bit PORT.
Końcówki wejścia danych (DI) i zegara szeregowego (USCK) nie wpływają na normalną pracę portu. Przy pracy jako master impulsy zegarowe są generowane programowo przez zmianę stanu rejestru PORT, natomiast kierunek danych jest ustawiony jako wyjście. Do tego celu może być wykorzystany bit USITC w rejestrze USICR.
1 0 Tryb 2-przewodowy. Używa końcówek SDA (DI) i SCL (USCK)(1).
Końcówki danych szeregowych (SDA) i zegara szeregowego (SCL) są dwukierunkowe i wykorzystują wyjścia typu otwarty kolektor. Wyjścia te są uaktywniane przez ustawienie odpowiednich bitów dla SDA i SCL w rejestrze DDR.
Gdy wyjście jest uaktywnione dla końcówki SDA, to wymusza stan niski linii SDA, jeśli wyjście z rejestru przesuwającego lub stan odpowiedniego bitu w rejestrze PORT wynosi 0. W przeciwnym razie linia SDA nie jest wysterowana (tzn. jest uwolniona).
Gdy zostanie uaktywnione wyjście dla końcówki SCL, to linia SCL będzie wymuszona stanem niskim, jeśli odpowiedni bit w rejestrze PORT wynosi zero lub przez detektor startu. W przeciwnym razie linia SCL nie jest wysterowana.
Linia SCL jest utrzymywana w stanie niskim, gdy detektor startu wykryje warunek startu, a wyjście jest uaktywnione. Wyzerowanie znacznika warunku startu (USISIF) zwalnia tę linię. Włączenie tego trybu nie wpływa na wejścia końcówek SDA i SCL. W trybie 2-przewodowym oporniki podciągające końcówek portu SDA i SCL są wyłączone.
1 1 Tryb 2-przewodowy. Korzysta z końcówek SDA i SCL.
Działa tak samo jak tryb 2-przewodowy opisany powyżej z tym wyjątkiem, iż linia SCL jest również utrzymywana w stanie niskim, gdy następuje przepełnienie licznika, a stan niski jest wymuszany do czasu wyzerowania znacznika przerwania przy przepełnieniu licznika (USIOIF).
Uwaga: 1. Końcówki DI i USCK mają zmienione nazwy odpowiednio na SDA (ang. Serial Data, dane szeregowe) i SCL (ang. Serial Clock, zegar szeregowy) w celu uniknięcia zamieszania pomiędzy trybami pracy USI.

Bity 3...2 – USICS1..0: Clock Source Select – Wybór źródła zegarowego

Te bity ustawiają źródło zegarowe dla rejestru przesuwającego i licznika. Wyjściowy przerzutnik latch zapewnia, iż wyjście jest zmieniane przy przeciwnym zboczu sygnału zegarowego niż próbkowanie wejścia danych (DI/SDA), gdy używane jest zewnętrzne źródło zegarowe (USCK/SCL). Gdy zostanie wybrana opcja zegarowa programowego strobu lub przepełnienia timera 0, wyjściowy przerzutnik Latch zawsze przepuszcza dane i dlatego wyjście zmienia się natychmiast. Wyzerowanie bitów USICS1...0 uaktywnia opcję programowanego strobu. Podczas używania tej opcji zapis jedynki do bitu USICLK powoduje powstanie taktu zegarowego dla rejestru przesuwającego oraz dla licznika. Przy zewnętrznym źródle zegarowym (USICS1 = 1) bit USICLK nie pełni już dłuzej funkcji strobu, lecz wybiera pomiędzy taktowaniem zewnętrznym a taktowaniem programowym za pomocą bitu strobowego USITC.

Poniższa tabelka pokazuje związek pomiędzy ustawieniami bitów USICS1...0 i USICLK a żródłem zegarowym używanym dla rejestru przesuwającego i 4-bitowego licznika.

USICS1 USICS0 USICLK Źródło zegara dla rejestru przesuwającego Źródło zegara dla 4-bitowego licznika
0 0 0 Brak zegara Brak zegara
0 0 1 Strob programowy zegara
(USICLK)
Strob programowy zegara
(USICLK)
0 1 X Przepełnienie timera/licznika 0 Przepełnienie timera/licznika 0
1 0 0 Zewnętrzne, zbocze dodatnie Zewnętrzne, oba zbocza
1 1 0 Zewnętrzne, zbocze ujemne Zewnętrzne, oba zbocza
1 0 1 Zewnętrzne, zbocze dodatnie Strob programowy zegara
(USITC)
1 1 1 Zewnętrzne, zbocze ujemne Strob programowy zegara
(USITC)

Bit 1 – USICLK: Clock Strobe – Strob zegarowy

Zapis jedynki do tego bitu powoduje przesunięcie zawartości rejestru przesuwającego o jedną pozycję w lewo oraz zwiększa o 1 zawartość licznika, pod warunkiem ustawienia bitów USICS1..0 na zero i wybrania opcji programowego strobu zegarowego. Wyjście zmieni się natychmiast po wykonaniu strobu zegarowego, tj. w tym samym cyklu instrukcji. Wartość wsuwana do rejestru przesuwającego została spróbkowana w poprzednim cyklu instrukcji.

Bit zostanie odczytany jako zero.

Gdy wybrane jest zewnętrzne źródło zegarowe (USICS1 = 1), to funkcja bitu USICLK zmienia się ze strobu zegarowego na rejestr wyboru zegara. Ustawienie bitu USICLK w tym przypadku wybierze strob USITC jako źródło zegarowe dla licznika 4-bitowego (patrz tabelka powyżej).

Bit 0 – USITC: Toggle Clock Port Pin – Zmiana stanu końcówki portu na przeciwny

Zapis jedynki do tego bitu zmienia stan USCK/SCL albo z 0 na 1, albo z 1 na 0. Zmiana ta jest niezależna od ustawień rejestru kierunku danych, jednak jeśli wartość PORT ma się pojawić na końcówce, to bit DDB7 musi ją ustawić jako wyjście. Ta cecha ułatwia generację zegara przy implementacji urządzeń master.

Bit będzie odczytany jako zero.

Jeśli wybrane jest źródło zegara zewnętrznego (USICS1 = 1) a bit USICLK jest ustawiony na jeden, to zapis do bitu strobowego USITC wyśle takt zegarowy bezpośrednio do licznika 4-bitowego. Pozwala to na wczesne wykrycie zakończenia przesłania danych, gdy USI pracuje jako urządzenie master.

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