这一章在干嘛?

485 实验:差分传输、半双工收发自动切换、SP3485 收发器、与串口助手的距离测试。学会后做 Modbus 通信就上手。

28.1 485 简介

28.2 硬件设计

28.3 程序设计

28.4 下载验证

28.1 485 简介

RS-485 是工业总线标准:

  • 差分传输:A/B 两根线压差代表逻辑;
  • 半双工:同一时刻只能发或收;
  • 距离:1200 m(典型);
  • 节点数:最多 32(标准驱动器),现代收发器可到 256。

原书图 28.1.1:RS-485 差分信号原书图 28.1.1:RS-485 差分信号

电平标准:

电平A-B 电压
逻辑 1 (Mark)+2 V ~ +6 V
逻辑 0 (Space)-6 V ~ -2 V

SP3485 收发器:3.3V/5V 通用,自动收发切换(靠 TX/RX 信号互斥)。

485 与串口:485 只是一种物理层,协议层还是 UART(异步串口)。所以 485 程序基本就是串口程序 + 一个收发控制引脚。

28.2 硬件设计

USART2(PA2/PA3)接 SP3485,PG8 控制收发切换(高发低收)。

原书图 28.2.1:SP3485 接线图原书图 28.2.1:SP3485 接线图

28.3 程序设计

28.3.1 CubeMX 配置

  • USART2 → 115200-8-N-1
  • PD5 / PD6 接两个 LED 指示收发

28.3.2 关键代码

// 发送
void rs485_send(uint8_t *buf, uint16_t len) {
    RS485_TX_MODE();    // PG8 = 1
    HAL_UART_Transmit(&huart2, buf, len, 100);
    while (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC) == RESET);
    RS485_RX_MODE();    // PG8 = 0
}

// 接收(中断)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart->Instance == USART2) {
        LED1_TOGGLE();
        HAL_UART_Receive_IT(&huart2, &rx_byte, 1);
    }
}

28.4 下载验证

两块开发板 A/B 对连,A 发 B 收:串口助手观察。开发板上 LED 闪烁表示收发正常。

必须用双绞线,且 120Ω 终端电阻在线缆两端各一个,否则长距离波形反射导致误码。