Jak ważne są częstotliwości UART?

17

Będę używał kryształu 8 MHz, aby uruchomić mój mikrokontroler przy 16 MIPS (PLL 4x, 2 instrukcje cyklu). Jednak 8 MHz nie dzieli się na żadne częstotliwości UART AFAIK ... więc jak ważne są te częstotliwości? Planuję użyć 115 200 bodów.

Czy UART może działać w granicach ± ​​1%? Jeśli to nie zadziała, jakiej częstotliwości powinienem użyć? (Chciałbym uzyskać maksymalnie 16 MIPS, jak to możliwe, dla maksymalnej prędkości przetwarzania.) Jeśli to ważne, używam PIC24FJ64GA004.

Thomas O
źródło

Odpowiedzi:

13

Jeśli jesteś w granicach 1%, powinieneś być OK.

Załóżmy, że Twój UART używa na przykład zegara nadpróbkowania 16x, na przykład możesz ustawić go na 1 843 200 Hz na 16x nadpróbkę 115 200 bps. (takie nadpróbkowanie jest dość powszechne) Pozwala to UART odliczyć 8 przetaktowań od opadającej krawędzi bitu początkowego, dzięki czemu może zlokalizować środek komórek bitowych z dokładnością do +/- jednego okresu przetaktowania, po który odlicza 16 okresów przetaktowania, aby określić, kiedy próbkować dane.

Jeśli założymy, że może uderzyć w środek bitu początkowego, to aby nadal próbkować dane szeregowe w prawidłowych komórkach bitowych przez 8 bitów danych, częstotliwość zegara musi pozostać pomiędzy (8-0,5) / 8 a (8 + 0,5) ) / 8 lub +/- 6,25% zamierzonej przepływności. Wyższe podkręcanie zbliża się do idealnego stanu uderzenia w środek bitu początkowego, ale 8x lub 16x jest zwykle wystarczająco blisko, aby założyć, że 5% niedopasowania zadziała.

Nie można jednak liczyć na to, że druga strona będzie idealnie pasować do częstotliwości. Jeśli podłączysz urządzenie, które jest 4% szybkie do urządzenia, które jest 4% wolne, będziesz mieć problem. Wystąpił co najmniej jeden przypadek, w którym komputer działał trochę wolniej, a urządzenie trochę szybko, a oba mogły komunikować się tylko nieznacznie, chociaż to samo urządzenie działało dobrze z innymi komputerami, a komputer działał z innymi urządzenia. (O-scoped te przy około 112 kb / s i 119 kb / s) Z tego powodu warto starać się jak najbliżej osiągnąć częstotliwość nominalną. Nigdy nie widziałem, aby coś w granicach 2% wartości nominalnej miało problem.

Zazwyczaj stosuje się częstotliwość taktowania nadrzędnego, która zapewnia całkowitą wielokrotność zamierzonej częstotliwości nadmiernego próbkowania UART razy szybkość transmisji. Na przykład, jeśli chcesz, aby procesor działał z częstotliwością około 8 MHz, możesz użyć oscylatora 7,3728 MHz, który można podzielić przez 4, aby uzyskać 1,8432 MHz, czyli dokładnie 16 razy 115200.

JustJeff
źródło
8 MHz można podzielić przez 69, aby uzyskać 115 942, czyli w granicach ± ​​1%. Zastanawiam się, czy PIC obsługuje ten typ podziału dla generatora szybkości transmisji. Mam taką nadzieję, ale nie sądzę, że tak będzie.
Thomas O
PIC ma generator prędkości transmisji. Działałby dobrze, ale tylko dla niższych prędkości transmisji, takich jak 9600, nie działałby dla wysokich prędkości, takich jak 115 200, staje się zbyt nieprecyzyjny.
Thomas O
Myślisz, że mógłbym użyć kryształu 7,3728 MHz? (Nie zamierzam używać wewnętrznego oscylatora 7,37 MHz, ponieważ chciałbym precyzji.) To pozwala mi podzielić przez 64, aby uzyskać częstotliwość UART równą 115 200. Jest to najszybszy, jaki mogę przejść z wysoką tolerancją.
Thomas O
1
jeśli Twój UART go obsługuje, lepiej jest podkręcić go (np. 16x), aby mógł przeskalować bit startowy i znaleźć środek komórki bitowej, ale uzyskanie 16x dla 115K z dokładnością do 1% może być wyzwaniem, chyba że używasz kryształu wielokrotności baud.
JustJeff,
4

Wspomniane 1% @JustJeff nie jest wymagane. Większość UART pozwala na błąd o pół tonu w ostatnim bicie. Najczęściej ramka składa się z 1 bitu początkowego, 8 bitów danych i 1 bitu stopu, co daje w sumie 10 bitów. Połowa na 10 bitów to 5% (6,25% JustJeff nie bierze pod uwagę bitu startu i stopu).

