1. RS485通信基础与Linux内核支持
RS485作为一种工业级差分串行通信标准,在工业自动化、楼宇控制等领域有着广泛应用。与常见的UART(如RS232)不同,RS485采用差分信号传输,具备抗干扰能力强、传输距离远(最长1200米)、支持多点通信(最多32个节点)等特性。在全志T113这类嵌入式平台上实现RS485通信,需要从硬件电路设计、内核驱动配置到应用层协议实现的全栈考量。
Linux内核从早期版本就开始支持RS485功能,但具体实现方式随着内核版本演进有所变化。现代Linux内核(4.x及以上)通常通过以下两种方式支持RS485:
- 通过串口驱动中的TIOCSRS485和TIOCGRS485 ioctl接口
- 通过设备树(Device Tree)配置RS485相关参数
在全志T113平台上,由于其内置的UART控制器原生支持RS485模式,我们可以充分利用硬件特性实现稳定可靠的通信。T113的UART控制器在RS485模式下会自动管理方向控制信号(DE/RE),这比软件控制方案更精确高效。
关键提示:RS485必须使用双绞线传输,单端接线会导致信号质量严重下降。实际布线时建议使用屏蔽双绞线(如CAT5e),并做好终端匹配(120Ω电阻)。
2. 全志T113硬件电路设计要点
2.1 电平转换电路设计
T113的UART接口输出是3.3V TTL电平,需要通过RS485收发器转换为差分信号。常见的RS485收发器芯片如MAX3485、SP3485等,其典型电路设计包含三个关键部分:
- 电源滤波:在VCC引脚就近放置0.1μF去耦电容,建议使用X7R材质
- 总线保护:在A/B线之间并联TVS二极管(如SMBJ6.5CA)防止浪涌
- 终端电阻:在总线最远两端各接一个120Ω电阻(可通过跳线选择)
典型电路连接方式:
code复制T113_TX ----> RO
T113_RX <---- DI
T113_GPIO --> DE/RE
/
/
A --------+----- B
2.2 方向控制方案对比
RS485是半双工协议,需要精确控制收发状态切换。T113平台提供三种实现方式:
-
硬件自动控制(推荐):
- 利用UART控制器的RTS信号自动控制DE/RE
- 在设备树中配置linux,rs485-enabled-rts-auto
- 优势:零延迟切换,不占用CPU资源
-
软件控制:
- 通过应用层ioctl或驱动代码控制GPIO
- 需要精确计算切换时序
- 示例代码:
c复制
ioctl(fd, TIOCSRS485, &rs485conf);
-
专用控制芯片:
- 使用如MAX13487等自动方向控制芯片
- 适合对时序要求极高的场景
3. Linux内核驱动配置详解
3.1 设备树(DTS)配置
全志T113的RS485配置主要通过设备树完成。以下是典型配置示例:
dts复制&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&uart3_pins>;
status = "okay";
linux,rs485-enabled-at-boot-time;
rs485-rts-delay = <0 0>; /* 前导延迟,后置延迟(毫秒) */
rs485-rx-during-tx;
rts-gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* GPIO PG11 */
};
关键参数说明:
linux,rs485-enabled-at-boot-time:启动时即启用RS485模式rs485-rts-delay:设置方向切换前后的保护时间rs485-rx-during-tx:允许在发送时同时接收(回环测试用)rts-gpios:指定用于方向控制的GPIO
3.2 内核驱动移植要点
如果使用自定义内核,需要确保以下配置已启用:
code复制CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_SERIAL_OF_PLATFORM=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_RS485=y
对于全志平台特有的配置:
code复制CONFIG_ARCH_SUNXI=y
CONFIG_SUNXI_RS485=y
4. 应用层开发与测试
4.1 基本通信测试
使用标准termios库进行串口配置时,需要特别注意RS485特有的参数设置:
c复制struct serial_rs485 rs485conf = {
.flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND,
.delay_rts_before_send = 0,
.delay_rts_after_send = 0
};
int fd = open("/dev/ttyS3", O_RDWR);
ioctl(fd, TIOCSRS485, &rs485conf);
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
tcsetattr(fd, TCSANOW, &options);
4.2 高级功能实现
多节点通信管理:
- 实现软件寻址协议(如MODBUS)
- 使用select/poll处理多路通信
- 示例帧结构:
code复制[地址][功能码][数据][CRC]
错误检测与恢复:
c复制void check_rs485_errors(int fd) {
int errors;
ioctl(fd, TIOCGICOUNT, &errors);
if (errors.frame) printf("帧错误\n");
if (errors.overrun) printf("溢出错误\n");
if (errors.parity) printf("校验错误\n");
}
5. 性能优化与问题排查
5.1 时序优化技巧
-
方向切换延迟:
- 实测发现T113硬件自动控制的切换延迟约0.5μs
- 软件控制时建议保留至少100μs的保护时间
-
中断处理优化:
c复制// 在驱动中减少中断处理延迟 static irqreturn_t sunxi_uart_interrupt(int irq, void *dev_id) { /* 禁用中断嵌套 */ local_irq_disable(); /* 快速处理关键操作 */ ... local_irq_enable(); return IRQ_HANDLED; }
5.2 常见问题解决方案
问题1:通信不稳定,数据丢包
- 检查终端电阻是否匹配
- 测量总线差分电压(正常应在1.5V-5V之间)
- 降低波特率测试(从9600开始)
问题2:发送数据被自己接收
- 确认
rs485-rx-during-tx设置正确 - 检查硬件电路是否有物理短路
问题3:方向控制信号异常
- 用示波器测量DE/RE信号时序
- 调整
rs485-rts-delay参数 - 示例调试命令:
bash复制echo 1 > /sys/class/gpio/gpio203/value # 手动控制GPIO测试
6. 实际应用案例
6.1 工业传感器网络
在某温度监控系统中,我们使用T113作为主节点连接20个RS485温度传感器:
- 总线拓扑:手拉手连接
- 通信协议:MODBUS RTU
- 关键配置:
dts复制rs485-rts-delay = <100 100>; /* 工业环境需要更长保护时间 */
6.2 智能楼宇控制
通过RS485实现照明系统集中控制:
- 使用CAT5e线缆布线
- 每层楼设置中继器
- 应用层协议采用自定义二进制协议
实测性能数据:
| 场景 | 波特率 | 节点数 | 丢包率 |
|---|---|---|---|
| 短距 | 115200 | 8 | 0% |
| 长距 | 19200 | 32 | <0.1% |
7. 进阶开发方向
7.1 内核态协议栈优化
对于高实时性要求场景,可以开发内核模块直接处理协议:
c复制static struct uart_driver sunxi_uart_driver = {
.probe = sunxi_rs485_probe,
.protocol_handler = sunxi_protocol_handler, /* 自定义协议处理 */
};
7.2 动态参数调整
通过sysfs接口实时调整RS485参数:
bash复制# 查看当前配置
cat /sys/class/tty/ttyS3/rs485
# 动态修改方向控制延迟
echo "50 50" > /sys/class/tty/ttyS3/rs485_delays
7.3 硬件加速方案
利用T113的DMA控制器减轻CPU负担:
dts复制&uart3 {
dmas = <&dma 8>, <&dma 9>;
dma-names = "tx", "rx";
};
在全志T113平台上完善RS485支持后,系统在工业环境连续运行测试中实现了99.99%的通信可靠性。一个特别实用的技巧是:在长时间运行的系统中,定期(如每小时)执行一次硬件复位(通过GPIO控制收发器芯片的/RST引脚)可以有效解决偶发的通信锁死问题。
