RDK X5 3.3V TTL UART 转 RS422 完整方案
一、RS422 与 RS485 核心区别
- RS485:半双工,A/B 差分总线,同一时间只能发或收,需要 DE/RE 收发切换 GPIO;
- RS422:全双工,独立两对差分线:
- 发送差分:TX+、TX-
- 接收差分:RX+、RX- 收发通道物理隔离,可同时发送 + 接收,不需要 GPIO 做收发切换;
- RDK 仅输出 3.3V TTL TX/RX,无差分驱动,必须通过TTL 转 RS422 芯片电平转换。
二、常用转换芯片:MAX3490 / SP3490(3.3V 供电,适配 RDK)
MAX3490 引脚定义(全双工 422)
表格
| 引脚 | 名称 | 功能 | 对接 RDK 信号 |
|---|---|---|---|
| DI | TTL 发送输入 | RDK UART_TX | |
| RO | TTL 接收输出 | RDK UART_RX | |
| DE | 发送驱动器使能(高有效) | 固定接 VCC(永久打开发送) | |
| /RE | 接收使能(低有效) | 固定接 GND(永久打开接收) | |
| Y | 422 发送正 TX+ | 外设 RS422 TX+ | |
| Z | 422 发送负 TX- | 外设 RS422 TX- | |
| A | 422 接收正 RX+ | 外设 RS422 RX+ | |
| B | 422 接收负 RX- | 外设 RS422 RX- | |
| VCC | 3.3V | RDK 3.3V | |
| GND | 电源地 | RDK GND(必须共地) |
关键简化接法(无需 GPIO 控制)
- DE 直接接 3.3V,发送通道永久开启;
- /RE 直接接 GND,接收通道永久开启; 全程无需 GPIO 切换收发,上电即可同时收发。
三、完整硬件接线(RDK 3.3V TTL ↔ MAX3490 ↔ 外部 RS422 设备)
1、RDK → MAX3490 板内 TTL 侧
以/dev/ttyS1(40PIN PIN8/PIN10)为例:
表格
| RDK BOARD 引脚 | 信号 | MAX3490 引脚 |
|---|---|---|
| PIN8 | UART_TX | DI |
| PIN10 | UART_RX | RO |
| PIN1 | 3.3V | VCC、DE |
| PIN6 | GND | GND、/RE |
2、MAX3490 → 远端 RS422 外设差分总线侧(4 根差分线)
表格
| MAX3490 差分引脚 | RS422 外设引脚 | 说明 |
|---|---|---|
| Y (TX+) | RX+ | 主机发送 → 外设接收 |
| Z (TX-) | RX- | |
| A (RX+) | TX+ | 外设发送 → 主机接收 |
| B (RX-) | TX- |
差分交叉规则:本机 TX 差分接对方 RX 差分,本机 RX 差分接对方 TX 差分。
四、外围电路配套设计
- 电源去耦电容VCC-GND 并联 0.1μF 陶瓷电容,紧贴芯片引脚,抑制电源噪声。
- 总线终端电阻 120ΩRS422 长线、高速场景(>10m、≥19200bps),在总线两端差分线之间各焊接 120Ω 电阻;短距离低速可省略。
- 电平匹配硬性要求必须选用 3.3V 版本 MAX3490,5V 型号 RO 引脚输出 5V 电平会击穿 RDK 3.3V IO。
- 共地强制要求RDK、转换模块、远端 422 设备三地必须连通 GND,否则差分压差漂移,出现乱码 / 丢包。
- 线缆选用:4 芯屏蔽双绞线,屏蔽层单端接地,抵御电机、继电器电磁干扰。
五、软件编程(无需 GPIO,比 485 更简单)
核心特点
无 DIR 切换引脚,不存在收发延时等待,写完串口立刻就能读返回数据,代码简化。
python
运行
#!/usr/bin/env python3 import serial import time # 串口配置 UART_DEV = "/dev/ttyS1" BAUD = 9600 if __name__ == "__main__": ser = serial.Serial( port=UART_DEV, baudrate=BAUD, bytesize=8, parity=serial.PARITY_NONE, stopbits=1, timeout=0.02 ) print("RS422 full-duplex running, no GPIO dir control") try: while True: # 全双工:发送同时可实时接收 send_buf = b"010300000001840A" ser.write(send_buf) print("Send:", send_buf.hex()) # 直接读取总线返回数据,无需等待发送完成 recv_buf = ser.read(32) if recv_buf: print("Recv:", recv_buf.hex()) time.sleep(0.5) except KeyboardInterrupt: pass finally: ser.close()六、RS422 与 RS485 方案对比
表格
| 项目 | RS485 (半双工) | RS422 (全双工) |
|---|---|---|
| 差分信号线 | 2 根 (A/B) | 4 根 (TX+/TX-,RX+/RX-) |
| 收发控制 | 需要 1 路 GPIO 切换 DE/RE | 无需 GPIO,永久收发 |
| 通信能力 | 同一时刻只能发或收 | 收发同时进行,实时双向 |
| 芯片 | MAX3485 | MAX3490 |
| 代码复杂度 | 高,需计算发送延时 | 极简,原生串口读写 |
| 适用场景 | 一主多从总线组网 | 点对点高速双向通信 |
七、常见故障排查
- 只能发,收不到数据
- MAX3490
/RE未接 GND,接收通道关闭; - 总线 RX+/RX - 差分线接反;
- RDK RX (RO) 引脚接线断开。
- MAX3490
- 只能收,发不出数据
- DE 引脚未接 3.3V,发送通道关闭;
- TX 差分 Y/Z 与外设 RX 差分接反。
- 乱码、数据错位 两端波特率 / 校验位不一致;缺少公共地线;长线无 120Ω 终端电阻。
- 短距离正常,长线通信失效 未使用屏蔽双绞线,无终端电阻,电磁干扰严重。
八、多路 RS422 扩展方案
- 原生硬件 UART 多路:
ttyS1、ttyS2、ttyS3,每路搭配一片 MAX3490,独立 422 总线; - USB 转 RS422 模块:插入 USB 口生成
/dev/ttyUSBx,无需占用 40PIN 引脚,适合临时调试扩展。