Тактовая частота приемника UART

Я пытался понять основы UART. Понятно, что

  • Это асинхронный протокол связи, поэтому часы TX и RX не зависят друг от друга.
  • Прием данных гарантируется использованием стартового бита и одного или нескольких стоповых битов . Кроме того, приемник должен знать скорость передачи данных, чтобы генерировать подходящие часы для управления регистром SIPO , используемым для приема.

Вопросы здесь

Упоминается, что обычно для восстановления данных используются часы с 16- кратной скоростью передачи данных. Так как же возможно преобразование бит/ с в тактовую частоту ? Пожалуйста, предоставьте мне несколько ссылок для изучения механизма синхронизации, используемого в приемнике UART.

Ответы (3)

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

Стартовый бит, который является низким, и стоповый бит, который является высоким, гарантируют, что между двумя байтами всегда есть переход от высокого к низкому, который приемник может синхронизировать, но после этого он сам по себе: больше нет времени. подсказки, которые он может использовать, чтобы различать последовательные биты. Все, что у него есть, это собственные часы. Таким образом, самое простое, что можно сделать, это начать с выборки начального бита каждого бита в середине своего времени. Например, при 9600 бит/с битовое время составляет 104 мкс, тогда он будет выбирать начальный бит в Т 0 + 52 мкс, первый бит данных Т 0 + 52 мкс + 104 мкс, второй бит данных в Т 0 + 52 мкс + 2 × 104 мкс и так далее. Т 0 является задним фронтом начального бита. Хотя выборка начального бита на самом деле не требуется (вы знаете , что он низкий), полезно убедиться, что начальный фронт не был всплеском.

введите описание изображения здесь

Для тайминга 52 мкс вам потребуется удвоенная тактовая частота 9600 бит/с или 19200 Гц. Но это только основной метод обнаружения. Более продвинутые (читай: более точные) методы будут брать несколько образцов подряд, чтобы не попасть только в один пик. Тогда вам действительно может понадобиться 16 × Тактовая частота 9600 Гц, чтобы получить 16 тиков на бит, из которых вы можете использовать, скажем, 5 или около того в середине бита. И используйте систему голосования, чтобы увидеть, следует ли считать ее высокой или низкой.

Если я правильно помню, 68HC11 взял несколько сэмплов в начале, в середине и в конце бита, первый и последний, предположительно, для повторной синхронизации в случае изменения уровня (что не гарантируется).

Тактовая частота дискретизации зависит не от скорости передачи данных, а наоборот. Для 9600 бит/с вам нужно будет установить тактовую частоту дискретизации на 153 600 Гц, которую вы получите с помощью предварительного делителя из тактовой частоты микроконтроллера. Затем битовые часы получаются из этого еще одним делением на 16.

несогласованные часы
Вот что произойдет, если часы приемника не синхронизированы с часами передатчика:

введите описание изображения здесь

Часы приемника отстают на 6,25 %, и вы можете видеть, что выборка каждого следующего бита будет происходить все позже и позже. Типичная передача UART состоит из 10 битов: 1 стартовый бит, полезная нагрузка из 8 битов данных и 1 стоповый бит. Затем, если вы сэмплируете в середине бита, вы можете позволить себе быть на полбита в последнем бите, стоповом бите. Полбита на десять битов составляет 5 %, поэтому с нашим отклонением в 6,25 % мы столкнемся с проблемами. Это хорошо видно на картинке: уже на третьем бите данных мы делаем выборку около края.

Я ценю помощь. Спасибо! Разве начальный бит не должен быть сэмплирован в T0+104us вместо T0+52us?
@ Vivek27 - нет, потому что 104 мкс - это продолжительность начального бита, и тогда вы будете сэмплировать в конце, а не в середине. Если вы дадите мне пару минут, я обновлю свои фотографии. :-)
@Vivek: На самом деле начальный бит вообще не «сэмплируется». Вся его цель состоит в том, чтобы обеспечить этот начальный переход от простоя строки, относительно которого рассчитана остальная часть символа. Его «значение» всегда находится напротив строки idle и само по себе не содержит никаких данных.
@Olin - я бы попробовал начальный бит, только чтобы убедиться, что начальный край не был шипом.
Блестящий ответ на вопрос, почему используются 16-кратные часы.
Этот уровень точности для начала выборки точно по заднему фронту для начального бита может быть достигнут только при использовании прерываний, запускаемых по фронту, или при использовании прерывания по таймеру каждые 1 мкс (невозможно).
Привет, как полученный узнает, что скорость передачи данных была 9600 бит/с? Я думаю, что вопрос здесь в том, чтобы определить бит/с (и, следовательно, период дискретизации) из входящих данных?

