RS485 — один из наиболее широко используемых стандартов связи в промышленных и встроенных системах, поскольку он обеспечивает надежную связь на большие расстояния и между несколькими устройствами. В отличие от UART, который ограничен связью «точка-точка» на коротких расстояниях, RS485 поддерживает дифференциальную передачу сигналов, что делает его устойчивым к помехам и позволяет работать по более длинным кабелям.

В этом руководстве мы продемонстрируем, как подключить модуль преобразователя RS485 в TTL к микроконтроллеру STM32. Для этой настройки будут использованы две платы STM32 — а именно STM32F103 и STM32F446. Эти платы будут взаимодействовать друг с другом через модули RS485, демонстрируя практическую реализацию полудуплексной последовательной связи. 

Введение в связь по протоколу RS485

Что такое RS485 и зачем его использовать в проектах на базе STM32?

RS485 — это стандарт последовательной связи , использующий дифференциальную сигнализацию для передачи и приема данных. В отличие от простой связи по UART, которая лучше всего работает на коротких расстояниях и только между двумя устройствами, RS485 разработан для надежной связи на больших расстояниях с участием нескольких устройств . Он поддерживает кабели длиной до 1200 метров и позволяет нескольким устройствам (до 32 и более) совместно использовать одну и ту же шину связи.

В проектах на базе STM32 интерфейс RS485 часто используется в промышленной автоматизации, сенсорных сетях, контроллерах двигателей и интеллектуальных счетчиках электроэнергии, где необходимо надежно обмениваться данными между множеством устройств на больших расстояниях в условиях сильных электрических помех. Микроконтроллер STM32 в сочетании с внешним приемопередатчиком, таким как модуль MAX485 , позволяет легко реализовать связь по RS485, используя при этом привычный периферийный интерфейс UART .

Преимущества связи RS485 по сравнению с UART

Хотя UART прост и эффективен для связи на коротких расстояниях между двумя точками, он имеет ограничения по дальности, помехоустойчивости и количеству устройств . RS485 решает эти проблемы, предлагая:

  • Связь на большие расстояния – RS485 поддерживает надежную передачу данных на расстояние до 1200 метров , в то время как UART обычно ограничен всего несколькими метрами.
  • Возможность подключения нескольких устройств одновременно – В отличие от UART, который подключает только два устройства, RS485 позволяет нескольким устройствам (ведущему и ведомому или многомастерскому) использовать одну и ту же шину.
  • Помехоустойчивость – RS485 использует дифференциальную передачу сигналов , то есть данные передаются в виде разности напряжений между двумя проводами (A и B). Это делает его очень устойчивым к помехам и идеально подходящим для промышленных условий.
  • Повышенная целостность данных – благодаря устойчивости к помехам и дифференциальной передаче сигналов, RS485 обеспечивает меньшее количество ошибок при передаче данных по сравнению с UART, особенно в сложных электрических условиях.

Вкратце, RS485 расширяет возможности UART, обеспечивая связь на больших расстояниях, надежную и масштабируемую связь , поэтому он широко используется в промышленных и встроенных проектах на базе STM32 .

Обзор модуля RS485 MAX485

Преобразователь RS485 в TTL — это модуль интерфейса связи, позволяющий микроконтроллерам, таким как STM32, обмениваться данными на большие расстояния, используя протокол RS485. Он преобразует дифференциальные сигналы RS485 в стандартные последовательные данные уровня TTL, которые могут считываться периферийными устройствами UART на микроконтроллерах. RS485 известен своей надежностью, помехоустойчивостью и способностью поддерживать несколько устройств на одной шине, что делает этот преобразователь идеальным для применения в промышленных и встроенных системах.

В этих модулях часто используется микросхема приемопередатчика MAX485 , которая поддерживает полудуплексную связь и способна надежно работать с кабелями большой длины.

Важные особенности преобразователя RS485 в TTL:

  • Дифференциальная сигнализация для дальней связи : она использует дифференциальную передачу сигнала, что снижает уровень шума и позволяет передавать данные на расстояния до 1200 метров.
  • Поддержка нескольких устройств на шине : RS485 поддерживает до 32 устройств на одной линии связи, обеспечивая многоузловую связь в одной сети.
  • Широкий диапазон совместимости по напряжению : работает от источника питания 5 В и обеспечивает выходной сигнал уровня TTL, совместимый с микроконтроллерами 3,3 В или 5 В.
  • Контакты разрешения драйвера/приемника (DE/RE) : Контакты DE и RE обеспечивают точное управление направлением передачи данных, что крайне важно для реализации полудуплексной связи между устройствами.

