Интерфейс RS-485
RS-485 — дифференциальная многоточечная шина: до 32 стандартных узлов на одной витой паре, около 1200 м на скоростях до 100 кбит/с и до 10 Мбит/с на коротких линиях. Ниже — параметры стандарта, правила разводки, расчёт смещения и подключение к микроконтроллеру.
Обновлено Редакция GAW
Содержание
- Как работает RS-485
- Электрические параметры RS-485
- Длина линии и скорость передачи
- Кабель и топология шины
- Терминатор 120 Ом: где ставить и когда можно без него
- Смещение шины (failsafe): расчёт резисторов
- A и B: почему их путают
- Трансиверы RS-485
- Подключение RS-485 к микроконтроллеру
- Общий провод, заземление и гальваническая развязка
- Защита линии: TVS, ESD и импульсы
- RS-485 и RS-422
- Modbus RTU поверх RS-485
- Типичные ошибки
- Как проверить и отладить линию RS-485
RS-485 — стандарт физического уровня для передачи цифровых данных по симметричной линии, к которой подключено несколько передатчиков и приёмников. Официальное название — TIA/EIA-485-A, международный аналог — ISO 8482. Информацию несёт не напряжение провода относительно земли, как в RS-232, а разность напряжений между проводами A и B: передатчик выдаёт не меньше 1,5 В, приёмник уверенно различает уже ±200 мВ. Поэтому одна витая пара связывает десятки устройств на расстоянии больше километра — в автоматике цехов, системах учёта, вентиляции, освещения и сценической техники.
Стандарт описывает только электрику: уровни, нагрузки, синфазный диапазон. Формат кадра, адресация и контроль ошибок задаёт протокол поверх него — Modbus RTU, PROFIBUS DP, DMX512, BACnet MS/TP или фирменный. Надпись «RS-485» на двух приборах ещё не значит, что они поймут друг друга.
Коротко
- Уровни: передатчик — не меньше 1,5 В на нагрузке 54 Ом, приёмник — порог ±200 мВ.
- Синфазный диапазон: −7…+12 В на каждой линии относительно земли приёмника.
- Нагрузка: до 32 единичных нагрузок (UL) — 32 обычных трансивера или до 256 трансиверов на 1/8 UL.
- Длина и скорость: около 1200 м на скоростях до ~100 кбит/с или 10 Мбит/с на ~12 м — но не одновременно.
- Кабель: витая пара 120 Ом, терминаторы 120 Ом только на двух концах, плюс общий провод.
- Режимы: полудуплекс по одной паре (2-wire) или дуплекс по двум (4-wire).
Как работает RS-485
Узел шины — трансивер. Его передатчик (driver) превращает логический сигнал DI в разность напряжений на линиях A и B, приёмник (receiver) сравнивает A и B и выдаёт логический уровень RO. Помеха от соседнего силового кабеля наводится на оба провода витой пары почти одинаково — это синфазное напряжение, и дифференциальный приёмник его вычитает. По той же причине симметричная линия слабо излучает: поля двух проводов с противофазными токами почти компенсируют друг друга.
Передатчик RS-485 умеет отключаться — переходить в высокоимпедансное состояние по сигналу DE. Это и делает шину многоточечной: говорит один узел, остальные слушают. Если включатся два передатчика сразу, уровни на линии не определены: ограничение тока и тепловая защита в трансиверах спасают микросхемы, но не данные. Поэтому очерёдность обеспечивает протокол — обычно по схеме «ведущий — ведомые».
Двухпроводная и четырёхпроводная схемы
- 2-wire, полудуплекс. Одна пара; у полудуплексного трансивера выходы передатчика внутри соединены со входами приёмника. Узел либо передаёт, либо принимает. Самый распространённый вариант, в том числе для Modbus.
- 4-wire, дуплекс. Две пары: по одной ведущий передаёт всем ведомым, по другой ведомые отвечают ведущему. Ведущий может передавать и принимать одновременно, а ведомые по-прежнему включают передатчики по очереди. Каждую пару терминируют на обоих концах.
В обоих случаях нужен ещё один проводник — общий провод (signal common, GND). Почему он обязателен, разобрано ниже.
Электрические параметры RS-485
| Параметр | Значение | Примечание |
|---|---|---|
| Дифференциальное напряжение передатчика | не меньше 1,5 В на 54 Ом | без нагрузки — не больше 6 В |
| Синфазное напряжение на выходе передатчика | не больше 3 В | |
| Ток короткого замыкания передатчика | не больше 250 мА | при напряжении на линии −7…+12 В |
| Порог приёмника | ±200 мВ | между −200 и +200 мВ выход не определён |
| Синфазный диапазон приёмника | −7…+12 В | напряжение каждой линии относительно его земли |
| Единичная нагрузка, 1 UL | ≈ 12 кОм | ток входа не больше 1 мА при +12 В и 0,8 мА при −7 В |
| Нагрузка шины | до 32 UL | 1/2, 1/4, 1/8 UL — до 64, 128, 256 трансиверов |
| Волновое сопротивление кабеля | 120 Ом | рекомендация стандарта |
| Терминаторы | 2 × 120 Ом | только на концах магистрали |
Испытательная нагрузка 54 Ом примерно соответствует двум терминаторам по 120 Ом (вместе 60 Ом), шунтированным входами приёмников. В даташитах её собирают из двух резисторов по 27 Ом; для режима RS-422 — из двух по 50 Ом, и там требование другое: не меньше 2 В на 100 Ом.
Единичная нагрузка — условная мера тока, который вход приёмника (вместе с выключенным передатчиком) отбирает от линии. У первых трансиверов вход был около 12 кОм, отсюда «32 устройства на шине». Современные микросхемы делают входы в 2, 4 и 8 раз высокоомнее — это 1/2, 1/4 и 1/8 UL, и при той же нагрузке на передатчик на шине помещаются 64, 128 или 256 узлов. Трансиверы разных типов можно смешивать, лишь бы в сумме было не больше 32 UL.
Длина линии и скорость передачи
Длина и скорость RS-485 связаны обратной зависимостью. На низких скоростях линию ограничивает сопротивление проводов: когда оно сравнивается с сопротивлением терминаторов, сигнал на дальнем конце падает вдвое (−6 дБ). Для кабеля 22 AWG это происходит примерно на 1200 м — отсюда «4000 футов» во всех справочниках. На высоких скоростях вступают потери кабеля на высоких частотах и время нарастания фронтов: TI указывает 10 Мбит/с для 12 м (40 футов), MaxLinear — около 15 м для скоростей выше 10 Мбит/с.
Для промежуточных скоростей удобна оценка «длина в метрах × скорость в бит/с ≈ 10⁸»: обе крайние точки TI — 100 кбит/с на 1200 м и 10 Мбит/с на 12 м — дают как раз 1,2·10⁸. Это приближение к графику, а не норма. TI в том же руководстве SLLA272 приводит правило ещё строже — — и сама оговаривает, что современный кабель работает заметно лучше. Ещё один ориентир от MaxLinear: время нарастания сигнала не должно превышать трети длительности бита.
| Скорость | Ориентир длины: , но не больше 1200 м |
|---|---|
| 9600–57 600 бит/с | 1200 м |
| 115 200 бит/с | ≈ 870 м |
| 500 кбит/с | ≈ 200 м |
| 1 Мбит/с | ≈ 100 м |
| 10 Мбит/с | ≈ 10–15 м |
Если нужно дальше, ставят повторители (repeater): каждый сегмент за повторителем — отдельная шина со своими 32 UL и своими терминаторами.
Кабель и топология шины
Нужна витая пара с волновым сопротивлением около 120 Ом. В пример TI приводит промышленный кабель 22 AWG с волновым сопротивлением 120 Ом и скоростью распространения 78 % от скорости света — около 4,3 нс на метр. Спецификация Modbus требует экранированный кабель, отдельный проводник для общего провода и сечение, достаточное для 1000 м (AWG 24 подходит всегда); кабель категории 5 допускает до 600 м. Экран соединяют с защитным заземлением на одном конце кабеля. На плате и в разъёмах проводники A и B ведут рядом и одинаковой длины, иначе симметрия линии теряется.
Только шина: узлы подключаются цепочкой
Все руководства исходят из одной топологии — шины (daisy chain): кабель приходит к узлу и уходит к следующему, узлы подключаются к магистрали короткими отводами, терминаторы стоят на двух физических концах.
Отвод (stub) — кусок линии без терминатора, от его конца сигнал отражается. TI предлагает держать электрическую длину отвода меньше 1/10 времени нарастания фронта передатчика:
где — время нарастания выходного сигнала передатчика (по уровням 10–90 %), — скорость распространения в кабеле в долях от , м/с. Для кабеля с это примерно 2,3 см на каждую наносекунду фронта:
| Время нарастания | Наибольшая длина отвода |
|---|---|
| 3…40 нс (MAX485) | 7…94 см |
| 100 нс | 2,3 м |
| 250 нс (MAX483, MAX487) | 5,9 м |
| 500 нс | 11,7 м |
Вывод: быстрый трансивер вроде MAX485 (2,5 Мбит/с) на медленной шине — плохая экономия. Если хватает 9600–115 200 бит/с, берите трансивер с ограниченной скоростью нарастания (slew-rate limited): такие прощают отводы и меньше излучают. Протоколы задают и свои пределы: Modbus разрешает отводы не длиннее 20 м, а для многопортового ответвителя на n отводов — по 40/n м на каждый.
Почему звезда не работает
В звезде нет «двух концов». Каждая ветвь — длинный отвод: сигнал отражается от её конца и возвращается в точку разветвления, где встречается с отражениями от других ветвей. Поставить терминатор на каждую ветвь тоже нельзя: передатчик рассчитан на одну пару с двумя терминаторами, а не на три-четыре параллельные, — уровни на линии перестают гарантироваться (Maxim, AN763). Вдобавок в самой точке разветвления волновое сопротивление скачком падает. Если узлы физически разбросаны звездой, кабель всё равно ведут цепочкой — к узлу и обратно — или ставят активный концентратор RS-485, у которого каждый порт — отдельный сегмент со своими терминаторами.
Терминатор 120 Ом: где ставить и когда можно без него
Сигнал бежит по кабелю волной. Если на конце линии сопротивление нагрузки не равно волновому , часть волны отражается с коэффициентом
Разомкнутый конец () отражает всё, согласованный () — ничего. Отсюда три правила:
- сопротивление терминатора равно волновому сопротивлению кабеля — для стандартной пары 120 Ом;
- терминаторов ровно два — на двух физических концах магистрали: волна может прийти с любой стороны;
- никаких терминаторов в середине шины и на отводах: резистор посередине сам создаёт неоднородность, а участок кабеля за ним остаётся неподключённым концом.
Проверить терминацию просто: при выключенном питании всех узлов омметр между A и B должен показать около 60 Ом — два резистора по 120 Ом параллельно, чуть меньше из-за входов приёмников и цепей смещения. 120 Ом — стоит только один терминатор, 40 Ом — три.
Когда терминаторы не нужны
Линия ведёт себя как длинная, когда задержка распространения сравнима с фронтом сигнала. В app note National Semiconductor AN-1031 линию считают длинной, если задержка в одну сторону больше 1/8 времени фронта (от 0 до 100 %). Для быстрого трансивера с фронтами в десятки наносекунд «длинной» оказывается линия уже около метра, для трансивера с фронтом от 250 нс — от 6–7 м.
Но отражения не обязательно ломают связь. UART считывает бит в его середине, а отражения затухают за несколько проходов волны туда и обратно. Пример из руководства B+B: 610 м кабеля со скоростью распространения 0,66 c — проход туда и обратно занимает 6,2 мкс, три прохода — около 18,6 мкс. При 9600 бит/с бит длится 104 мкс, и к его середине (52 мкс) звон давно стих: линия работает без терминаторов. При 115 200 бит/с бит длится 8,7 мкс — тут без терминаторов уже никак. Практическое правило того же руководства: на скоростях ниже 38,4 кбит/с терминаторы обычно не нужны.
У терминаторов есть цена: они нагружают передатчики и требуют более сильного смещения (о нём — в следующем разделе). Но если протокол требует их установки — ставьте: спецификация Modbus, например, предписывает терминатор у каждого из двух концов шины.
RC-терминатор и расщеплённый терминатор
- RC-терминатор (AC) — резистор последовательно с конденсатором. На фронтах конденсатор почти закорочен, и линия согласована, а в покое ток через терминатор не течёт: он не нагружает передатчик и не «съедает» смещение. Спецификация Modbus прямо называет вариант 120 Ом + 1 нФ (на напряжение не ниже 10 В) лучшим выбором, когда на шине есть резисторы смещения. Минус — ёмкость приходится подбирать под конкретную линию и скорость.
- Расщеплённый терминатор — два резистора по 60 Ом последовательно, их средняя точка через конденсатор соединена с землёй. Он дополнительно фильтрует синфазную помеху. Резисторы берут с допуском 1 %: при разбросе синфазная помеха превращается в дифференциальную (TI, SLLA272).
Смещение шины (failsafe): расчёт резисторов
Почему шина в простое «висит»
Между кадрами все передатчики выключены. Терминаторы стягивают A и B друг к другу, разность падает почти до нуля — ровно в зону −200…+200 мВ, где выход приёмника не определён. Обычный приёмник в этой зоне выдаёт что придётся и может принять шум за старт-бит: UART получает мусорные байты и ошибки кадра. TI перечисляет три ситуации потери сигнала: обрыв (узел отключён или провод оборван), замыкание линий между собой и простой шины.
Многие трансиверы защищены только от обрыва: у MAX485 выход RO гарантированно в «1», если вход разомкнут, но на терминированной шине в простое это не помогает. У SN75176B при обрыве выход и вовсе не определён.
Резисторы смещения
Решение — сместить шину: подтянуть неинвертирующую линию (A у MAX485 и большинства трансиверов) резистором к питанию, а инвертирующую (B) — к общему проводу. Ток смещения создаёт на терминаторах напряжение , и в простое приёмник видит уверенную «1» — то же состояние, что и стоп-бит UART. По сути это делитель напряжения из двух резисторов смещения и нагрузки шины.
Из схемы:
где — число терминаторов, — суммарная нагрузка приёмников в единичных нагрузках: 1 UL — около 12 кОм от каждой линии к земле приёмника, то есть около 24 кОм между A и B. Отсюда наибольшее сопротивление каждого резистора смещения:
берут с запасом над порогом 200 мВ — на дифференциальную помеху; TI в своём примере закладывает 250 мВ. подставляют минимальное с учётом допуска источника.
Пример расчёта
Шина на 5 В, два терминатора по 120 Ом, 16 трансиверов на 1/8 UL, нужно не меньше 250 мВ в простое.
- Нагрузка приёмников: UL, то есть 12 кОм между A и B. Нагрузка шины: Ом.
- Ом. Ближайший меньший номинал ряда E24 — 560 Ом.
- Проверка: мВ. При питании 4,75 В (5 В − 5 %) — 240 мВ, всё ещё выше порога.
- Ток смещения мА, мощность на каждом резисторе около 10 мВт — подойдёт резистор любого типоразмера (см. закон Ома).
Если пренебречь приёмниками ( Ом), получится 570 Ом — тот же номинал 560 Ом. Если же заложить только порог 200 мВ, формула даст около 716 Ом: с номиналом 680 Ом на шине будет 210 мВ — работать будет, но запаса на помеху почти нет.
TI в SLLA272 считает по упрощённой формуле . Это та же модель с 32 UL (375 Ом в формуле — это 12 кОм / 32), только без «−1» в скобках. Для 4,75 В, 250 мВ и Ом она даёт 528 Ом, и TI ставит 523 Ом; точная формула даёт 500 Ом. С 523 Ом на шине будет около 240 мВ вместо заложенных 250 мВ — меньше расчётного, но всё ещё выше порога.
Калькулятор резисторов смещения
Введите напряжение питания цепи смещения, нужный запас и состав шины — калькулятор посчитает наибольшее сопротивление каждого резистора, подберёт номинал E24 и покажет, что получится в простое.
Исходные данные
для 5 В ± 5 % введите худший случай — 4,75
порог приёмника 200 мВ плюс запас на помехи
равно волновому сопротивлению кабеля
все узлы, включая тот, где стоит смещение
указана в даташите как unit load или входное сопротивление
Результат
- Наибольшее сопротивление каждого резистора
- 567 Ом
- Rсм ≤ ½ · Rэкв · (Uпит / UAB − 1)
- Номинал из ряда E24
- 560 Омближайший меньший — запас по напряжению
- U(A − B) в простое с этим номиналом
- 253 мВпорог приёмника 200 мВ
- Ток через смещение
- 4,24 мА
- Мощность на каждом резисторе
- 10 мВт
- Нагрузка шины в простое Rэкв
- 59,7 Ом2 × 120 Ом ∥ входы 2 UL
Смещение — тоже нагрузка
Резисторы смещения ставят в одной точке шины, обычно у ведущего узла — так требует и Modbus. Если каждый узел «на всякий случай» включит свои подтяжки, они сложатся параллельно и перегрузят передатчики. Даже одна пара резисторов на 500–600 Ом заметно нагружает шину: по оценке TI, смещение забирает до 20 UL из 32, и с трансиверами на 1/8 UL на шине остаётся место примерно для 96 узлов. Спецификация Modbus для резисторов 450–650 Ом оценивает потерю мягче — минус 4 устройства из 32. Оценки исходят из разных допущений, поэтому при большом числе узлов проверьте амплитуду сигнала осциллографом на дальнем конце.
Удобно сочетать смещение с RC-терминаторами: в покое они не потребляют ток, и для тех же 250 мВ хватает подтяжек в несколько килоом. Например, по нормам Modbus: 650 Ом, 32 UL и два терминатора 120 Ом + 1 нФ дают в простое около 1,8 В.
Трансиверы со встроенным failsafe
В трансиверах с «настоящим» failsafe (true failsafe) порог приёмника сдвинут в отрицательную область, но остаётся в пределах стандартных ±200 мВ. У MAX3080–MAX3089 «1» гарантирована при мВ, «0» — при мВ, поэтому при 0 В — обрыв, замыкание, простой терминированной шины — выход остаётся в «1» без внешних резисторов. У ADM2483 и ADM2582E/ADM2587E порог похожий: −30…−200 мВ. Цена — маленький запас по помехе в простое: у MAX3080 — 50 мВ, а TI для подобных схем называет худший случай всего 10 мВ. В шумной обстановке внешнее смещение ставят и с такими трансиверами.
A и B: почему их путают
Это главный источник «шина не работает» при первом подключении. Причина — в разных соглашениях.
Стандарт. По тексту TIA/EIA-485-A для двоичной «1» (MARK, OFF) вывод A передатчика отрицателен относительно B, для «0» (SPACE, ON) — положителен. UART в покое выдаёт «1», значит, по стандарту в паузе выше линия B.
Производители микросхем. В даташитах MAX485 (Maxim, ныне Analog Devices), SN75176B (TI), SP3485 (MaxLinear) и в обучающих материалах Renesas вывод A — неинвертирующий: при DI = 1 напряжение A выше B, а приёмник выдаёт RO = 1 при мВ. То есть «A» микросхемы ведёт себя как «B» стандарта. Пока соединяются одинаковые микросхемы — A с A, B с B — всё работает.
Протоколы и оборудование.
| Где | Положительная в покое линия | Отрицательная в покое линия |
|---|---|---|
| MAX485, SN75176B, SP3485 и большинство трансиверов | A | B |
| Текст TIA/EIA-485-A | B | A |
| Modbus over Serial Line | D1 (по стандарту — B) | D0 (по стандарту — A) |
| PROFIBUS DP | B (RxD/TxD-P) | A (RxD/TxD-N) |
| Оборудование B+B и многие преобразователи | B(+), «+» | A(−), «−» |
Правило: соединяйте линии с одинаковым смыслом — те, что положительнее в покое. Если документации нет, измерьте напряжение между выводами работающего устройства с включённым смещением или просто поменяйте провода местами: перепутанные A и B ничего не повреждают, связи лишь не будет (B+B). Некоторые трансиверы позволяют исправить полярность без перекладки проводов: у MAX3089 фазу передатчика и приёмника инвертируют отдельные выводы TXP и RXP.
Трансиверы RS-485
| Микросхема | Питание | Скорость | Нагрузка | Особенности |
|---|---|---|---|---|
| SN75176B (TI) | 5 В | до 10 Мбит/с | 1 UL, 32 узла | исторический стандарт разводки «75176»; при обрыве выход не определён; потребляет десятки миллиампер |
| MAX485 | 5 В | 2,5 Мбит/с | 1 UL, 32 узла | failsafe только при обрыве; MAX483 и MAX487 — 250 кбит/с с ограничением фронтов, MAX487 и MAX1487 — 1/4 UL, 128 узлов |
| MAX3485 | 3,0–3,6 В | 10 Мбит/с | 1 UL, 32 узла | входы совместимы с 5-вольтовой логикой; failsafe при обрыве |
| SP3485 (MaxLinear) | 3,3 В | 10 Мбит/с | 1 UL, 32 узла | разводка 75176; входы совместимы с 5-вольтовой логикой |
| MAX3082 / MAX3085 / MAX3088 | 5 В | 115 кбит/с / 500 кбит/с / 10 Мбит/с | 1/8 UL, 256 узлов | true failsafe, порог −50…−200 мВ |
| MAX13487E | 5 В | 500 кбит/с (MAX13488E — 16 Мбит/с) | 1/4 UL, 128 узлов | AutoDirection: нет вывода DE, нужны резисторы смещения; ESD ±15 кВ (HBM) |
| ADM2483 | 3 или 5 В — логика, 5 В — сторона шины | 500 кбит/с | 1/8 UL, 256 узлов | гальваническая развязка 2500 В ср. кв. (1 мин); изолированное питание нужно отдельно; true failsafe |
| ADM2587E | 3,3 или 5 В | 500 кбит/с (ADM2582E — 16 Мбит/с) | 1/8 UL, 256 узлов | развязка со встроенным изолированным DC/DC isoPower; ESD ±15 кВ; failsafe при обрыве, замыкании и простое |
| THVD1500 (TI) | 5 В | 500 кбит/с | 1/8 UL, 256 узлов | защита ±8 кВ по IEC 61000-4-2; failsafe при обрыве, замыкании и простое |
| THVD1550 (TI) | 5 В | до 50 Мбит/с | 196 узлов | защита ±18 кВ по IEC 61000-4-2; синфазный диапазон ±15 В; failsafe при обрыве, замыкании и простое |
Почти все 8-выводные трансиверы из таблицы совместимы по выводам с 75176: 1 — RO, 2 — /RE, 3 — DE, 4 — DI, 5 — GND, 6 — A, 7 — B, 8 — VCC. Исключение — MAX13487E: у него на месте DE вывод SHDN, а направлением управляет сам сигнал DI.
Подключение RS-485 к микроконтроллеру
У полудуплексного трансивера четыре логических вывода:
- DI — вход передатчика, к выходу TXD UART.
- RO — выход приёмника, ко входу RXD. Пока /RE = 1, выход RO в высокоимпедансном состоянии и вход RXD «висит», поэтому его подтягивают к питанию МК резистором около 10 кОм или внутренней подтяжкой.
- DE — разрешение передатчика, активная «1».
- /RE — разрешение приёмника, активный «0».
DE и /RE обычно соединяют и управляют одним выводом МК: «1» — передача, «0» — приём; так это и задумано в 75176. Другой вариант — держать /RE на земле всегда: тогда МК слышит собственную передачу. Это эхо пригодится для обнаружения коллизий, но его нужно отбрасывать программно.
MAX485 и SN75176B работают только от 5 В. Входы DI, DE и /RE у MAX485 понимают 3,3-вольтовую логику (порог «1» — 2 В), а выход RO поднимается почти до 5 В (не ниже 3,5 В при токе 4 мА) — для МК без допуска 5 В на входах это опасно. Для 3,3-вольтовых схем берите MAX3485, SP3485 или аналоги — или ставьте делитель на линии RO.
Когда включать и выключать передатчик
- DE поднимают до старт-бита — с запасом на время включения передатчика: у MAX485 это до 70 нс, у медленных MAX483 и MAX487 — до 2 мкс. На практике хватает того, что DE включается до записи первого байта в UART.
- DE снимают только после стоп-бита последнего байта. Флаг «буфер передатчика пуст» (UDRE у AVR, TXE у STM32) для этого не годится: он поднимается, когда последний байт только начал выдвигаться из сдвигового регистра. Нужен флаг окончания передачи — TXC у AVR, TC у STM32. Если снять DE раньше, у последнего байта оборвётся хвост — в Modbus это байт CRC, и весь кадр будет отброшен.
- DE нельзя держать слишком долго. Ведомый может начать ответ сразу после запроса, и два передатчика столкнутся. В Modbus RTU запас есть — между кадрами всегда пауза не меньше 3,5 символа, — но другие протоколы бывают строже.
Пример для AVR (ATmega328P, DE и /RE на выводе PD2):
#include <avr/io.h>
#include <util/atomic.h>
#define RS485_DIR_DDR DDRD
#define RS485_DIR_PORT PORTD
#define RS485_DIR_BIT PD2 /* DE and /RE tied together */
void rs485_init(uint16_t ubrr)
{
RS485_DIR_DDR |= _BV(RS485_DIR_BIT);
RS485_DIR_PORT &= ~_BV(RS485_DIR_BIT); /* receive by default */
UBRR0 = ubrr;
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8N1 */
UCSR0B = _BV(RXEN0) | _BV(TXEN0);
}
void rs485_send(const uint8_t *data, uint8_t len)
{
RS485_DIR_PORT |= _BV(RS485_DIR_BIT); /* driver on before the start bit */
for (uint8_t i = 0; i < len; i++) {
while (!(UCSR0A & _BV(UDRE0))) {} /* room in the transmit buffer */
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { /* no ISR between the two writes */
UDR0 = data[i];
/* clear TXC0 by writing 1; FE0, DOR0, UPE0 and UDRE0 are written as 0 */
UCSR0A = (UCSR0A & (_BV(U2X0) | _BV(MPCM0))) | _BV(TXC0);
}
}
while (!(UCSR0A & _BV(TXC0))) {} /* last stop bit has left the shift register */
RS485_DIR_PORT &= ~_BV(RS485_DIR_BIT); /* release the bus */
}
Запись в UDR0 и сброс TXC0 сделаны атомарно: если между ними вклинится долгое прерывание, байт успеет уйти, флаг сбросится уже после этого, и последний цикл ожидания не закончится. Остальные флаги UCSR0A записываются нулями, как требует даташит ATmega328P.
В программе на прерываниях DE снимают в обработчике «передача завершена» (USART_TX_vect у AVR). В Arduino для AVR то же делает Serial.flush(): функция возвращается, когда передан последний бит, после неё можно переключать вывод направления. Подробнее о контроллерах AVR — в разделе AVR.
Многие современные МК умеют управлять DE сами. В USART серий STM32 F0, G0, G4, L4, H7 и других есть режим Driver Enable: биты DEM и DEP в регистре USART_CR3 и время включения и выключения DE (DEAT, DEDT в USART_CR1) в долях бита; в HAL это функция HAL_RS485Ex_Init(). У AVR серий megaAVR 0 и AVR Dx для этого есть вывод XDIR в режиме RS-485.
Трансиверы с автоматическим переключением направления (AutoDirection у MAX13487E) обходятся без вывода DE: «0» передатчик выдаёт активно, а «1» — коротким импульсом, после которого линию в «1» держат обязательные внешние резисторы смещения. В простое на DI должна быть «1».
Общий провод, заземление и гальваническая развязка
Приёмник измеряет разность A − B, но каждая линия относительно его собственной земли должна оставаться в пределах −7…+12 В. Узлы на разных концах цеха питаются от разных фаз и щитов, и потенциалы их земель расходятся. Без общего провода синфазное напряжение ничем не ограничено: на столе всё работает, на объекте — сбоит или выгорает. Поэтому вместе с парой прокладывают общий провод и соединяют им сигнальные земли узлов.
Прямое соединение земель удалённых узлов создаёт контур: по общему проводу потечёт уравнивающий ток, и его помеха наведётся на линию. TI в SLLA272 описывает компромисс из стандарта — подключать землю узла к общему проводу через резистор (в примере — 100 Ом), чтобы ограничить ток контура. Modbus требует соединять общий провод с защитным заземлением в одной точке, обычно у ведущего узла.
Надёжное решение для длинных линий и разнородного питания — гальваническая развязка: сторона шины у трансивера питается от изолированного источника и не связана с землёй узла. TI предлагает делать неизолированным только один узел — он и задаёт опорную землю всей шины. Готовые решения — ADM2483 (2500 В ср. кв., изолированное питание 5 В для стороны шины нужно отдельно) и ADM2587E, где изолированный преобразователь встроен; у ADM2587E Analog Devices отдельно требует аккуратной разводки платы, чтобы преобразователь не превысил нормы по излучению.
Защита линии: TVS, ESD и импульсы
Кабель длиной в сотни метров собирает разряды статики, коммутационные помехи и наводки от молний. Испытания проводят по трём стандартам: IEC 61000-4-2 (электростатический разряд), IEC 61000-4-4 (пачки быстрых импульсов) и IEC 61000-4-5 (микросекундные импульсы большой энергии).
- TVS-диоды на линиях. Для RS-485 выпускают несимметричные сборки: SM712 имеет рабочее напряжение −7 В и +12 В — ровно синфазный диапазон RS-485 — и выдерживает импульс 19 А (8/20 мкс по IEC 61000-4-5) и разряд ±30 кВ по IEC 61000-4-2. Сборку ставят у разъёма между A, B и общим проводом. Симметричный TVS на ±7 В для RS-485 не подходит: он начнёт срезать допустимое синфазное напряжение от +7 до +12 В.
- Трансиверы с усиленной защитой. MAX13487E выдерживает ±15 кВ по модели человеческого тела (HBM), ADM2587E — ±15 кВ на выводах шины, THVD1500 — ±8 кВ контактного разряда по IEC 61000-4-2.
- Уличные и межкорпусные линии. Здесь защиту делают многоступенчатой: разрядник на входе, последовательное сопротивление и TVS у трансивера, плюс гальваническая развязка, экранированный кабель и заземление экрана.
RS-485 и RS-422
RS-422 (TIA/EIA-422-B) — старший родственник RS-485 с той же дифференциальной идеей, но для одного передатчика.
| RS-422 | RS-485 | |
|---|---|---|
| Передатчиков на линии | 1 | несколько, по очереди |
| Приёмников | до 10 (по 4 кОм) | до 32 UL (по 12 кОм) |
| Выход передатчика | не меньше 2 В на 100 Ом | не меньше 1,5 В на 54 Ом |
| Синфазный диапазон приёмника | ±7 В | −7…+12 В |
| Порог приёмника | ±200 мВ | ±200 мВ |
| Длина и скорость | до ~1200 м, до 10 Мбит/с (не одновременно) | то же |
Трансиверы RS-485 обычно удовлетворяют и требованиям RS-422: у MAX485 и SN75176B выход нормирован для обеих нагрузок. Поэтому для дуплексной линии точка — точка RS-422 берут те же микросхемы (например, полнодуплексные MAX488–MAX491). Обратное неверно: передатчик RS-422 не обязан отключаться и не рассчитан на шину с несколькими передатчиками.
Modbus RTU поверх RS-485
Modbus RTU — самый частый протокол на RS-485 в промышленной автоматике. Спецификация MODBUS over Serial Line V1.02 добавляет к электрике свои требования:
- двухпроводная шина обязательна, четырёхпроводная — опция; линии называются D1, D0 и Common, их порядок — в разделе A и B;
- без повторителя — до 32 устройств, длина магистрали до 1000 м при скорости до 9600 бит/с, отводы — не длиннее 20 м;
- по терминатору на каждом конце шины — 150 Ом (0,5 Вт) или 120 Ом + 1 нФ;
- если смещение нужно, оно одно на шину, обычно у ведущего: подтяжка D1 к 5 В и D0 к общему проводу резисторами 450–650 Ом;
- скорости 9600 и 19 200 бит/с обязательны, 19 200 — по умолчанию.
Каждый байт RTU — это 11 бит: старт-бит, 8 бит данных младшим битом вперёд, бит чётности (по умолчанию even) и стоп-бит; без чётности ставят 2 стоп-бита. Кадр — не больше 256 байт. Границы кадра определяются паузами: между кадрами — тишина не меньше 3,5 символа (), а пауза больше 1,5 символа () внутри кадра делает его недействительным. На скоростях выше 19 200 бит/с спецификация рекомендует фиксированные значения.
| Скорость | Символ, 11 бит | ||
|---|---|---|---|
| 9600 бит/с | 1,146 мс | 1,72 мс | 4,01 мс |
| 19 200 бит/с | 0,573 мс | 0,859 мс | 2,005 мс |
| выше 19 200 бит/с | — | 0,75 мс | 1,75 мс |
Отсюда же требование к программе: передавать кадр сплошным потоком, без пауз между байтами, — и снимать DE не раньше окончания стоп-бита последнего байта.
Типичные ошибки
- Перепутаны A и B. Связи нет совсем или приходит мусор с ошибками кадра. Сверьте соглашения по таблице выше.
- Нет общего провода. На столе работает, на объекте — сбои и выгоревшие трансиверы.
- Терминаторы не там или их слишком много. Перемычка терминатора включена на каждом узле, терминатор стоит в середине шины или на отводе.
- Нет смещения при трансиверах без true failsafe. В паузах сыплются ошибки кадра и мусорные байты, иногда теряется первый байт ответа.
- Смещение на нескольких узлах сразу. Подтяжки складываются параллельно и перегружают передатчики.
- DE снимается по флагу «буфер пуст». У последнего байта обрезан хвост, в Modbus — ошибки CRC.
- DE снимается слишком поздно. Начало ответа ведомого теряется в коллизии.
- Звезда и длинные отводы. Звон на фронтах, ошибки, зависящие от того, кто передаёт.
- 5-вольтовый трансивер на 3,3-вольтовом МК. Выход RO выдаёт до 5 В на вход, который на это не рассчитан.
Как проверить и отладить линию RS-485
- Омметр, питание выключено. Между A и B около 60 Ом — два терминатора на месте. 120 Ом — одного не хватает, 40 Ом — стоит лишний, близко к нулю — замыкание.
- Мультиметр, шина в простое. Напряжение A − B (в обозначениях микросхем) должно быть не меньше +200 мВ, если стоит смещение, — в примере выше около 250 мВ. Около нуля — смещения нет; это нормально только с трансиверами true failsafe. Отрицательное — перепутаны линии или резисторы смещения. Напряжение каждой линии относительно общего провода должно укладываться в −7…+12 В.
- Осциллограф во время обмена. Два канала на A и B относительно общего провода и математика A − B, либо дифференциальный пробник. У передатчика размах не меньше 1,5 В, на дальнем конце — не меньше 200 мВ. Звон на фронтах — признак отводов или неверной терминации. Третьим каналом смотрите DE: он должен подниматься раньше старт-бита и опускаться после стоп-бита.
- Логический анализатор — на RO и DI, а не на линию. Там чистые логические уровни, и декодер UART сразу покажет байты.
Для связи с другими устройствами полезны и соседние материалы раздела интерфейсы: RS-232 — когда нужно связать два устройства на коротком расстоянии, I²C — для связи микросхем внутри одной платы.
Частые вопросы
Какая максимальная длина линии RS-485?
Около 1200 м по витой паре 22–24 AWG на скоростях до ~100 кбит/с. С ростом скорости допустимая длина падает примерно обратно пропорционально: при 10 Мбит/с — около 12–15 м. Удобный ориентир — произведение длины в метрах на скорость в бит/с не больше ~10⁸. Линию длиннее делят повторителями.
Нужен ли терминатор 120 Ом на RS-485?
На длинной или быстрой линии — да: по одному резистору 120 Ом на двух физических концах кабеля, не на отводах и не в середине шины. На короткой медленной линии отражения успевают затухнуть до середины бита, и без терминаторов можно обойтись, если их не требует протокол (Modbus требует).
Сколько устройств можно подключить к шине RS-485?
Стандартный передатчик рассчитан на 32 единичные нагрузки (UL): это 32 трансивера на 1 UL, 64 — на 1/2 UL, 128 — на 1/4 UL или 256 — на 1/8 UL. Резисторы смещения тоже нагружают шину и уменьшают это число.
Как соединять A и B, если у устройств разные обозначения?
У трансиверов вроде MAX485 вывод A неинвертирующий и в покое положительнее B, а в тексте стандарта и в PROFIBUS буквы переставлены. Соединяйте между собой линии, которые в покое положительнее: A у MAX485, D1 в Modbus, B в PROFIBUS, «+» у многих преобразователей. Перепутанные A и B ничего не повреждают — связь просто не работает.
Нужен ли общий провод GND для RS-485?
Да. Приёмник измеряет разность A − B, но напряжение каждой линии относительно его земли должно оставаться в пределах −7…+12 В, а без общего провода это не гарантировано. Общий провод прокладывают в кабеле вместе с парой; при большой разности потенциалов земель ставят трансиверы с гальванической развязкой.
Чем RS-485 отличается от RS-422?
RS-422 — один передатчик и до 10 приёмников, синфазный диапазон ±7 В. RS-485 — до 32 единичных нагрузок, несколько передатчиков работают по очереди, синфазный диапазон −7…+12 В. Трансиверы RS-485 обычно подходят и для линий RS-422.
Источники
- TIA/EIA-485-A. Electrical Characteristics of Generators and Receivers for Use in Balanced Digital Multipoint Systems — стандарт TIA, 1998; первая редакция EIA RS-485 — 1983
- Texas Instruments. The RS-485 Design Guide (SLLA272C), T. Kugelstadt — application report, 2008, ред. 2016
- Modbus Organization. MODBUS over Serial Line Specification and Implementation Guide V1.02 — спецификация, 2006
- Maxim Integrated. Application Note 763: Guidelines for Proper Wiring of an RS-485 (TIA/EIA-485-A) Network — 2001
- Advantech B+B SmartWorx. RS-422 & RS-485 Applications eBook — ред. 2.0, 2018
- MaxLinear. AN-292: RS-485 Cable Lengths against Data Signaling Rate — 2022
- National Semiconductor. AN-1031: TIA/EIA-422-B Overview, M. R. Wilson — 2000
- Renesas (Intersil). TB511: RS-485 Unit Load Concept — 2017
- Renesas. RS-485 Crash Course Part 1: Basics (R15TB0002EU0100) — учебное пособие, 2023
- Maxim Integrated. MAX481/MAX483/MAX485/MAX487–MAX491/MAX1487 datasheet — 19-0122, Rev 7
- Maxim Integrated. MAX3080–MAX3089 Fail-Safe, High-Speed (10Mbps), Slew-Rate-Limited RS-485/RS-422 Transceivers — 19-1138, Rev 3
- Maxim Integrated. MAX13487E/MAX13488E Half-Duplex RS-485/RS-422-Compatible Transceiver with AutoDirection Control — 19-0740, Rev 0
- MaxLinear. SP3485: 3.3V Low Power Half-Duplex RS-485 Transceiver with 10Mbps Data Rate — даташит, ред. 2.0.2, 2021
- Texas Instruments. SN65176B, SN75176B Differential Bus Transceivers (SLLS101H) — даташит, 2021
- Texas Instruments. THVD1500 500 kbps RS-485 Transceivers With ±8-kV IEC ESD Protection (SLLSEY4A) — даташит, 2018
- Texas Instruments. THVD15xx 5-V RS-485 Transceivers With ±18-kV IEC ESD Protection (SLLSEV1C) — даташит, 2018
- Analog Devices. ADM2483: Half-Duplex, iCoupler Isolated RS-485 Transceiver — даташит; сверено по Rev. F
- Analog Devices. ADM2582E/ADM2587E: Signal and Power Isolated RS-485 Transceiver with ±15 kV ESD Protection — даташит, Rev. G
- Littelfuse. SM712 Series 600W Asymmetrical TVS Diode Array — даташит; сверено по ред. 12/2016