stevenvh
źródło
1
nie cytuj mnie źle; jeśli chodzi o „1%”, stwierdziłem, że może to być trudne do osiągnięcia. „6,25%” zakładało, że trafiłeś w środek bitu początkowego, i w takich warunkach byłaby to maksymalna dopuszczalna różnica w częstotliwościach zegara odbiornik względem nadajnika.
JustJeff,
1

JustJeff zapomniał o bicie startowym, ale Stevenh dodał bit stopu. Zakładając, że wspólny protokół składa się z 8 bitów danych, 1 bitu początkowego i bez bitu parzystości (liczba bitów stopu nie ma znaczenia), istnieje 8 1/2 bitu razy od wiodącej krawędzi bitu początkowego do środka ostatni bit danych. Ogólnie rzecz biorąc, chcesz, aby odbiornik próbkował ten ostatni bit w czasie 1/4 bitu. Zauważ, że 1/2 bitu jest gwarantowanym progiem niepowodzenia. Wszystko w pobliżu staje się nierealne, ponieważ zawsze występuje szum elektryczny i drgania.

1/4 podzielone przez 8 1/2 = 2,94%.

Jak wspomniano JustJeff, większość implementacji UART faktycznie próbkuje przychodzące dane za pomocą asynchronicznego zegara 16x. Dodaje to kolejną niepewność czasową 1/16 bitu, ponieważ jest to błąd, z którym można zmierzyć zbocze wyprzedzające bitu początkowego. 1/16 bitów na 8 1/2 bitów to kolejne 0,74%. Wynika to z obliczonego wcześniej budżetu błędu. W rezultacie otrzymujesz 2,2% niedopasowania zegara dla odbiornika próbkującego ostatni bit w czasie 1/4 bitu od jego środka.

Jak powiedzieli inni, stosowanie kryształu 7,3728 MHz jest powszechną praktyką, gdy wymagana jest dokładna prędkość transmisji. Zwykle możesz ustawić procesor w pobliżu jego maksymalnej prędkości, jednocześnie osiągając szybkość transmisji UART w ramach błędu kryształu.

Olin Lathrop
źródło
Nie zgadzam się, że bity stopu nie mają znaczenia. W tym pytaniu komunikacja nie powiodła się, ponieważ bit stop został błędnie ustawiony na niski poziom.
stevenvh
Bit stopu musi znajdować się tam, aby ogólna komunikacja działała, ale nie wchodzi w kalkulację budżetu błędów dla większości UART. UART będą wymagały minimalnego czasu po ostatnim bicie danych przed następnym zboczem wiodącym następnego bitu początkowego. Do tego służy bit stopu. Gdy ten czas nie zostanie dotrzymany, pojawi się „błąd ramkowania”. Być może jest to próbkowane jak bit danych, ale znam przypadki, w których był traktowany inaczej. Stare telegrafy wymagały 2 bitów stopu, aby dać mechanicznemu mechanizmowi czas na przygotowanie się do złapania następnej postaci.
Olin Lathrop,
Odniosłem się do początku trzy razy, prawda?
JustJeff,
@OlinLathrop: Bit stop jest zobowiązany do zapewnienia, że podczas wysyłania bajt którego MSB jest zero znajdzie się opadająca krawędź do następnego bitu startu. Różne urządzenia zachowują się inaczej w przypadkach, gdy linia danych obniża się zanim powinna, ale jeśli nie byłby bit stopu, przesyłana sekwencja zerowa bajtów nie zawierałaby żadnych użytecznych informacji o taktowaniu. Taki wymóg można spełnić za pomocą innych środków ze stałym narzutem na ramce mniejszym niż 25%, ale nie wiem, czy ktoś to robi.
supercat
1

Jedną z kwestii, o których jeszcze nie wspomniano, jest to, że niektóre urządzenia oczekują przesłania bajtu danych dla każdego bajtu danych, które otrzymują. Jeśli takie urządzenie jest ciągle zasilane danymi, jego prędkość transmisji jest nawet 0,1% wolniejsza niż w urządzeniu nadawczym i nie ma możliwości wysyłania lekko skurczonych bitów stopu, jego wyjście będzie pozostawać w tyle za każdy 1000 kolejnych bajty, które wchodzą. Jeśli urządzenie jest ograniczone do 16 bajtów buforowania, usunie bajt danych po przejściu około 16 000, a następnie spadnie mniej więcej jeden bajt na tysiąc. Warto zauważyć, że tak zwane modemy „1200 bodów” faktycznie działają z prędkością nieco wyższą niż 1200 bitów / sekundę (chyba około 1202) właśnie z tego powodu (tak, że nawet jeśli nadajnik jest o 0,15% szybszy niż powinien) być,

supercat
źródło