Уровень сигнала, используемый в методе связи RS485, обычно находится в диапазоне от -7 В до +12 В. Выводы микроконтроллера, как правило, не рассчитаны на работу с такими уровнями. Именно поэтому эти сигналы необходимо преобразовывать в низкие напряжения, например, ±3 В. В модуле установлен чип MAX485, который выполняет большую часть работы по преобразованию.

Распиновка модуля RS485

Распиновка модуля показана ниже.

С левой стороны модуля контакт RO подключается к контакту RX интерфейса UART, а контакт DI — к контакту TX.

Контакты RE и DE отвечают за перевод модуля в режим приемника или передатчика .

  • Когда вывод RE и вывод DE находятся в низком состоянии , модуль переходит в режим приемника .
  • Когда контакт DE и контакт RE находятся в состоянии высокого уровня , модуль переходит в режим передатчика .

Контакты A и B являются выходными контактами, через которые передается сигнал.

Рассмотрим пример, где мы передаем модулю данные 0x95 (10010101). Если модуль питается от 5 В, выходные сигналы на контактах A и B будут выглядеть следующим образом (см. ниже).

  • Поскольку вывод A является неинвертирующим , его выходное напряжение будет синхронизировано с входным. Оно изменяется в диапазоне от 0 до +5 В.
  • B — это инвертирующий вывод, поэтому выходное напряжение инвертировано и изменяется от -5 В до 0 В.
  • Когда второй модуль получает эти данные на входе, он декодирует их на основе разницы напряжений.
    • Если разность напряжений максимальна, бит равен 1, а если разность равна 0, бит равен 0.
  • Затем эти данные преобразуются в более низкие напряжения (от 0 до 3 В) в соответствии с требованиями микроконтроллера.

Подключение проводов STM32 и RS485

Ниже приведена схема подключения модуля к контроллеру STM32F103C8 . Схема подключения останется той же и для F446, поэтому здесь показан только один из вариантов.

Как показано выше, вывод RO (Receiver Output) модуля MAX485 подключен к PA10 , который служит в качестве UART1 RX на STM32. Вывод DI (Driver Input) подключен к PA9 и сконфигурирован как UART1 TX .

Контакты RE (разрешение приема) и DE (разрешение драйвера) соединены вместе и подключены к выводу PA8 , который на микроконтроллере STM32 настроен как цифровой выход . Такая схема позволяет микроконтроллеру управлять режимом работы модуля: прием или передача .

MAX485 PinФункцияSTM32 PinПримечания
РО Выход приемника ПА10 UART1 RX
ДИ Ввод данных драйвера ПА9 UART1 TX
РЕ Включение приемника ПА8 Связано с DE, управление выходом
ДЕ Включение драйвера ПА8 Связано с RE, управление выходом
ВЦК Источник питания 5 В/3,3 В Согласно техническим характеристикам модуля
НД Земля НД Общая основа

Конфигурация STM32 CubeMX для RS485

Перед написанием кода для связи по протоколу RS485 необходимо правильно настроить периферийные устройства STM32 с помощью CubeMX .

Конфигурация UART в CubeMX показана ниже.

UART1 настроен с параметрами по умолчанию, используя скорость передачи данных 115200 бод и формат 8-N-1 (8 бит данных, без контроля четности, 1 стоповый бит). Кроме того, включено прерывание приема UART , позволяющее STM32 асинхронно принимать данные от второго контроллера.

В этом проекте использовались следующие контакты: [ссылка на изображение].

Вывод PA8 настроен как цифровой выход и переименован в TX_EN . Он управляет режимом работы модуля MAX485: высокий уровень для передачи и низкий для приема, что позволяет STM32 переключаться между отправкой и приемом данных по шине RS485.

Код связи RS485 для STM32

Как уже упоминалось, цель состоит в установлении связи между двумя микроконтроллерами. STM32F103 инициирует связь, передав сообщение, а после получения этого сообщения STM32F446 ответит соответствующим образом. Эта схема демонстрирует простой механизм запроса-ответа с использованием RS485.

Код для F103

