Режим удвоенной скорости 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 = 0 | fOSC / (16 · (UBRRn + 1)) | fOSC / (16 · BAUD) − 1 |
| Удвоенный, U2X = 1 | fOSC / (8 · (UBRRn + 1)) | fOSC / (8 · BAUD) − 1 |
Зачем он нужен
Главная польза не в удвоении предела, а в более мелком шаге. UBRRn — целое число, и для многих сочетаний частоты и скорости деление не получается ровным. При вдвое меньшем делителе значение UBRRn вдвое больше, и относительная ошибка округления меньше. Пример из таблицы 20-7 для кварца 16 МГц:
| Скорость | U2X = 0 | U2X = 1 |
|---|---|---|
| 9600 | UBRR 103, 0,2 % | UBRR 207, 0,2 % |
| 57 600 | UBRR 16, 2,1 % | UBRR 34, −0,8 % |
| 115 200 | UBRR 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 должен быть сброшен.
Источники
- 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 %
- 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»
Нашли ошибку?
Смотрите также
- Скорость UARTUBRR, BRR, TH1 и ошибка скорости
- UART и printfUBRR0, U2X0, UDRE0, RXC0 и printf через поток avr-libc
- Скорость передачи (бод)Бит/с и бод: стандартные скорости и допуск UART
- ПередискретизацияOversampling: дополнительные биты АЦП усреднением
- ATmega328PРаспиновка, фьюзы, Optiboot, периферия, питание, схема и код на C
- UARTКадр 8N1, скорость и допуск, TX и RX, уровни, USB–UART, AVR и STM32