Частота UART в микроконтроллерах [закрыто]

Я читал в книге "Последовательный порт полный, 2-е издание", что часы UART должны быть в 16 раз больше скорости передачи данных , но я никогда не видел ни одного микроконтроллера, в котором мы задаем частоту UART, прежде чем настраивать его на конкретную скорость передачи данных. ставка. Так:

1) Почему частота должна быть в 16 раз выше скорости передачи?

2) Можете ли вы привести пример любого микроконтроллера, где мы устанавливаем частоту UART?

3) Какова цель установки тактовой частоты UART, если у нас есть таймеры? Например, мы генерируем скорость передачи в простом 89c52 через Таймер 1, и мы не устанавливаем никакой частоты.

4) Какова идея установки скорости передачи данных с помощью таймера, как мы это делаем в 89c5x. Как это связано с частотой UART?

5) RS-232 — «рекомендуемый стандарт 232», а UART — физический. Аппаратное обеспечение выполняет параллельно-последовательные и последовательно-параллельные преобразования. Я прав?

6) Содержит ли UART счетчик, чтобы после начального бита он ждал 8 циклов, а затем после каждых 16 циклов выборки брались из линии RX для обнаружения бита?

UART используют передискретизацию, обычно от 8 до 16 раз, чтобы собирать данные с неточно известной скоростью, начиная с произвольного момента времени; это отличается от синхронных интерфейсов, где блокировка предоставляется отправителем. Практически любой настраиваемый UART требует, чтобы вы установили его «частоту», установив делитель тактовой частоты для получения тактовой частоты с частотой передискретизации. Этот делитель часов в некотором роде похож на блок таймера, но гораздо, гораздо более ограничен в возможностях, поскольку у него есть только одна цель.
Ну, я знаю, что UART берет выборку в середине бита, я использовал UART много раз, но никогда не устанавливал его частоту с помощью какой-либо PLL и т. д., также меняя скорость передачи данных, я никогда не менял частоту UART до 8/16 раз.
Установка его скорости передачи точно меняет частоту тактовой частоты передискретизации. Обычно это делается путем деления еще более быстрых тактовых импульсов (тактовых импульсов ядра MCU или тактовых импульсов периферийной шины), а не с помощью уникальной PLL, поэтому он ограничивается коэффициентами этой тактовой частоты. Конечно, сегодня тактовая частота ядра MCU обычно обеспечивается PLL. Выбор между 8-кратным и 16-кратным режимом передискретизации, если выбор разрешен, обычно осуществляется в бите регистра конфигурации.
В дополнение к хорошему объяснению @ChrisStratton (CS, пожалуйста, введите ответ), многие UART формируют уровень принимаемого бита из 3 выборок примерно в середине бита. 8051 использовал 7-й/8-й/9-й образцы и взял среднее значение, поэтому ваш 89C52 почти наверняка делает то же самое (посмотрите). Мои VHDL UART делают это надежно. Передискретизация (16x) (a) выравнивает приемник в пределах +/-3% от переднего фронта начального бита и (b) упрощает передискретизацию/фильтрацию битов, пропорциональную битрейту. Большинство 10-летних и более BRG основаны на 16x, посмотрите на расчеты fclk-> baud. Многие новые используют «дробные» BRG. Вы можете легко найти и прочитать об этом в Интернете.
В этом отношении AVR могут быть задокументированы более подробно. См., например, раздел 20.3 «Генерация тактовых импульсов» в техническом описании ATMega328 .
Дополнительные сведения о протоколе UART, стартовом бите, стоповом бите и тактовой частоте дискретизации 16x см. на electronics.stackexchange.com/a/42240/4512 и electronics.stackexchange.com/a/91453/4512 .
Для передачи вы можете легко синхронизировать свою логику 1: 1 со скоростью передачи данных, это асинхронный прием, который требует более высоких часов. По сути, он обеспечивает фазовое разнесение для синхронизации начального бита.
RS-232 — это электрический и контактный стандарт, а не стандарт протокола, поэтому RS-232 очень специфичен для разъема и напряжения. у вас может быть uart/serial без rs-232 и с микроконтроллером, который у вас есть, у них нет обычно встроенных приемопередатчиков rs232 (если вообще когда-либо?).

Ответы (3)

1) Почему частота должна быть в 16 раз выше скорости передачи?

