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

Почему по 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.

Источники

  1. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — разд. 27 (USART), порядок передачи — после записи последнего байта в USART_DR дождаться TC = 1, это означает, что передача последнего кадра завершена; бит TC в регистре USART_SR
  2. 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 — встроенное смещение порога приёмника, выход в единице на свободной шине без внешних резисторов смещения
  3. Texas Instruments. The RS-485 Design Guide (SLLA272D, revised May 2021), T. Kugelstadt — разд. 6 — линию нагружают терминаторами 120 Ом на обоих концах кабеля; разд. 7 — резисторы смещения для свободной шины

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