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

Аппаратное управление потоком (RTS/CTS)

Если приёмник UART не успевает забирать данные, байты теряются. Аппаратное управление потоком добавляет два провода, по которым приёмник говорит передатчику «подожди», и тот останавливается сам, без участия программы.

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

Аппаратное управление потоком (hardware flow control, RTS/CTS) — способ остановить передатчик UART, когда приёмнику некуда класть данные. К линиям TX и RX добавляют два сигнала: RTS (Request To Send) — выход, который в современном управлении потоком означает «я готов принимать», хотя название осталось от модемного RS-232, и CTS (Clear To Send) — вход «мне можно передавать». RTS одной стороны соединяют с CTS другой.

Как это работает в STM32

В USART STM32F1 оба сигнала включаются независимо: RTS — битом RTSE, CTS — битом CTSE в регистре USART_CR3 (RM0008, разд. 27.3.14).

  • RTS. Пока приёмник готов, вывод RTS прижат к нулю. Когда регистр приёма заполнен, RTS снимается, и передатчик другой стороны должен остановиться в конце текущего кадра.
  • CTS. Перед каждым кадром передатчик проверяет вход CTS: ноль — передаёт, единица — ждёт. Если CTS сняли посреди кадра, кадр всё равно будет дослан.

Автоматический режим UART 16550

TL16C550C делает то же самое без программы. Auto-RTS привязан к порогу заполнения приёмного FIFO — 1, 4, 8 или 14 байт. При порогах 1, 4 и 8 RTS снимается на пороге и восстанавливается, когда FIFO опустошён чтением; передатчик при этом может успеть отправить ещё один байт. При пороге 14 RTS снимается на первом бите данных 16-го символа и восстанавливается, как только в FIFO освободится место для одного байта. Auto-CTS не даёт FIFO передатчика выдавать данные, пока CTS неактивен. Включают режим битами AFE и RTS регистра MCR. TI пишет, что ошибки переполнения исключаются, если обе стороны — TL16C550C с включённым autoflow и RTS каждой соединён с CTS другой; с произвольным передатчиком, который реагирует на CTS позже, запас в буфере всё равно нужен.

Чего ждать на практике

Остановка не мгновенная, поэтому порог для снятия RTS выбирают с запасом в несколько байт. На разъёме RS-232 те же сигналы называются так же, но к ним добавляются DTR, DSR и DCD, а в терминальных программах режим обычно называется «RTS/CTS» или «Hardware» — например, в последовательном терминале на сайте.

Не путать с программным управлением потоком XON/XOFF: там «стоп» и «продолжай» передаются управляющими символами по самой линии данных; лишние провода не нужны, но такие байты не должны встречаться в данных — подробнее в статье «UART».

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

Как соединять RTS и CTS?

Накрест, как линии данных: RTS одного устройства — на CTS другого, и наоборот. На выводах микроконтроллера оба сигнала активны низким уровнем: у STM32 RTS прижат к нулю, пока приёмник готов принимать, а передача идёт, пока на входе CTS ноль.

Почему после снятия CTS приходит ещё байт?

Остановка действует на границе символа. STM32 дошлёт кадр, который уже начал передавать. UART 16550 в режиме auto-CTS остановится перед следующим символом, только если CTS снят до середины последнего стоп-бита текущего. Поэтому приёмник снимает RTS заранее, пока в буфере ещё есть место.

Нужно ли управление потоком на 115 200 бит/с?

Если приёмник успевает забирать байты — по прерыванию в кольцевой буфер или через DMA — то нет. Оно нужно, когда приёмник может надолго отвлечься, например на запись во флеш-память, или на высоких скоростях, когда буфера заполняются за доли миллисекунды.

Источники

  1. STMicroelectronics. RM0008 Reference manual: STM32F101xx–STM32F107xx (Rev 21, February 2021) — разд. 27.3.14, рис. 299–301: RTS и CTS включаются независимо битами RTSE и CTSE в USART_CR3; RTS прижат к нулю, пока приёмник готов, и снимается, когда регистр приёма полон — передача должна остановиться в конце текущего кадра; при CTSE передатчик проверяет CTS перед следующим кадром, при снятии CTS во время передачи текущий кадр завершается; флаг CTSIF и прерывание CTSIE; таблица настройки выводов USART: RTS — выход альтернативной функции, CTS — вход
  2. Texas Instruments. TL16C550C Asynchronous Communications Element with Autoflow Control (SLLS177I), 2021 — разд. 7.1–7.5: auto-CTS — CTS должен быть активен, чтобы FIFO передатчика выдавал данные, для остановки CTS снимают до середины последнего стоп-бита текущего символа; auto-RTS привязан к порогу FIFO приёмника 1, 4, 8 или 14 байт, при порогах 1–8 передатчик может успеть отправить ещё один байт; включение — биты 5 (AFE) и 1 (RTS) регистра MCR; переполнения исключаются, когда RTS соединён с CTS у двух TL16C550C с включённым autoflow

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