Давайте немного вернемся назад и поговорим о протоколе передачи сигналов низкого уровня, используемом UART. TX и RX - это линии данных, а не часы. Часы находятся только внутри каждого UART, поэтому необходимо заранее договориться о скорости передачи данных.

При отсутствии передачи линия остается в состоянии ожидания. Для передачи байта (например, возможны другие ширины данных) передатчик сначала посылает стартовый бит . Приемник использует время переднего фронта начального бита и известную скорость передачи, чтобы затем декодировать остальную часть символа. Предположим для простоты, что используется скорость 100 кбод. Это означает, что время каждого бита составляет 10 мкс. Это включает в себя стартовый бит, биты данных и стоповые биты. Следовательно, середина первого бита данных будет через 15 мкс после переднего фронта начального бита, второго через 25 мкс и т. д.

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

С 8 битами данных наихудшим случаем для синхронизации является выборка последнего бита. Это 8,5 битных времен от эталона синхронизации, который является передним фронтом начального бита. Если приемник отключен на 1/2 бита или более, он будет выбирать последний бит в течение другого бита. Ясно, что это плохо. Это происходит при несовпадении тактовой частоты 1/2 бита в 8 1/2 бит, или 5,9%. Это гарантированное несоответствие. Для надежности вы обычно хотите убедиться, что приемник соответствует передатчику с точностью до половины этого, или 2,9%. Это представляет собой ошибку времени 1/4 бита в последнем бите.

Однако все не так просто. В описанном выше сценарии приемник по существу запускает секундомер по переднему фронту начального бита. Теоретически это можно было бы сделать в аналоговой электронике, но это было бы сложно, дорого и не легко интегрировалось бы в цифровые микросхемы. Вместо этого большинство цифровых реализаций UART имеют внутренние часы, работающие с 16-кратной скоростью передачи данных. Затем «секундомер» считает эти 16-кратные циклы. Это означает, что существует дополнительная возможная ошибка в 1/16 бита, добавленная ко всем временам выборки битов, что похоже на еще одно несоответствие часов 0,7% в последнем бите.

Надеюсь, это проясняет, что такое стоп-бит, как работает битовая синхронизация и что такое 16-кратные часы. Я в основном пропустил стоповые биты, но, может быть, теперь вы сами видите, почему требуется хотя бы один стоповый бит. По сути, стоповые биты - это минимальное принудительное время простоя строки между символами. Это время, в течение которого приемник завершил прием символа и готов к следующему переднему фронту стартового бита. Если бы стопового бита не было, то последний бит данных мог бы иметь ту же полярность, что и стартовый бит, и у приемника не было бы фронта для запуска секундомера.

Давным-давно этот протокол был расшифрован кулачками, рычагами и прялками. Два стоповых бита часто использовались для сброса механизма. В настоящее время все делается в цифровой логике, и 1 стоповый бит используется практически повсеместно. Вы часто видите, что протокол низкого уровня записывается как 8-N-1, что означает 8 бит данных, без битов четности (забудьте об этом, они редко используются сегодня) и 1 стоповый бит. Стартовый бит подразумевается, так как там нет опции.

При использовании 8-N-1 8-битный байт данных фактически занимает 10 бит для отправки. Это одна из причин, по которой существует различие между «скоростью передачи данных» и «скоростью передачи данных». Скорость передачи относится к времени передачи отдельных битов, включая стартовый и стоповый биты. При скорости 100 кбод каждый передаваемый бит занимает 10 мкс, включая стартовый и стоповый биты. Таким образом, весь символ занимает 100 мкс, но передаются только 8 бит реальных данных. Скорость передачи составляет 100 кбит/с, но скорость передачи данных с точки зрения более высоких уровней составляет всего 80 кбит/с.

Битрейт для передачи - это тактовая частота, разделенная (как вы говорите, обычно) на 16. У вас также есть некоторые биты, не относящиеся к данным, для битов кадрирования (начало, четность, стоп). Таким образом, для тактовой частоты 16000 Гц вы получаете 1000 бит в секунду, но после минимального кадрирования битов вставляется только 800 бит данных или 100 байт в секунду.

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

Пока тактовая частота приемника близка к частоте тактовой частоты передатчика, выборка будет соответствовать правильным частям передаваемого сигнала.