Uart аппаратное управление CTS/RTS

фотка 1

фотка 2


DCE side: provide clock to other side(DTE). In the mode, CTS is OUTPUT, RTS is INPUT.
DTE side: working with clock from DCT. In the mode, CTS is INPUT, RTS is OUTPUT.


UART3 ------> UART2
ведущий ---> ведомый
DTE ------> DCE
CTS <------ 0 RTS разрешение от ведомого ведущему передавать
RTS 0 ------> CTS разрешение от ведущего ведомому отвечать

B11 rx <------- tx A2 это мы не используем (т.к. передаем в одном направлении UART3->UART2)
B10 tx -------> rx A3 шлем 10 байт по нажатию кнопки key2 (используем прерывание)
B14 rts -------> cts A0 это мы тоже не используем
B13 cts <------- rts A1

Собираем проект Keil+STM32CubeMx и проверяем работу CTS - RTS
Ссылка на проект в конце страницы

Активация (разрешение) - это подача 0. Все пины CTS и RTS соответственно подтягиваем к + .

Управление происходит автоматически на аппаратном уровне

По нажатию кнопки Key2 посылается 10 байт от UART3 к UART2 через прерывания. Сначала все происходит нормально.
Но стоит разомкнуть A1 и B13 и нажать key2 - прием не происходит. Если потом соединить A1 и B13 и (не нажимать еще раз key2) ранее посланные данные все таки досылаются (принимаются) нормально (не пропадают).

фотка 3

То есть все так как нужно и работает.


Интересно все-таки порядок прерываний:


HAL_UART_Transmit_IT(&huart3, (uint8_t*)transmitBuffer,10); - указано 10 байт и прерывание по передачи возникает один раз когда передан 10 байт.
HAL_UART_Receive_IT(&huart2, (uint8_t *)receiveBuffer, 1); - указано принимать по 1 байту и прерывание возникает каждый раз при приеме очередного байта

Поэтому сначала и получается 9 прерываний по приему (по 1 байту).
Потом один раз прерывание передачи 10 байт.
И последнее прерывание приема последнего 10-ого байта.


Ниже некоторая инфа нарытая в инете. Спасибо http://kazus.ru/forums/showthread.php?t=94662&page=3 .

Выход nRTS = 0 , когда приёмный регистр USART пустой и туда может быть задвинут входной байт с Rx-входа. Как только байт получен, тут же nRTS=1. То есть больше принять USART не может. Выход nRTS падает в 0, как только принятый байт прочитан из регистра приёмника, и USART готов к приёму нового байта.
Вход nCTS нужен для передатчика. Перед стартом передачи каждого байта передатчик проверяет уровень входа nCTS. Если nCTS=0, то передача байта стартует и никто её не остановит, пока байт не кончится. Если во время передачи установился сигнал nCTS=1 и продолжает стоять в единичке, то передача следющего байта будет задержана, пока вход nCTS не упадёт в 0.
Что характерно, вся эта система Hardware flow control работает сама по себе без участия процессора.
Таким образом, при соединении двух USART помимо двух линий передачи данных можно кинуть ещё пару линий хендшейка, соединив nCTS<->nRTS и nRTS<->nCTS. И получим автоматическую приостановку передачи данных с одной стороны при заполнении буфера с другой. Причём, всё это получим, не написав ни строчки дополнительного кода программы.
Всё это работает и при использовании DMA.