Как включить аппаратное управление DE для RS-485 на STM32?
Обновлено Редакция GAW
Трансивер RS-485 должен включать передатчик только на время передачи, иначе два узла будут одновременно занимать шину. Обычно выводом DE управляют программно и часто ошибаются со временем выключения (термин «Driver enable»). В USART новых серий STM32 — например, STM32F7 и STM32L0 — это умеет сама аппаратура.
Какие биты настроить
| Регистр, поле | Значение | Что делает |
|---|---|---|
| USART_CR3, DEM | 1 | включает управление DE |
| USART_CR3, DEP | 0 или 1 | 0 — DE активен высоким уровнем, 1 — низким |
| USART_CR1, DEAT[4:0] | 0–31 | DE до начала старт-бита, в единицах выборки |
| USART_CR1, DEDT[4:0] | 0–31 | DE после конца последнего стоп-бита |
| GPIO | AF вывода RTS | сигнал DE выходит на вывод RTS |
Единица выборки — 1/16 бита при обычной передискретизации или 1/8 при OVER8 = 1. Поля DEM, DEP, DEAT и DEDT записывают, пока UE = 0.
// USART2 drives the transceiver DE pin itself (RM0385, 31.5.16, 31.8.1, 31.8.3)
USART2->CR1 = 0; // UE = 0 before configuring DE
USART2->CR3 |= USART_CR3_DEM; // DE active high (DEP = 0)
USART2->CR1 = (8U << USART_CR1_DEAT_Pos) | (8U << USART_CR1_DEDT_Pos) // half a bit each
| USART_CR1_TE | USART_CR1_RE;
USART2->CR1 |= USART_CR1_UE;
Вывод RTS переключают в режим альтернативной функции USART, номер AF берут из таблицы выводов. Дальше программа просто пишет байты в TDR: DE поднимается до старт-бита первого байта и опускается после последнего стоп-бита с заданной задержкой.
Подключение трансивера к шине, терминаторы и подтяжки описаны на странице RS-485, выводы MAX485 — в карточке MAX485, а настройка USART STM32 в целом — на странице UART в STM32. Для обмена по Modbus RTU аппаратный DE особенно удобен: паузы между кадрами выдерживать проще, когда передатчик не держится лишнее время.
Похожие вопросы
Можно ли подключить DE и /RE трансивера к одному выводу RTS/DE?
Да, так обычно и делают с MAX485-подобными трансиверами: высокий уровень DE включает передатчик и выключает приёмник, низкий — наоборот. Тогда микроконтроллер не слышит собственную передачу. Если эхо нужно для контроля линии, /RE подключают к земле, оставляя приёмник всегда включённым.
Какую задержку DEDT ставить?
Столько, сколько нужно трансиверу на переход из передачи в приём; при 16-кратной передискретизации максимум DEDT = 31 — почти два бита. Для Modbus RTU на 9600 бит/с обычно достаточно небольшой задержки, но точное значение берут из времени включения и выключения выхода в даташите трансивера.
А если в моём STM32 нет бита DEM?
Тогда управляют выводом DE программно: включают перед первым байтом и выключают по флагу окончания передачи TC, а не по пустому буферу TXE. Как это сделать правильно, разобрано в карточке MAX485 и в термине «Driver enable».
Источники
- STMicroelectronics. RM0385: STM32F75xxx and STM32F74xxx advanced Arm-based 32-bit MCUs. Reference manual, Rev 9 — разд. 31.4, табл. 197: Driver Enable поддерживают все USART и UART; разд. 31.5: для RS-485 нужен вывод DE, DE и RTS — один вывод; разд. 31.5.16: DEM в USART_CR3 включает управление DE; время включения — от DE до начала старт-бита (DEAT[4:0] в USART_CR1), время выключения — от конца последнего стоп-бита до снятия DE (DEDT[4:0]); полярность — DEP в USART_CR3; DEAT и DEDT в единицах выборки, 1/8 или 1/16 бита по передискретизации; разд. 31.8.1: DEAT — биты 25:21, DEDT — биты 20:16, пишутся при UE = 0, при записи TDR во время DEDT новые данные уходят после DEDT и DEAT; разд. 31.8.3: DEP — бит 15, DEM — бит 14, при UE = 0
- STMicroelectronics. RM0377 Reference manual: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs, Rev 10 — разд. 24.5.16 и 25.4.10: тот же механизм DE у USART и LPUART STM32L0; разд. 24.8.3: DEM = 0 — функция DE выключена
- STMicroelectronics. cmsis-device-f7, Include/stm32f746xx.h (commit 2352e88) — USART_CR1_DEDT_Pos = 16, USART_CR1_DEAT_Pos = 21 (маски 0x1F); USART_CR3_DEM — бит 14, USART_CR3_DEP — бит 15
Нашли ошибку?
Смотрите также
- RS-485Уровни, длина линии, терминаторы, смещение, MAX485, Modbus RTU
- DE и /RE (направление RS-485)Включение передатчика и приёмника трансивера RS-485
- MAX485Трансивер RS-485: выводы, DE и RE, 2,5 Мбит/с, 32 узла, уровни, семейство
- UART STM32BRR и OVER8, допуск по частоте, флаги, прерывания, DMA с IDLE, полудуплекс, RS-485
- Modbus RTUКадр, паузы 3,5 символа, функции, регистры, CRC-16, RS-485, отладка