一、串口通讯基础
串口(Serial Port),也称为串行通信接口,是一种在一条信号线上按位传输数据的通信方式。与并行通信相比,串口只需较少的数据线,适合长距离通信。常见的串口应用包括:调试信息输出、传感器数据传输、工业控制等。
1.1 基本概念
- 单工 / 半双工 / 全双工: 单工:数据只能单向传输(如广播) 半双工:双方可收发数据,但不能同时进行(如对讲机) 全双工:双方可同时收发数据(如电话)
- 异步 / 同步通信: 异步通信:使用起始位和停止位标记数据边界,无需共享时钟 同步通信:依赖共享时钟信号(如 SPI、I2C)
- 波特率(Baud Rate): 单位时间内传输的符号数,通常与比特率相同(如 9600bps)
1.2 常见串口标准
| 标准 | 电平范围 | 传输距离 | 典型应用 |
|---|---|---|---|
| TTL | 0-5V/3.3V | <1m | 开发板内部通信 |
| RS232 | ±3V~±15V | ~15m | 工业设备、调制解调器 |
| RS485 | ±2V~±6V | ~1200m | 工业控制网络 |
二、物理层接口详解
2.1 TTL 电平
TTL(Transistor-Transistor Logic)是一种使用 5V 或 3.3V 电压表示数字信号的电平标准:
- 逻辑 0:0V~0.8V
- 逻辑 1:2V~5V
优点: 电路简单、成本低 缺点: 抗干扰能力差、传输距离短 应用: 开发板内部通信、MCU 与外围设备连接
2.2 RS232 接口
RS232 是一种广泛使用的串行通信标准,采用负逻辑电平:
- 逻辑 0:+3V~+15V
- 逻辑 1:-3V~-15V
特点:
- 使用 DB9 或 DB25 连接器
- 全双工通信
- 需要电平转换芯片(如 MAX232)
典型应用:
- 计算机与调制解调器通信
- 工业设备编程接口
- 早期打印机接口
2.3 RS485 接口
RS485 是一种工业级串行通信标准,采用差分信号传输:
- 逻辑 0:A-B > +200mV
- 逻辑 1:A-B < -200mV
特点:
- 支持多节点通信(最多 32 个设备)
- 抗干扰能力强
- 传输距离远(最长 1200 米)
- 需要终端电阻(120Ω)匹配阻抗
应用场景:
- 工业自动化控制系统
- 楼宇自动化
- 安防监控系统
三、RK3568 串口子系统架构
3.1 Linux 内核串口子系统
用户空间
├── 应用程序
│ └── 使用termios API操作串口
│
内核空间
├── tty_core
│ ├── 串口核心层
│ └── tty驱动抽象接口
│
├── 8250/16550驱动框架
│ ├── 串口控制器通用驱动
│ └── 平台设备注册
│
└── RK3568串口平台驱动
├── 硬件初始化
├── 中断处理
└── 寄存器操作
在RK3568内核中,串口驱动使用的是8250通用串口驱动,以下是主要文件:
kernel/drivers/tty/serial/8250/8250_core.c //8250串口驱动核心
kernel/drivers/tty/serial/8250/8250_dw.c //Synopsys DesignWare 8250 串口驱动
kernel/drivers/tty/serial/8250/8250_dma.c //8250串口DMA驱动
kernel/drivers/tty/serial/8250/8250_port.c //8250串口端口操作
kernel/drivers/tty/serial/8250/8250_early.c //8250Early serial console驱动
3.2 menuconfig配置
export ARCH=arm64
export CROSS_COMPILE=/home/chenmy/rk356x/RK356X_Android11.0/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
Device drivers --->
Character drivers --->
Serial drivers --->
3.3 设备树配置
在kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi中有串口设备节点的描述:
在
kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi中启用uart9:
在
kernel/arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi是uart9的引脚复用描述: