3. UART 电气特性:从标准到电平转换
UART 作为一种异步串行通信协议,其物理层的电气特性直接决定了通信的可靠性、传输距离以及硬件接口的兼容性。本章将深入剖析 RS-232 标准、TTL 电平、逻辑电平转换以及常见的接口引脚定义,为后续的驱动开发打下坚实的硬件基础。
3.1 RS-232 标准与 TTL 电平
在嵌入式系统中,UART 核心逻辑(如 SoC 内部)通常使用 TTL(晶体管-晶体管逻辑)电平,而远距离通信或与 PC 机串口连接时,则采用 RS-232 标准。两者在电压范围、逻辑定义和传输距离上存在显著差异。
核心差异速览: TTL 电平是 0V ~ 3.3V/5V 的单端信号,逻辑 1 为高电平,逻辑 0 为低电平;RS-232 标准则使用 ±3V ~ ±15V 的差分信号,逻辑 1 为负电压(-3V ~ -15V),逻辑 0 为正电压(+3V ~ +15V)。
| 特性 | TTL 电平 (3.3V/5V) | RS-232 标准 |
|---|---|---|
| 逻辑 1 (Mark) | 2.0V ~ 3.3V/5V | -3V ~ -15V |
| 逻辑 0 (Space) | 0V ~ 0.8V | +3V ~ +15V |
| 电压摆幅 | 3.3V 或 5V | 6V ~ 30V |
| 传输距离 | < 1.5 米(板级通信) | 15 米 ~ 30 米(标准线缆) |
| 抗干扰能力 | 弱 | 强(高电压摆幅) |
| 典型应用 | SoC 内部、传感器、MCU 间通信 | PC 串口、工业设备、调制解调器 |
驱动开发提示: 在调试 UART 驱动时,务必确认 SoC 的 UART 引脚是 TTL 电平还是已经过 RS-232 转换。直接连接 TTL 电平到 RS-232 接口会损坏芯片。
3.2 逻辑电平转换:桥接两个世界
为了让 TTL 设备(如 ARM 开发板)与 RS-232 设备(如 PC 串口)通信,必须使用 电平转换芯片(如 MAX232、SP3232)。这些芯片内部包含电荷泵,能将 TTL 的 0~3.3V 转换为 RS-232 所需的 ±10V 左右电压。
硬件设计警告: 切勿将 TTL 电平的 TX/RX 直接连接到 RS-232 接口。TTL 的高电平(3.3V)在 RS-232 标准下被视为逻辑 0,且电压过低无法驱动远距离线缆。反之,RS-232 的 ±10V 信号会烧毁 TTL 输入引脚。
3.3 常见接口引脚定义
UART 通信至少需要 TX(发送)、RX(接收) 和 GND(地线) 三根线。对于需要流控的场景,还会引入 RTS(请求发送) 和 CTS(清除发送) 等硬件握手信号。
3.3.1 核心引脚功能
| 引脚名称 | 全称 | 方向(以 DTE 为例) | 功能描述 |
|---|---|---|---|
| TX | Transmit Data | 输出 | 发送串行数据。空闲时为逻辑 1(高电平)。 |
| RX | Receive Data | 输入 | 接收串行数据。空闲时保持逻辑 1。 |
| GND | Ground | - | 信号地,为 TX/RX 提供参考零电位。必须连接。 |
| RTS | Request to Send | 输出 | DTE 请求发送数据。当 DTE 准备好接收时,置为有效(逻辑 0)。 |
| CTS | Clear to Send | 输入 | DCE 允许发送。当 DCE 准备好接收时,置为有效(逻辑 0)。 |
驱动开发要点: 在 Linux 内核中,UART 端口结构体
uart_port 的 mctrl 字段用于管理 RTS/CTS 等调制解调器控制信号。驱动通过 uart_update_mctrl() 函数来更新这些信号的状态。
3.3.2 硬件流控(RTS/CTS)工作流程
硬件流控通过 RTS 和 CTS 引脚实现“请求-允许”机制,防止接收端数据溢出。以下是一个典型的交互流程:
- 接收端准备就绪: 接收端(如 SoC)将 RTS 置为有效(逻辑 0),表示“我可以接收数据”。
- 发送端检测 CTS: 发送端(如 PC)检测到 CTS 引脚为有效(逻辑 0),开始发送数据。
- 接收端缓冲区满: 当接收端内部 FIFO 或缓冲区接近满时,将 RTS 置为无效(逻辑 1),表示“请暂停发送”。
- 发送端暂停: 发送端检测到 CTS 无效,立即停止发送,直到 CTS 再次有效。
3.4 常见接口连接方式
根据是否使用流控,UART 接口的连接方式分为以下两种典型场景:
- 三线制(无流控): 仅连接 TX、RX、GND。适用于低速、短距离、通信双方处理能力充足的场景。这是嵌入式开发中最常用的调试接口。
- 五线制(硬件流控): 连接 TX、RX、GND、RTS、CTS。适用于高速传输或接收端处理能力有限的场景,如蓝牙模块、高速工业总线。
驱动配置示例: 在 Linux 设备树中,通过
uart-has-rtscts 属性来启用硬件流控。驱动初始化时会根据该属性配置 UART 控制器的自动流控逻辑。
/* 设备树节点示例 */
&uart3 {
status = "okay";
pinctrl-0 = &uart3_pins; /* TX, RX, RTS, CTS */
uart-has-rtscts; /* 启用硬件流控 */
};