Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Ustawienie na 1 obu bitów UMSEL01:0 włącza w USART0 logikę MSPIM. W tym trybie pracy logika sterująca master SPI przejmuje bezpośrednią kontrolę nad zasobami USART0. Zasoby te obejmują rejestr przesuwający nadajnika i odbiornika z buforami oraz generator szybkości transmisji. Wyłączone zostają generator parzystości i układ sprawdzania parzystości, logika odtwarzania danych i zegara oraz logika sterowania nadawaniem i odbiorem danych. Logika odbioru i nadawania USART0 zostaje zastąpiona wspólną logiką sterowania transmisją SPI. Jednakże logika sterowania końcówkami i generacją przerwań jest identyczna w obu trybach pracy.
W obu trybach położenie komórek rejestrów we/wy jest takie same. Jednakże funkcje niektórych rejestrów sterujących zmieniają się, gdy jest używany tryb MSPIM.
Logika generacji zegara generuje podstawowy zegar dla nadajnika i odbiornika. W trybie pracy USART MSPIM obsługiwane jest tylko wewnętrzne generowanie zegara (tj. praca master). Z tego powodu bit rejestru kierunku danych dla końcówki XCK (DDR_XCK) musi być ustawiony na jeden (tj. jako wyjście), aby moduł USART działał prawidłowo w trybie MSPIM. Zaleca się ustawienie bitu DDR_XCK przed włączeniem trybu USART MSPIM (tj. ustawienie bitu TXEN0 i RXEN0 na jeden).
Wewnętrzna generacja zegara w trybie MSPIM jest identyczna jak w synchronicznym trybie USART master. Z tego powodu szybkość transmisji i ustawienia UBRR0 można wyliczać z tych samych wzorów:
Tryb pracy | Wzór na szybkość transmisji | Wzór na wyliczenie wartości UBRR |
---|---|---|
Tryb synchroniczny master |
fT – szybkość transmisji w
bitach na sekundę fOSC – częstotliwość zegarowa oscylatora systemowego UBRR – zawartość rejestrów UBRR0H i UBRR0L (0...4095) |
UCPOL0 | UCPHA0 | Tryb SPI | Zbocze początkowe | Zbocze końcowe |
0 | 0 | 0 | Próbkowanie (narastające) | Ustawianie (opadające) |
0 | 1 | 1 | Ustawianie (narastające) | Próbkowanie (opadające) |
1 | 0 | 2 | Próbkowanie (opadające) | Ustawianie (narastające) |
1 | 1 | 3 | Ustawianie (opadające) | Próbkowanie (narastające) |
Ramka rozpoczyna się od najmniej lub najbardziej znaczącego bitu danych, dalej następują kolejne bity danych aż do całkowitej ich liczby równej osiem, kończąc się odpowiednio najbardziej lub najmniej znaczącym bitem. Gdy pełna ramka zostanie przesłana, to nowa może wystąpić bezpośrednio za nią lub linia transmisyjna może przejść w stan bezczynny.
Bit UDORD0 w rejestrze UCSRC0 ustawia format ramek używanych przez USART w trybie MSPIM. Odbiornik i nadajnik korzystają z tego samego ustawienia. Zapamiętaj, iż zmiana tego bitu w czasie wykonywania transmisji spowoduje błędy w przesyle zarówno dla nadajnika jak i odbiornika.
16-bitowy przesył danych można zrealizować przez zapis dwóch bajtów danych do rejestru UDR0. Wtedy przerwanie przy zakończeniu transmisji UART zasygnalizuje, że 16-bitowa wartość została przesłana.
USART0 w trybie MSPIM musi być zainicjowane przed rozpoczęciem jakiejkolwiek wymiany danych. Zwykle proces inicjalizacji składa się z ustawienia szybkości transmisji, ustawienia trybu pracy master (przez ustawienie na jeden bitu DDR_XCK), ustawienia formatu ramki i włączenia nadajnika i odbiornika. Niezależnie może pracować tylko nadajnik. Przy pracy sterowanej przerwaniami należy wyzerować globalny znacznik przerwań I w rejestrze stanu SREG (blokując w ten sposób globalnie przerwania) na czas wykonywania inicjalizacji.
Aby zapewnić natychmiastową inicjalizację wyjścia
XCK, rejestr szybkości transmisji (ang.
Baud-Rate Register,
UBRR0)
musi zawierać wartość zero w momencie włączenia nadajnika. W
przeciwieństwie do normalnego trybu pracy USART rejestr
UBRR0 musi być zapisany pożądaną
wartością po włączeniu nadajnika. Ustawienie
UBRR0 na zero przed
włączeniem nadajnika nie jest konieczne, jeśli inicjalizacja
jest wykonywana po resecie, ponieważ
UBRR0 ma już wtedy wartość
zero. |
Przed wykonaniem ponownej inicjalizacji ze zmienioną szybkością transmisji, trybem danych lub formatem ramki upewnij się, że nie jest prowadzona żadna transmisja w okresie zmiany zawartości rejestrów sterujących. Do sprawdzenia zakończenia transmisji przez nadajnik można wykorzystać znacznik TXC, natomiast znacznik RXC może być użyty do sprawdzenia, czy są jakieś nieodczytane jeszcze dane w buforze odbiorczym. Zapamiętaj, iż znacznik TXC musi być wyzerowany przed każdą transmisją (przed zapisem do rejestru UDR0), jeśli jest on wykorzystywany do tego celu.
Poniższe proste kody inicjalizacji USART pokazują równoważne sobie funkcje w asemblerze i w języku C. Przykłady zakładają przeglądanie stanu znacznika (bez włączonych przerwań). Szybkość transmisji podana jest jako parametr funkcji. Dla kodu w asemblerze parametr szybkości transmisji powinien być umieszczony w rejestrach r17:r16.
Przykład w kodzie maszynowym |
USART_Init: clr r18 out UBRR0H,r18 out UBRR0L,r18 ; Ustawienie końcówki XCK portu jako wyjście włącza tryb master. sbi XCK_DDR, XCK ; Ustaw tryb pracy MSPI i tryb danych SPI 0. ldi r18, (1<<UMSEL01)|(1<<UMSEL00)|(0<<UCPHA0)|(0<<UCPOL0) out UCSR0C,r18 ; Włącz odbiornik i nadajnik. ldi r18, (1<<RXEN0)|(1<<TXEN0) out UCSR0B,r18 ; Ustaw szybkość transmisji. ; WAŻNE: Szybkość transmisji musi być ustawiona po włączeniu nadajnika! out UBRR0H, r17 out UBRR0L, r18 ret |
Przykład w języku C |
void USART_Init( unsigned int baud ) { UBRR0 = 0; /* Ustawienie końcówki XCK portu jako wyjście włącza tryb master. */ XCK_DDR |= (1<<XCK); /* Ustaw tryb pracy MSPI i tryb danych SPI 0. */ UCSR0C = (1<<UMSEL01)|(1<<UMSEL00)|(0<<UCPHA0)|(0<<UCPOL0); /* Włącz odbiornik i nadajnik. */ UCSR0B = (1<<RXEN0)|(1<<TXEN0); /* Ustaw szybkość transmisji. */ /* WAŻNE: Szybkość transmisji musi być ustawiona po włączeniu nadajnika! */ UBRR0 = baud; } |
Gdy zostanie włączony odbiornik normalna praca końcówki RxD zostaje zmieniona na wejście szeregowe odbiornika. W obu przypadkach XCK będzie użyty jako zegar transmisji. Przesył danych jest inicjowany zapisem do komórki we/wy UDR0. Tak jest zarówno dla wysyłania jak i odbioru danych, ponieważ nadajnik kontroluje zegar transmisji. Dane wpisane do UDR0 są przenoszone z bufora nadawczego do rejestru przesuwającego, gdy ten jest gotowy na przesłanie nowej ramki.
Aby utrzymywać bufor wejściowy w synchronizacji z
liczbą wysłanych bajtów danych, rejestr
UDR0
musi być odczytywany raz dla każdego wysłanego bajtu. Działanie
bufora wejściowego jest identyczne z normalnym trybem USART, tj.
jeśli zdarzy się przepełnienie, to ostatnio odebrany znak
zostanie utracony, lecz nie pierwszy w buforze. |
Poniższe przykłady kodu pokazują prostą funkcję przesyłu w trybie MSPIM, która
jest oparta na sprawdzaniu znacznika opróżnienia rejestru danych
(UDRE0) oraz znacznika zakończenia odbioru
(RXC0). USART0 musi być zainicjowany, zanim będzie można
użyć tej funkcji. Dla kodu w asemblerze dane do wysłania mają być umieszczone w
rejestrze R16, a dane odebrane będą dostępne w tym samym rejestrze po powrocie z
wywołania funkcji.
Funkcja po prostu czeka, aż bufor nadawczy stanie się pusty, co wskaże jej znacznik UDRE0, po czym umieszcza w tym buforze nowe dane do nadania. Następnie funkcja czeka na pojawienie się danych w buforze odbiorczym, sprawdzając znacznik RXC0, po czym odczytuje ten bufor i zwraca jego zawartość.
Przykład w kodzie maszynowym |
USART_MSPIM_Transfer: ; Czekaj, aż bufor nadawczy będzie pusty sbis UCSR0A, UDRE0 rjmp USART_MSPIM_Transfer ; Umieść dane (r16) w buforze, co wyśle je out UDR0,r16 ; Czekaj na odbiór danych USART_MSPIM_Wait_RXC: sbis UCSR0A, RXC0 rjmp USART_MSPIM_Wait_RXC ; Pobierz odebrane dane z bufora i powróć z funkcji in r16, UDR0 ret |
Przykład w języku C |
unsigned char USART_Receive( void ) { /* Czekaj na pusty bufor nadawczy */ while ( !( UCSR0A & (1<<UDRE0)) ); /* Umieść dane (r16) w buforze, co wyśle je */ UDR0 = data; /* Czekaj na odbiór danych */ while ( !(UCSR0A & (1<<RXC0)) ); /* Pobierz i zwróć odebrane dane z bufora */ return UDR0; } |
Znaczniki RXC0, TXC0 i UDRE0 wraz z odpowiednimi przerwaniami w USART0 w trybie MSPIM są identyczne w działaniu jak w normalnej pracy USART0. Jednakże znaczniki błędów odbiornika (FE0, DOR0 i PE0) nie są używane i zawsze mają przy odczycie wartość zero.
Wyłączanie nadajnika lub odbiornika w USART0 pracującym w trybie MSPIM jest identyczne jak w normalnej pracy USART0.
Jednakże ponieważ USART0 w trybie MSPIM wykorzystuje ponownie zasoby USART0, to użycie USART0 w trybie MSPIM różni się nieco w porównaniu z trybem SPI. Oprócz różnic w bitach rejestrów sterujących oraz obsługi tylko pracy w trybie master przez USART0 w trybie MSPIM, różnice pomiędzy tymi dwoma modułami dotyczą następujących cech:
Poniższa tabelka zawiera porównanie pomiędzy końcówkami w trybie MSPIM i SPI.
USART_MSPIM | SPI | Komentarz |
TxD | MOSI | Tylko wyjście master |
RxD | MISO | Tylko wejście master |
XCK | SCK | (funkcjonalnie identyczne) |
(N/A) | SS | Nie obsługiwane przez USART0 w trybie MSPIM |
Funkcje i opis bitów rejestru danych USART0 (ang. USART Data Register, UDR0) w trybie MSPI są identyczne jak w normalnej pracy USART0. Zobacz na opis tego rejestru w poprzednim rozdziale.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
(0xC0) | RXC0 | TXC0 | UDRE0 | – | – | – | – | – | UCSR0A |
Zapis/Odczyt | Z/O | Z/O | Z/O | O | O | O | O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
Ten bit znacznikowy jest ustawiany, gdy w buforze odbiorczym znajdują się nieodczytane dane, a zerowany, gdy bufor odbiorczy jest pusty (tj. nie zawiera żadnych nieodczytanych danych). Jeśli odbiornik zostanie wyłączony, to bufor odbiorczy będzie opróżniony i w konsekwencji bit znacznika RXC0 przyjmie stan zero. Znacznik RXC0 może być wykorzystywany do generacji przerwania przy zakończeniu odbioru (ang. Receive Complete Interrupt) – zobacz na opis bitu RXCIE0.
Ten bit znacznikowy jest ustawiany, gdy cała ramka w nadawczym rejestrze przesuwającym (ang. Transmit Shift Register) została wysunięta na zewnątrz i nie ma w danej chwili nowych danych w buforze nadawczym (UDR0). Bit znacznikowy TXC0 jest zerowany automatycznie, gdy zostanie wykonane przerwanie przy zakończeniu przesyłu lub przez zapis logicznej jedynki na pozycji tego bitu. Znacznik TXC0 może generować przerwanie przy zakończeniu przesyłu (ang. Transmit Complete Interrupt) – zobacz na opis bitu TXCIE0.
Znacznik UDRE0 wskazuje, iż bufor nadawczy (UDR0) jest gotowy na przyjęcie nowych danych. Jeśli UDRE0 ma stan jeden, to bufor jest pusty, a zatem gotowy do zapisania. Znacznik UDRE0 może generować przerwanie przy pustym rejestrze danych (ang. Data Register Empty Interrupt) – zobacz na opis bitu UDRIE0. UDRE0 jest ustawiany po resecie w celu pokazania, iż nadajnik jest gotowy.
W czasie pracy modułu USART w trybie MSPI bity te są zarezerwowane do przyszłego użytku. Dla kompatybilności z przyszłymi mikrokontrolerami bity te należy zapisywać zerami przy zapisie do rejestru UCSR0A.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
(0xC1) | RXCIE0 | TXCIE0 | UDRIE0 | RXEN0 | TXEN0 | – | – | – | UCSR0B |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | O | O | O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
Zapis jedynki w tym bicie włącza przerwanie od znacznika RXC0. Przerwanie przy zakończeniu odbioru przez USART0 (ang. USART0 Receive Complete Interrupt) będzie generowane tylko wtedy, gdy bit RXCIE0 oraz bit globalnego włączania przerwań I w rejestrze stanu SREG będą ustawione na jeden i znacznik RXC0 w UCSR0A przyjmie stan jeden.
Zapis jedynki w tym bicie włącza przerwanie od znacznika TXC0. Przerwanie przy zakończeniu nadawania przez USART0 (ang. USART0 Transmit Complete Interrupt) będzie generowane tylko wtedy, gdy bit TXCIE0 oraz bit globalnego włączania przerwań I w rejestrze stanu SREG będą ustawione na jeden i znacznik TXC0 w UCSR0A przyjmie stan jeden.
Zapis jedynki w tym bicie włącza przerwanie od znacznika UDRE0. Przerwanie przy pustym rejestrze danych USART0 (ang. USART0 Data Register Empty Interrupt) będzie generowane tylko wtedy, gdy bit UDRIE0 oraz bit globalnego włączania przerwań I w rejestrze stanu SREG będą ustawione na jeden i znacznik UDRE0 w UCSR0A przyjmie stan jeden.
Zapisanie jedynki w tym bicie włącza odbiornik USART0 w trybie MSPIM. Po włączeniu odbiornik przejmie normalną pracę portu dla końcówki RxD. Wyłączenie odbiornika wyczyści bufor odbiorczy. Włączenie samego odbiornika w trybie MSPI (tj. ustawienie RXEN0=1 and TXEN0=0) nie ma żadnego znaczenia, ponieważ to nadajnik steruje zegarem transmisji i tylko tryb master jest obsługiwany.
Zapis jedynki do tego bitu włącza nadajnik USART0. Po włączeniu nadajnik przejmie normalną pracę portu dla końcówki TxD. Wyłączenie nadajnika (wpisanie zera do TXEN0) nie odniesie skutku, aż do zakończenia bieżących i oczekujących transmisji, tj. gdy nadawczy rejestr przesuwający (ang. Transmit Shift Register) i rejestr bufora nadawczego (ang. Transmit Buffer Register) nie będą zawierać danych do przesłania. Po wyłączeniu nadajnik nie będzie dalej przechwytywał końcówki TxD.
W trybie MSPI bity te zostały zarezerwowane do użytku w przyszłości. Dla kompatybilności z przyszłymi mikrokontrolerami bity te należy zapisywać zerami przy zapisie do rejestru UCSR0B.
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x03 (0x23) | UMSE01 | UMSEL00 | – | – | – | UDORD0 | UCPHA0 | UCPOL0 | UCSR0C |
Zapis/Odczyt | Z/O | Z/O | O | O | O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
Te bity wybierają tryb pracy modułu USART0 wg poniższej tabelki. Zobacz do opisu rejestru UCSR0C w poprzednim rozdziale, gdzie podano pełne informacje o normalnej pracy modułu USART0. Tryb MSPIM jest włączany, gdy oba bity UMSEL zostaną ustawione na jeden. Bity UDORD0, UCPHA0 i UCPOL0 można ustawić w tej samej operacji zapisu, gdy jest włączany tryb MSPIM.
UMSEL01 | UMSEL02 | Tryb |
0 | 0 | Asynchroniczny USART0 |
0 | 1 | Synchroniczny USART0 |
0 | 0 | Zarezerwowane |
1 | 1 | Master SPI (MSPIM) |
W trybie MSPI bity te zostały zarezerwowane do użytku w przyszłości. Dla kompatybilności z przyszłymi mikrokontrolerami bity te należy zapisywać zerami przy zapisie do rejestru UCSR0C.
Gdy jest ustawiony na 1, to bity są wysyłane w kolejności od najmniej znaczącego (LSB). Gdy jest ustawiony na 0, to bity są wysyłane w kolejności od najbardziej znaczącego (MSB). Więcej znajdziesz w podrozdziale "Formaty ramek".
Ustawienie bitu UCPHA0 określa, czy dane będą próbkowane przy pierwszym zboczu lub przy końcowym zboczu sygnału XCK. Zobacz do podrozdziału "Tryby danych SPI i ich przebiegi czasowe".
Bit UCPOL0 ustawia polaryzację zegara XCK. Kombinacja ustawień bitów UCPOL0 i UCPHA0 określa przebieg transmisji danych. Zobacz do podrozdziału "Tryby danych SPI i ich przebiegi czasowe".
Funkcje i opis bitów w rejestrach szybkości transmisji dla trybu MSPI są identyczne jak w normalnej pracy modułu USART0. Zobacz do opisu tych rejestrów w poprzednim rozdziale.
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.