Как два UARTS узнают, какую скорость передачи данных использовать?

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

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

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

«Стоповый бит» с таким же успехом можно было бы назвать «возвратом в состояние ожидания», но, сделав его битовым, он имеет определенную минимальную длину, но по истечении этого гарантированного минимального времени линия останется в состоянии «1» до тех пор, пока появляется следующий персонаж.
Они могут случайным образом изменять общую скорость передачи данных, пока что-то не заработает XD.
Хейс инициировал способ, позволяющий UART в их модемах устанавливать ту же скорость передачи данных, что и терминал, разговаривающий с ним, используя последовательность символов «AT» в начале своих команд. Обычно это декодировалось не UART, а микропрограммой реального времени, которая затем настраивала UART для получения остальной части командной строки. В основном он определял ширину начального бита и то, как была установлена ​​четность.
@infix Итак, если я планирую изменить или создать код Verilog для UART, я могу сделать так, чтобы он обнаруживал эту последовательность «AT» и регулировал скорость передачи оттуда? Я думал инициализировать его на самой высокой скорости передачи данных, чтобы он захватывал все и оттуда находил последовательность «AT».
Протокол связи на основе UART (называемый LIN), который часто используется в автомобильной промышленности, имеет механизм автоматического определения скорости передачи, но все же главный и подчиненный узлы «должны» совпадать с точки зрения длины данных и длины стоповых битов. Это означает, что определения только скорости передачи данных недостаточно.
@ Batboi323, я реализовал что-то подобное в прошивке. Я не знаю, сможете ли вы его адаптировать, потому что он в основном использовал Zilog SIO, запускающийся в синхронном режиме для захвата битов с высокой скоростью передачи данных, а затем подсчитывая, сколько времени с высокой скоростью передачи данных потребовалось, чтобы добраться до конца начального бита. В основном, подсчет количества нулей. На уровне ворот я бы предположил, что вам нужен какой-то синхронный конечный автомат для подсчета количества тактов в бите, и начать оттуда.

Ответы (3)

Обычные UART должны быть предварительно настроены человеком с желаемой скоростью передачи данных (а также длиной слова, стоповыми битами, четностью и т. д.).

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

Принимающий UART обычно имеет локальные часы, которые работают с более высокой скоростью - обычно в 8 или 16 раз выше скорости передачи данных. Это используется для выборки входящего сигнала и обнаружения битов в слове таким образом, чтобы допускать погрешность в несколько процентов. Даже два кварцевых генератора не будут идеально соответствовать частотам, но устойчивость к ошибкам может позволить использовать некоторые менее точные источники, иногда в том числе урезанные встроенные генераторы и т. д. Это также может помочь учесть тот факт, что деление частот популярных генераторов может дать только неточное приближение к определенным скоростям передачи данных - в старые времена основным часам UART иногда требовались определенные частоты для доступа к популярным скоростям передачи данных, например 11,0592 МГц в семействе 8051.

Моя гипотеза об автоматическом обнаружении скорости может заключаться в том, что таймер и счетчик работают одновременно, чтобы найти фронты и время между фронтами?
Проблема в том, что не существует алгоритма, который мог бы принимать произвольную форму сигнала "последовательный порт uart" и надежно определять скорость передачи данных. Вы можете легко найти минимальное время между переходами, но это не обязательно представляет один битовый период.
Алгоритм действительно существует (я слышал, что в разных местах он называется «автоматическая передача данных»), но когда он реализован в ограниченной по ресурсам области чипа UART, иногда единственный способ сделать это — использовать часть отправленных данных и используя его для калибровки, которая будет сохраняться до конца сеанса. Часто это нежелательно. Если сделать это в программном обеспечении и допустить небольшую задержку, то это тривиально сделать без потребления данных (путем временного сохранения их для анализа), по крайней мере, для низкоскоростных коммуникаций (менее 200 КБ/с). Более высокие скорости представляют дополнительные трудности.

Два UARTS «договариваются» о скорости передачи с помощью документации и путем установки оператором/пользователем скорости передачи вручную, включая протокол квитирования, размер стоп-бита и т. д.

.....для обоих концов интерфейса.

Да, все настраивается вручную, что часто немного неудобно, особенно когда системы плохо документированы (я смотрю на вас, на каждую встраиваемую систему).

Я знаю, что USB, SATA и большинство других современных протоколов данных запускаются после некоторого сброса или инициализации на самой низкой скорости с некоторой стандартизированной конфигурацией по умолчанию и согласовывают со всеми остальными (или только с мастером, в зависимости от протокола) до более высоких скоростей. . Некоторые также используют подтягивающие или подтягивающие резисторы на своих линиях передачи данных / питания для обозначения поддерживаемых скоростей.

Посетите этот веб-сайт, посвященный согласованию USB, если вы заинтересованы в более глубоком изучении других протоколов.