Как уже указывал Крис в комментариях, тактового сигнала нет, UART RS-232 — это асинхронные системы. Это означает, что мы понятия не имеем, когда начнутся входящие данные, и можно с уверенностью сказать, что часы передатчика будут работать с несколько иной скоростью, чем часы получателей. Чтобы справиться с этим, UART выполняет передискретизацию входящих данных, чтобы он мог получить разумную меру того, где находятся переходы в данных. Для передискретизации вам нужны часы, работающие значительно быстрее, чем скорость передачи данных.

2) Можете ли вы привести пример любого микроконтроллера, где мы устанавливаем частоту UART?

Практически все они будут содержать различные регистры для установки этого. например, на LPC1768 есть регистр дробного делителя для установки тактового предварительного делителя на логику UART. Как правило, установка тактовой частоты для логики UART также устанавливает скорость передачи для вывода, поэтому может быть неочевидно, что вы устанавливаете часы на 16-кратную скорость передачи.

3) Какова цель установки тактовой частоты на UART, если у нас есть таймеры? Например, мы генерируем скорость передачи в простом 89c52 через Таймер 1, и мы не устанавливаем никакой частоты.

Чтобы вы могли запускать каждый UART с разной скоростью передачи данных, не используя все свои таймеры?

4) Какова идея установки скорости передачи данных с помощью таймера, как мы это делаем в 89c5x. Как это связано с частотой UART?

Понятия не имею, не использовал эту часть, но это кажется немного странным.

5) RS-232 рекомендуется стандартный 232, а UART — физический. Аппаратное обеспечение выполняет параллельно-последовательные и последовательно-параллельные преобразования. Я прав?

Да, UART имеет 8-битный буфер приема и передачи, процессор работает только с байтами данных, аппаратное обеспечение UART обрабатывает преобразование в последовательный порт и обратно.

6) Содержит ли UART счетчик, чтобы после начального бита он ждал 8 циклов, а затем после каждых 16 циклов выборки брались из линии RX для обнаружения бита?

Он содержит конечный автомат, который отслеживает текущую точку цикла передачи/приема. Этот конечный автомат будет содержать как счетчики, так и логику для обнаружения переходов, стартовых и стоповых битов и генерации/проверки битов четности. Если вы не хотите создавать свой собственный UART, вам не нужно беспокоиться о том, что именно происходит внутри этого конечного автомата. Если вы хотите создать свой собственный UART, то это совершенно новая тема.

Вопрос и некоторые ответы сбивают с толку «часы», «частоту» и «скорость передачи».

Как объяснялось, внутри UART есть часы, которые обычно в 16 раз превышают желаемую скорость передачи данных. Когда у меня были волосы, эти часы были подключены к UART с помощью аппаратного делителя, обычно устанавливаемого DIP-переключателями, от кварцевого генератора.

Но UART, такой как 16550 или UART в микроконтроллере, содержит схему делителя. Когда вы «устанавливаете скорость передачи данных» путем записи в регистр UART, вы устанавливаете делитель. На вход подаются высокочастотные часы, часто часы процессора.

Таким образом, 16550 часто будет иметь вход от кварцевого генератора 1,8432 МГц. Разделите это на 16, и вы получите 115200 бод, самую высокую скорость, доступную для этого UART, использующего этот вход. Чтобы получить эту скорость передачи, вы должны установить делитель скорости передачи UART на 1. Установите делитель на 2, и вы получите 57600 бод. Установите его на три, и вы получите 38400 бод и т. д.

У более необычных UARTS есть логика «дробного делителя», которая позволяет вам получить стандартную скорость передачи данных (или близкую к ней) от входного генератора, которая не является целым числом, кратным скорости передачи данных.

Мне очень понравилось то, что вы упомянули в своем ответе. т.е. «наибольшая скорость, доступная с этим UART, использующим этот вход». Это действительно имеет смысл... Спасибо.

Некоторые из принципов проектирования UART восходят к временам, когда совокупная стоимость кристалла, схемы деления на три и делителя частоты в степени двойки была ниже, чем стоимость полностью программируемого делителя частоты.

Наиболее универсальным способом разработки UART было бы использование отдельных программируемых делителей частоты для передачи и приема, каждый из которых настроен на 1-кратную скорость передачи данных, и «глушить» каждый на программируемом счете, когда соответствующая сторона UART простаивает. Однако для этого потребовалось бы использование двух отдельных полностью программируемых делителей частоты. Дешевле иметь один программируемый делитель, совместно используемый для передачи и приема, но он должен работать достаточно быстро, чтобы и передатчик, и приемник могли независимо разделить его дальше.