Break (разрыв линии) в UART
Обычный символ UART обязательно заканчивается стоп-битом — единицей. Если же линию нарочно держат в нуле дольше целого кадра, приёмник видит особое событие — break. Его используют как сигнал «внимание, начинается новое сообщение».
Обновлено Редакция GAW
Break (break condition, «разрыв линии») — состояние линии UART, при котором она удерживается в нуле дольше целого кадра: старт-бита, битов данных, чётности и стоп-битов. Так TL16C550C определяет условие для своего флага BI. В покое линия UART лежит в единице, поэтому долгий ноль нельзя спутать ни с паузой, ни с обычным байтом.
Как приёмник видит break
Приёмник отсчитывает биты символа и на месте стоп-бита находит ноль — это ошибка кадра. Разные UART сообщают о break по-разному:
| UART | Что происходит при break |
|---|---|
| STM32F1, обычный режим | ошибка кадра FE, принятый символ из нулей |
| STM32F1, режим LIN | отдельный детектор: флаг LBD после 10 или 11 нулей и разделителя |
| UART 16550 | флаг BI, в FIFO — один нулевой символ |
UART 16550 после break принимает следующий символ, только когда линия вернётся в единицу. STM32 в режиме LIN при ошибке кадра ждёт, пока break закончится, и только потом продолжает приём.
Как передать break
У STM32 бит SBK в USART_CR1 выдаёт break после текущего символа, длина зависит от длины слова (бит M), а в конце передатчик вставляет единицу, чтобы следующий старт-бит был виден. В режиме LIN тот же бит выдаёт 13 нулевых битов. UART 16550 держит выход в нуле, пока установлен бит 6 регистра LCR.
Где применяется
Самый известный пример — шина LIN: каждый кадр открывается полем break, за которым идёт байт синхронизации 0x55. Разобрать кадр LIN по полям поможет калькулятор кадра LIN. Break также используют как сигнал сброса или входа в режим настройки у некоторых устройств.
Не путать с паузой на линии (idle line): там линия долго в единице, это нормальное состояние покоя, а break — долгий ноль.
Частые вопросы
Чем break отличается от байта 0x00?
У байта 0x00 после восьми нулей идёт стоп-бит — единица, и кадр корректен. При break линия остаётся в нуле и на месте стоп-бита, и дольше, поэтому приёмник видит ошибку кадра. UART 16550 при этом кладёт в FIFO один нулевой символ и ставит отдельный флаг BI, а STM32 вне режима LIN показывает только ошибку кадра.
Как отправить break с микроконтроллера?
У STM32 — битом SBK в USART_CR1: break уйдёт после текущего символа, а бит сбросится сам. У UART 16550 — битом 6 регистра LCR, пока он установлен, выход держится в нуле. Если готового бита нет, можно временно понизить скорость и отправить 0x00: при вдвое меньшей скорости старт-бит и восемь нулей длятся 18 битовых интервалов прежней скорости — дольше кадра 8N1 из 10 битов (наш расчёт).
Почему в LIN break длиннее, чем в UART?
LIN начинает каждый кадр полем break, которое ведомые должны отличить от любого байта данных. USART STM32 в режиме LIN отправляет 13 нулевых битов, а на приёме признаёт break уже после 10 или 11 нулей, если за ними следует разделитель — возврат линии в единицу (RM0008).
Источники
- STMicroelectronics. RM0008 Reference manual: STM32F101xx–STM32F107xx (Rev 21, February 2021) — разд. 27.3.1: break — приём нулей в течение кадра, после него передатчик вставляет 1 или 2 стоп-бита; разд. 27.3.2: бит SBK отправляет break после текущего символа, длина зависит от бита M, бит сбрасывается аппаратно; разд. 27.3.3: принятый break обрабатывается как ошибка кадра; разд. 27.3.10: в режиме LIN SBK выдаёт 13 нулевых битов, приёмник распознаёт break из 10 или 11 нулей (бит LBDL) с последующим разделителем и ставит флаг LBD
- Texas Instruments. TL16C550C Asynchronous Communications Element with Autoflow Control (SLLS177I), 2021 — LSR бит 4 BI: вход данных в нуле дольше полного времени передачи слова (старт, данные, чётность, стоп); в FIFO загружается один нулевой символ, следующий принимается после возврата линии в единицу; LCR бит 6 — принудительный break на выходе SOUT
Нашли ошибку?