Свободная линия UART (idle line)
Между символами UART линия лежит в единице. Если пауза длится дольше целого кадра, приёмник может сообщить об этом отдельным флагом. Так программа узнаёт, что передатчик замолчал и пакет, скорее всего, закончился.
Обновлено Редакция GAW
Свободная линия (idle line) — состояние линии UART, когда передатчик ничего не шлёт и вход RX лежит в единице. Пока между символами короткие промежутки, приёмник их не замечает. Но если единица держится дольше целого кадра — старт-бита, данных и стоп-битов, — многие UART умеют сообщить об этом событием.
Флаг IDLE в STM32
В справочном руководстве RM0008 символ idle определён как кадр, целиком состоящий из единиц, вместе со стоп-битами. Когда приёмник STM32F1 видит такой кадр после принятых данных, он ставит флаг IDLE в регистре USART_SR и, если разрешено битом IDLEIE, вызывает прерывание. Флаг сбрасывается последовательностью «прочитать USART_SR, затем USART_DR» и не поднимется снова, пока не придёт следующий символ. Передатчик тоже работает с этим понятием: при включении бита TE он сначала выдаёт кадр idle, а потом уже первый байт.
Главное применение — приём пакетов переменной длины. DMA пишет байты в буфер без участия процессора, а прерывание IDLE говорит, что пауза наступила и пакет можно разбирать. Примеры настройки USART и DMA — на странице UART в STM32.
Тайм-аут FIFO у UART 16550
У UART с FIFO похожую задачу решает прерывание тайм-аута. TL16C550C выдаёт его, когда в приёмном FIFO лежит хотя бы один символ, а новых нет дольше четырёх символьных интервалов и столько же времени программа не читала FIFO. Без этого последние байты пакета, не дотянувшие до порога FIFO, остались бы лежать в буфере.
Не путать
- С паузами Modbus RTU: там длительность тишины задана протоколом — не меньше 3,5 символа между кадрами, см. интервалы t1,5 и t3,5. Флаг IDLE срабатывает раньше, через один кадр, поэтому для Modbus его одного мало.
- С break: при break линия тоже долго в одном состоянии, но в нуле, а не в единице, и приёмник видит ошибку кадра — см. break.
Частые вопросы
Когда STM32 выставляет флаг IDLE?
Когда после принятого символа линия RX пробыла в единице целый кадр. По RM0008 флаг сбрасывается чтением USART_SR, а затем USART_DR, и снова не поднимется, пока не будет принят следующий символ (флаг RXNE). Поэтому одна долгая пауза даёт одно событие IDLE, а не поток прерываний.
Зачем нужен флаг IDLE, если есть прерывание на каждый байт?
Чтобы принимать пакеты неизвестной длины без разбора каждого байта. DMA складывает байты в буфер, а прерывание IDLE сообщает, что передатчик замолчал: в этот момент программа смотрит, сколько байт пришло, и обрабатывает пакет целиком.
Сколько длится пауза, которую UART считает свободной линией?
Один кадр при текущей скорости. При 115 200 бит/с и формате 8N1 кадр — 10 битов, то есть около 86,8 мкс (наш расчёт: 10 / 115 200). UART 16550 в режиме FIFO ждёт дольше — четыре символьных интервала, после чего выдаёт прерывание тайм-аута.
Источники
- STMicroelectronics. RM0008 Reference manual: STM32F101xx–STM32F107xx (Rev 21, February 2021) — разд. 27.3.1: символ idle — целый кадр из единиц (вместе со стоп-битами), за которым идёт старт-бит следующего кадра; установка TE отправляет кадр idle перед первым кадром данных; разд. 27.3.3: при обнаружении idle — та же процедура, что при приёме символа, плюс прерывание при IDLEIE; USART_SR бит 4 IDLE: сбрасывается чтением SR, затем DR; не взводится снова, пока не взведётся RXNE
- Texas Instruments. TL16C550C Asynchronous Communications Element with Autoflow Control (SLLS177I), 2021 — прерывание тайм-аута приёмника в режиме FIFO: в FIFO есть хотя бы один символ, последний символ принят больше четырёх символьных интервалов назад и столько же времени не было чтения FIFO; интервал считается от RCLK и пропорционален скорости
Нашли ошибку?
Смотрите также
- UARTКадр 8N1, скорость и допуск, TX и RX, уровни, USB–UART, AVR и STM32
- UART STM32BRR и OVER8, допуск по частоте, флаги, прерывания, DMA с IDLE, полудуплекс, RS-485
- Старт-бит и стоп-битСлужебные биты кадра UART для синхронизации
- Паузы t1,5 и t3,5 в Modbus RTUТишина между кадрами и допустимый разрыв внутри кадра