3、硬件接口标准:UART接口在菊花链中的应用、RS-485/422标准、差分信号原理

3.1 差分信号原理

差分信号是RS-485/422等长距离通信接口的核心技术。与单端信号(如UART的TX/RX)不同,差分信号使用一对等长、等阻抗的导线(通常标记为A和B,或D+和D-)来传输信息。信号电压由两根导线之间的电压差(VAB = VA - VB)表示,而非对地电压。

📐 差分信号原理示意图

发送器 接收器 线A (D+) 线B (D-) VAB 共模噪声 GND(参考地)

关键特性:外部噪声会同时耦合到两根线上(共模噪声),但差分接收器只响应两线之间的电压差,因此共模噪声被抵消,抗干扰能力大幅提升。

3.2 RS-485/422标准对比

特性 RS-422 RS-485
传输模式 全双工(4线) 半双工(2线)
最大节点数 1发10收 32个单元负载(可扩展至256+)
最大距离 1200m @ 100kbps 1200m @ 100kbps
差分电压 ±2V ~ ±6V ±1.5V ~ ±6V
菊花链适用性 较差(需额外控制线) 优秀(总线拓扑,支持多节点)

3.3 UART接口在菊花链中的应用

传统UART是点对点通信,但在菊花链架构中,通过RS-485收发器将UART的单端信号转换为差分信号,实现多节点共享总线。每个节点包含一个UART控制器、一个RS-485收发器(如MAX485、SP3485)以及一个微控制器(MCU)用于数据转发。

🔗 UART + RS-485 菊花链节点架构

RS-485 差分总线 (A/B) RS-485收发器 MCU RS-485收发器 MCU RS-485收发器 MCU RT RT 数据流向

工作流程:MCU通过UART TX/RX与RS-485收发器连接。收发器将UART的TTL电平转换为差分信号发送到总线。接收时,差分信号被转换为TTL电平送入UART RX。总线两端需各接一个120Ω终端电阻以消除信号反射。

3.4 硬件设计要点

  • ✔ 终端匹配:RS-485总线两端各接120Ω电阻,阻抗匹配防止信号反射。
  • ✔ 偏置电阻:在总线空闲时,A线对VCC上拉、B线对GND下拉(如10kΩ),确保逻辑“1”状态。
  • ✔ 共模电压范围:RS-485收发器支持-7V至+12V共模输入,适应长距离地电位差。
  • ✔ 隔离设计:长距离应用建议使用隔离型收发器(如ISO3082)或光耦隔离,防止地环路干扰。
  • ✔ UART配置:菊花链中所有节点UART参数(波特率、数据位、停止位、校验位)必须一致,常用9600/115200bps、8N1。

3.5 典型应用电路

/* 基于MAX485的UART转RS-485节点电路 */
/* MCU: STM32F103, 收发器: MAX485 */

// 引脚连接
// MCU PA9 (TX)  -> MAX485 DI (驱动器输入)
// MCU PA10 (RX) -> MAX485 RO (接收器输出)
// MCU PA8       -> MAX485 RE# (接收使能,低电平有效)
// MCU PA8       -> MAX485 DE (驱动器使能,高电平有效)

// 初始化代码片段
void RS485_Init(void) {
    // 配置UART
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_Init(USART1, &USART_InitStructure);
    
    // 配置控制引脚 (PA8)
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 初始为接收模式
    GPIO_ResetBits(GPIOA, GPIO_Pin_8);
}

void RS485_Send(uint8_t *data, uint16_t len) {
    // 切换为发送模式
    GPIO_SetBits(GPIOA, GPIO_Pin_8);  // DE=1, RE#=1
    delay_us(10);  // 等待收发器切换
    
    // 发送数据
    for(uint16_t i = 0; i < len; i++) {
        while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));
        USART_SendData(USART1, data[i]);
    }
    while(!USART_GetFlagStatus(USART1, USART_FLAG_TC));  // 等待发送完成
    
    // 切换回接收模式
    delay_us(5);
    GPIO_ResetBits(GPIOA, GPIO_Pin_8);  // DE=0, RE#=0
}

3.6 菊花链通信协议帧结构

基于UART+RS-485的菊花链通常采用自定义协议帧,包含地址、命令、数据和校验字段。以下是一个典型帧格式:

📦 菊花链数据帧格式

帧头 0xAA 目标地址 1字节 命令码 1字节 数据负载 N字节 (0-255) 校验和 1字节 帧尾 0x55

转发机制:每个节点收到帧后,检查目标地址是否匹配。若不匹配,则将帧原样转发到下一节点;若匹配,则处理命令并可选返回响应帧。地址0xFF通常用作广播地址。


专注课程资料整理