Перейти к содержанию

Режим удвоенной скорости USART (U2X)

На Arduino с кварцем 16 МГц скорость 115 200 бод в обычном режиме USART получается с ошибкой −3,5 %, и связь с некоторыми адаптерами сбоит. Один бит в регистре UCSR0A — U2X0 — уменьшает ошибку до 2,1 %. Почему так и чем за это платят, объясняет даташит ATmega328P.

Обновлено Редакция GAW

U2X (U2X0 у ATmega328P, U2Xn в общем случае) — бит регистра UCSRnA в USART микроконтроллеров AVR, который включает режим удвоенной скорости. По разделу 20.3.2 даташита ATmega328P он уменьшает делитель частоты в асинхронном режиме с 16 до 8, и при том же значении UBRRn скорость удваивается.

Формулы

РежимСкоростьUBRRn
Обычный, U2X = 0fOSC / (16 · (UBRRn + 1))fOSC / (16 · BAUD) − 1
Удвоенный, U2X = 1fOSC / (8 · (UBRRn + 1))fOSC / (8 · BAUD) − 1

Зачем он нужен

Главная польза не в удвоении предела, а в более мелком шаге. UBRRn — целое число, и для многих сочетаний частоты и скорости деление не получается ровным. При вдвое меньшем делителе значение UBRRn вдвое больше, и относительная ошибка округления меньше. Пример из таблицы 20-7 для кварца 16 МГц:

СкоростьU2X = 0U2X = 1
9600UBRR 103, 0,2 %UBRR 207, 0,2 %
57 600UBRR 16, 2,1 %UBRR 34, −0,8 %
115 200UBRR 8, −3,5 %UBRR 16, 2,1 %
Предел (UBRR = 0)1 Мбит/с2 Мбит/с

Посчитать UBRR и ошибку для любой частоты можно в калькуляторе скорости UART.

Цена

Приёмник при U2X берёт 8 выборок на бит вместо 16 — меньше передискретизации, грубее определение середины бита. Поэтому допуск строже. По таблицам 20-2 и 20-3 для 8 бит данных предельная общая ошибка (Max Total Error) — +3,90/−4,00 % при U2X против +4,58/−4,54 % без него, а рекомендуемая максимальная ошибка приёмника — ±1,5 % против ±2,0 %. Для передатчика, по даташиту, недостатков нет. В синхронном режиме бит должен быть нулём.

В avr-libc этот выбор делает заголовок <util/setbaud.h>: по F_CPU и BAUD он вычисляет UBRR_VALUE и включает USE_2X, если без удвоения ошибка больше допуска BAUD_TOL (по умолчанию 2 %). Для 16 МГц и 115 200 бод он выберет U2X с UBRR 16 и всё равно выдаст предупреждение: 2,1 % больше 2 %.

Значит, 115 200 бод на 16 МГц даже с U2X (2,1 %) формально выходит за рекомендованный предел, и надёжность приёма зависит от точности тактирования второй стороны. Кварцы 14,7456 и 18,432 МГц дают стандартные скорости без ошибки. Настройка USART с U2X0 и выводом printf разобрана в уроке курса AVR с нуля про UART.

Частые вопросы

Какое значение UBRR0 нужно для 115 200 бод при 16 МГц?

По таблице 20-7 даташита ATmega328P: в обычном режиме UBRR0 = 8 с ошибкой −3,5 %, в режиме U2X0 = 1 — UBRR0 = 16 с ошибкой 2,1 %. Второй вариант надёжнее, хотя и он выходит за рекомендованные даташитом ±1,5 % для режима удвоенной скорости. Если нужна точность, берут кварц 14,7456 или 18,432 МГц, на которых 115 200 бод получается без ошибки.

Почему в режиме U2X приёмник строже к ошибке скорости?

Приёмник AVR определяет середину бита по выборкам с частотой, кратной скорости: в обычном режиме — 16 выборок на бит, при U2X — 8 (DS40002061B, разд. 20.3.2 и 20.8). Меньше выборок — грубее поиск фронта старт-бита, поэтому при U2X допустимое рассогласование меньше: для 8 бит данных предельная общая ошибка — +3,90/−4,00 % против +4,58/−4,54 % в обычном режиме, а рекомендуемая максимальная ошибка приёмника — ±1,5 % против ±2,0 %.

Влияет ли U2X на передачу?

Нет, даташит прямо пишет, что для передатчика недостатков нет: он просто выдаёт биты с удвоенной частотой делителя. Ограничение касается только приёмника и только асинхронного режима; в синхронном режиме бит U2X0 должен быть сброшен.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B, 2020 — разд. 20.3.2: установка U2Xn в UCSRnA удваивает скорость в асинхронном режиме, уменьшая делитель с 16 до 8; приёмник при этом использует вдвое меньше выборок (8 вместо 16), поэтому нужна более точная настройка скорости и тактовой частоты; для передатчика недостатков нет; в синхронном режиме бит должен быть нулём; табл. 20-1: BAUD = fOSC / (16 · (UBRRn + 1)) в обычном режиме и fOSC / (8 · (UBRRn + 1)) в режиме удвоенной скорости; табл. 20-2 и 20-3: для 8 бит данных максимальная общая ошибка +4,58/−4,54 % в обычном режиме и +3,90/−4,00 % при U2X, рекомендуемая максимальная ошибка приёмника — ±2,0 % и ±1,5 %; табл. 20-7, 16 МГц: 115,2 кбит/с — UBRR 8 и −3,5 % при U2X = 0, UBRR 16 и 2,1 % при U2X = 1; 57,6 кбит/с — UBRR 16 и 2,1 % или UBRR 34 и −0,8 %; 9600 — UBRR 103 и 0,2 % или 207 и 0,2 %; максимум при UBRR = 0 — 1 Мбит/с и 2 Мбит/с; табл. 20-6 и 20-7: при 14,7456 и 18,432 МГц скорость 115,2 кбит/с получается с ошибкой 0,0 %
  2. AVR-LibC 2.3.2: include/util/setbaud.h — по F_CPU и BAUD препроцессор вычисляет UBRR_VALUE и USE_2X; допуск BAUD_TOL по умолчанию 2 %; USE_2X = 1, если скорость в пределах допуска достижима только с битом U2X; если и с U2X ошибка больше допуска, выдаётся предупреждение «Baud rate achieved is higher than allowed» или «lower than allowed»

Нашли ошибку?