Ошибка кадра UART
Ошибка кадра — сигнал приёмника UART о том, что на месте стоп-бита оказался ноль. Чаще всего это значит, что у сторон разные скорости или форматы кадра; реже — помехи или плавающий вход.
Обновлено Редакция GAW
Ошибка кадра (framing error) — признак, который выставляет приёмник UART, когда на месте первого стоп-бита читает ноль. Стоп-бит по определению единица, и если там ноль, кадр не совпадает с ожидаемым.
Флаг называется почти одинаково у разных UART:
| UART | Регистр | Флаг ошибки кадра |
|---|---|---|
| AVR (ATmega328P) | UCSR0A | FE0 |
| STM32F1 | USART_SR | FE |
| UART 16550 | LSR | FE |
Причины в порядке частоты:
- Разная скорость. Если скорости передатчика и приёмника заметно различаются, ошибка выборки растёт от бита к биту и к стоп-биту приёмник смотрит уже не туда. Подобрать делитель с малой ошибкой поможет калькулятор скорости UART.
- Разный формат. Передатчик шлёт 8 бит с чётностью, а приёмник ждёт 8 бит без неё — бит чётности оказывается на месте стоп-бита.
- Помехи и обрывы. Плохой общий провод, длинная линия, вход RX без подтяжки.
- Break. Линия в нуле дольше целого кадра — приёмник видит ошибку кадра и символ 0x00; UART 16550 дополнительно выставляет флаг BI.
У AVR флаги ошибок хранятся в буфере приёма вместе с символом, поэтому регистр состояния читают до регистра данных — иначе флаг относится уже к следующему символу. UART 16550 после ошибки кадра пытается пересинхронизироваться, считая, что ошибку вызвал следующий старт-бит. Подробно о кадре, ошибках чётности и переполнения — в статье «UART».
Частые вопросы
Что означает ошибка кадра UART?
Приёмник отсчитал биты символа и на месте первого стоп-бита, где должна быть единица, увидел ноль. Значит, длительность битов или формат кадра не совпадают с передатчиком, либо стоп-бит испорчен помехой.
Как найти причину ошибки кадра?
Сначала проверить, что скорость и формат одинаковы: число битов данных, чётность, число стоп-битов. Затем — точность тактовых генераторов: при большом расхождении скоростей ошибка растёт к концу кадра. Если ошибки редкие — искать помехи, плохой общий провод или вход RX без подтяжки.
Чем break отличается от ошибки кадра?
Break — намеренное удержание линии в нуле дольше целого кадра; его используют, например, LIN и некоторые загрузчики. Приёмник видит при этом и ошибку кадра, и символ 0x00, а UART 16550 и STM32 в режиме LIN выставляют отдельный признак break.
Источники
- Texas Instruments. TL16C550C Asynchronous Communications Element with Autoflow Control (SLLS177I), 2021 — регистр LSR: FE — у принятого символа нет действительного стоп-бита; после ошибки кадра UART пытается пересинхронизироваться, считая, что её вызвал следующий старт-бит; BI — линия в нуле дольше целого кадра
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B, 2020) — разд. 20.7.4: флаг FE0 — ошибка кадра; флаги ошибок хранятся в буфере вместе с символом, поэтому UCSR0A читают до UDR0
Нашли ошибку?