uint8_t TxData[16];
uint8_t RxData[16];
int indx = 0;

int main ()
{
  HAL_UARTEx_ReceiveToIdle_IT(&huart1, RxData, 16);
  while (1)
  {
    sprintf(TxData, "F103 %d", indx++);
    sendData (TxData);
    HAL_Delay(1000);
  }
}

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	HAL_UARTEx_ReceiveToIdle_IT(&huart1, RxData, 16);
}
  • В основной функции мы сначала настроим UART для приема данных.
    • Функция ReceiveToIdle_ITбудет получать входящие данные и сохранять их в буфере RxData до тех пор, пока не будет обнаружена линия Idle.
    • Если вывод RX некоторое время находится в режиме ожидания, он вызовет прерывание, которое в конечном итоге приведет к срабатыванию метода RxEventCallbak.
    • Внутри этой функции обратного вызова мы просто включим прерывание приема в режиме ожидания. Это связано с тем, что HAL отключает прерывание после каждого вызова, поэтому нам нужно снова включать его после каждого срабатывания прерывания.
  • В цикле while мы будем обновлять строку, которую хотим отправить, увеличивая значение переменной indx.
  • И мы будем продолжать отправлять эту обновленную строку каждую секунду.

Функция sendData, использованная выше, показана ниже.

void sendData (uint8_t *data)
{
	// Pull DE high to enable TX operation
	HAL_GPIO_WritePin(TX_EN_GPIO_Port, TX_EN_Pin, GPIO_PIN_SET);  
	HAL_UART_Transmit(&huart1, data, strlen (data) , 1000);
	// Pull RE Low to enable RX operation
	HAL_GPIO_WritePin(TX_EN_GPIO_Port, TX_EN_Pin, GPIO_PIN_RESET);  
}
  • Перед передачей данных необходимо перевести модуль RS485 в режим передатчика.
  • Для этого необходимо установить высокий уровень на выводе DE (разрешение драйвера).
  • Затем мы отправим данные, используя эту HAL_UART_Transmitфункцию.
  • После передачи данных мы включим режим приёмника, поместив вывод RE (Receive Enable) в низкий уровень.

Помните, что контакты DE и RE подключены к одному и тому же выводу (PA8, TX_EN), поэтому мы можем использовать один и тот же вывод для переключения модуля в режим передатчика или приемника.

Поскольку время поступления данных неизвестно, модуль всегда находится в режиме приема. Непосредственно перед отправкой данных мы переводим его в режим передатчика, а затем снова переводим в режим приема.

Переданные данные будут приняты устройством F446, после чего оно отправит ответ.

Код для F446

Как только F446 получит данные, будет вызвана функция RxEventCallback, и мы напишем свой код внутри неё.

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	RxData[0] = 'F';
	RxData[1] = '4';
	RxData[2] = '4';
	RxData[3] = '6';
	sendData(RxData);
	HAL_UARTEx_ReceiveToIdle_IT(&huart1, RxData, 64);
//	memset (RxData, '\0',64);
}

Здесь мы заменим первые 4 байта («F» '1» '0» '3» на «F» '4» '4» '6» и отправим данные обратно первому контроллеру.

Это всего лишь ответ, и таким образом мы сможем понять, что данные поступают непосредственно от F446.

Остальная часть кода аналогична той, что мы видели для F103.

Результат для связи по протоколу RS485 с использованием STM32

Ниже представлены изображения буферов TxData и RxData контроллера F103.

F103 Буфер данных приема

Как видите, данные, передаваемые и принимаемые устройством F103, практически идентичны, за исключением первых нескольких байтов.

Таким образом, мы передали «F103 46» с контроллера F103. Это сообщение было принято контроллером F446, который изменил первые несколько байтов и передал обратно контроллеру F103 «F446 46».

Связь по протоколу RS485 идеально подходит для сетей большой протяженности и многоточечных сетей , что делает его широко используемым в промышленной автоматизации, связи Modbus и сенсорных сетях . Как только вы поймете, как настроить периферийное устройство UART, управлять выводом разрешения передачи и обрабатывать прерывания по линии ожидания, вы сможете масштабировать эту систему для нескольких устройств на одной шине RS485.

Этот проект можно дополнительно улучшить, внедрив DMA для передачи данных , добавив обработку ошибок или расширив код для поддержки протокола Modbus RTU для реальных приложений.