Почему по RS-485 запрос уходит, а ответа нет?
Обновлено Редакция GAW
RS-485 в двухпроводном варианте — полудуплекс: в каждый момент передаёт только один узел. Ведущий включает передатчик выводом DE, отправляет запрос, выключает передатчик и ждёт ответа. Если окно переключения выбрано неверно, запрос уходит, а ответ теряется или искажается.
| Симптом | Вероятная причина | Что сделать |
|---|---|---|
| Ведомый не реагирует, последний байт запроса обрезан | DE снят по TXE, раньше конца стоп-бита | ждать флаг TC (STM32) или TXC (AVR) |
| Ответа нет, на осциллографе две передачи наложены | DE снят слишком поздно — задержка, вывод в отладке | снимать DE в прерывании по TC, без задержек |
| Принимается собственный запрос | приёмник включён постоянно, /RE = 0 | отбросить эхо или управлять /RE вместе с DE |
| Ничего не принимается вообще | перепутаны A и B, нет общего провода | поменять A и B местами, проверить землю |
| Мусор между пакетами | нет смещения свободной линии | резисторы смещения или трансивер с ним |
Почему важен флаг TC
В reference manual RM0008 порядок передачи USART заканчивается словами: после записи последнего байта дождитесь TC = 1, это и есть конец кадра. TXE устанавливается раньше — когда байт ушёл в сдвиговый регистр. Наш расчёт: при 9600 бит/с кадр 8N1 занимает 10 / 9600 = 1,04 мс, и столько не хватает до конца передачи, если выключить передатчик по TXE.
Ведомое устройство при этом может ответить очень быстро, поэтому опаздывать тоже нельзя. Надёжный вариант — снимать DE в обработчике прерывания TC, а у микроконтроллеров с аппаратным управлением DE поручить это самому USART. У STM32F103 такого режима нет — в RM0008 он не описан, — он есть у части более новых семейств.
Проверка полярности
У трансивера TI SN65HVD7x единица на входе D делает линию A выше B. Производители модулей и приборов подписывают выводы по-разному, поэтому при полном молчании первым делом меняют местами A и B. О подключении и длине линии — на странице RS-485, о выводах DE и /RE — в термине «управление направлением RS-485», о полудуплексе — в термине «полудуплекс и дуплекс», а о свободной шине — в термине «смещение шины».
Похожие вопросы
Почему я принимаю собственный запрос вместо ответа?
Если вход /RE постоянно в нуле, приёмник трансивера слушает линию и во время своей передачи — это эхо. Его либо отбрасывают программно (число байт известно), либо выключают приёмник на время передачи, соединив /RE с DE.
Можно ли снимать DE по флагу TXE?
Нет. TXE означает, что байт ушёл из буфера в сдвиговый регистр, а сам кадр ещё передаётся. На 9600 бит/с при формате 8N1 это ещё 1,04 мс, и последний байт будет обрезан.
Ответ приходит, но с мусором в первом байте. В чём дело?
Обычно в свободной шине без смещения: пока никто не передаёт, приёмник видит случайный уровень и может принять ложный старт-бит. Помогают резисторы смещения или трансивер со встроенным смещением порога, как у SN65HVD7x.
Источники
- STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — разд. 27 (USART), порядок передачи — после записи последнего байта в USART_DR дождаться TC = 1, это означает, что передача последнего кадра завершена; бит TC в регистре USART_SR
- Texas Instruments. SN65HVD7x 3.3-V Supply RS-485 With IEC ESD protection (SLLSE11H, March 2019) — разд. 9.4 и табл. 1 — DE активен высоким уровнем, /RE — низким; при DE = 0 выходы A и B в высокоимпедансном состоянии; у DE внутренняя подтяжка к земле; при D = 1 линия A выше B; разд. 9.3 — встроенное смещение порога приёмника, выход в единице на свободной шине без внешних резисторов смещения
- Texas Instruments. The RS-485 Design Guide (SLLA272D, revised May 2021), T. Kugelstadt — разд. 6 — линию нагружают терминаторами 120 Ом на обоих концах кабеля; разд. 7 — резисторы смещения для свободной шины
Нашли ошибку?
Смотрите также
- RS-485Уровни, длина линии, терминаторы, смещение, MAX485, Modbus RTU
- DE и /RE (направление RS-485)Включение передатчика и приёмника трансивера RS-485
- Полудуплекс и дуплексПередача по очереди или одновременно: RS-485 2-wire и 4-wire, DE и RE
- Смещение шины (failsafe)Резисторы смещения RS-485 для уверенной единицы в простое