Skąd dwa UARTS wiedzą, jakiej prędkości transmisji użyć?

14

Czytam o standardowym protokole dla UART i myślę, że jeśli odbierający UART nie ma pojęcia o prędkości transmisji danych, byłoby wiele problemów. Jeśli zakładana szybkość transmisji jest niższa niż prędkość transmisji, w której dane są przesyłane, pojawią się bity, których nie będzie „widoczny” przez odbierający UART. Z drugiej strony, jeśli szybkość transmisji wykorzystywana przez odbiornik jest wyższa niż prędkość transmisji, w której dane są przesyłane, pojawią się bity, które zostaną policzone dwukrotnie i spowodują nieprawidłowe odczytanie danych.

Moja wiedza na temat UART jest taka, że ​​gdy linia jest bezczynna, jest trzymana na „1”, bit Start ma wartość „0”, a bit Stop ma wartość „1”. Ponadto bit stopu „1” nie ma żadnej różnicy w stosunku do „1”, gdy linia jest bezczynna lub czy istnieje sposób na rozróżnienie?

Czy dwóch komunikujących się UART najpierw zgadza się z tym, jakiej prędkości transmisji będą używać? Jeśli tak, jak to robią?

Batibot323
źródło
„Bit stopu” równie dobrze można nazwać „powrotem do stanu bezczynności”, ale czyniąc go nieco, ma określoną minimalną długość, ale po tym gwarantowanym minimalnym czasie linia pozostanie w stanie „1” do pojawia się kolejna postać.
Peter Bennett,
Mogą losowo zmieniać typowe prędkości transmisji, dopóki coś nie zadziała XD.
Bradman175,
3
Hayes zainicjował sposób, aby UART w swoich modemach ustawiał taką samą szybkość transmisji, jak terminal rozmawiający z nim, używając sekwencji znaków „AT” na początku swoich poleceń. Zwykle nie było to dekodowane przez UART, ale przez oprogramowanie układowe w czasie rzeczywistym, które konfigurowało UART tak, aby odbierał resztę wiersza poleceń. Zasadniczo wykrył szerokość bitu początkowego i sposób ustawienia parzystości.
naprawiono
@infix Więc jeśli mam zamiar zmodyfikować lub utworzyć kod Verilog dla UART, mogę to zrobić, aby wykrył tę sekwencję AT i skorygował stamtąd prędkość transmisji? Myślałem o zainicjowaniu go z najwyższą szybkością transmisji, aby uchwycił wszystko, a stamtąd znalazł sekwencję „AT”.
Batibot323,
Protokół komunikacyjny oparty na UART (o nazwie LIN), który można często spotkać w branży motoryzacyjnej, ma mechanizm wykrywania automatycznej transmisji, ale węzły nadrzędne i podrzędne muszą „dopasować” się pod względem długości danych i długości bitów stopu. Co oznacza, że ​​wykrywanie tylko prędkości transmisji nie jest wystarczające.
Rohat Kılıç

Odpowiedzi:

26

Zwykłe UART muszą być wstępnie skonfigurowane z żądaną szybkością transmisji (jak również długość słowa, bity stopu, parzystość itp.) Tradycyjnie przez człowieka.

Jednak od kilku dziesięcioleci w niektórych ustawieniach zastosowano implementacje wykrywania „automatycznej transmisji”, która zwykle działa poprzez synchronizację kluczowych funkcji kształtu fali w celu ustalenia prędkości transmisji. Wczesne wersje wymagały przesłania znanego znaku, ale bardziej zaawansowane wersje mogą znaleźć szybkość na podstawie dowolnych danych.

Odbierający UART zazwyczaj ma lokalny zegar, który działa z większą szybkością - zwykle 8 lub 16 razy większą niż prędkość transmisji. Służy to do próbkowania sygnału przychodzącego i wykrywania bitów w słowie w sposób, który może tolerować kilka procent błędu. Nawet dwa kryształowe oscylatory nie pasowałyby idealnie do siebie, ale tolerancja błędu może pozwolić na użycie niektórych mniej precyzyjnych źródeł, czasem takich jak przycięte oscylatory na chipie itp. Może to również pomóc uwzględnić fakt, że podział popularnych częstotliwości oscylatora może tylko produkować niedokładne przybliżenie niektórych prędkości transmisji - dawniej zegary główne UART czasami potrzebowały określonych częstotliwości, aby uzyskać dostęp do popularnych prędkości transmisji, na przykład 11,0592 MHz w rodzinie 8051.

Chris Stratton
źródło
2
Moja hipoteza o automatycznym wykrywaniu szybkości transmisji może być licznikiem i licznikiem działającymi jednocześnie w celu znalezienia krawędzi i czasu między krawędziami?
ammar.cma
1
Problem polega na tym, że nie ma algorytmu, który mógłby przyjąć dowolny przebieg „szeregowy” i niezawodnie określić szybkość transmisji. Można łatwo znaleźć minimalny czas między przejściami, ale nie oznacza to bezkrytycznie pojedynczego okresu bitowego.
Peter Green,
Algorytm istnieje (słyszałem, że jest nazywany „automatyczną transmisją danych” w różnych miejscach), ale gdy jest implementowany w ograniczonym zakresie zasobów układu UART, czasami jedynym sposobem na to jest wykorzystanie niektórych wysłanych danych i używając go do kalibracji, która będzie trwała przez resztę sesji. Często nie jest to pożądane. Jeśli jest to zrobione w oprogramowaniu i ma niewielkie opóźnienie, jest to trywialne, aby to zrobić bez zużywania danych (przez tymczasowe przechowywanie ich do analizy) co najmniej dla komunikatorów o niskiej prędkości (mniej niż 200 KB / s). Wyższe prędkości stanowią dalsze trudności.
Wossname
8

Dwa UARTS „zgadzają się” na szybkość transmisji za pomocą dokumentacji oraz przez operatora / użytkownika ustawiającego szybkość transmisji ręcznie, w tym protokół uzgadniania, rozmiar bitów stop itp.

Ale..chenski
źródło
1
..... na obu końcach interfejsu.
Michael Karas
2

Tak, wszystko jest konfigurowane ręcznie, co często jest trochę uciążliwe, szczególnie gdy systemy są słabo udokumentowane (patrzę na ciebie, każdy system osadzony kiedykolwiek).

Wiem, że USB, SATA i większość innych współczesnych protokołów danych rozpoczyna się po jakimś zdarzeniu resetu lub inicjalizacji przy najniższej prędkości ze standardową domyślną konfiguracją i negocjuje ze wszystkimi innymi (lub tylko nadrzędnym, w zależności od protokołu) do wyższych prędkości . Niektórzy używają również rezystorów podwyższających lub obniżających na swoich liniach danych / mocy, aby wskazać obsługiwane prędkości.

Zobacz stronę na temat negocjacji USB, jeśli chcesz zagłębić się w inne protokoły.

Adam Naber
źródło