2. UART硬件原理
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是嵌入式系统中最基础、最常用的串行通信接口之一。在设备树移植适配过程中,对 UART 硬件原理的深入理解是正确配置 dts 节点、解决调试输出异常的前提。本节将从通信协议、电平转换和硬件引脚三个维度展开分析。
2.1 UART 通信协议简介
UART 采用异步串行通信方式,通信双方不需要共享时钟信号,而是通过预先约定相同的波特率(Baud Rate)来同步数据采样。数据以帧(Frame)为单位进行传输,每一帧通常包含以下字段:
| 字段 | 位宽 | 说明 |
|---|---|---|
| 起始位 | 1 bit | 逻辑低电平,标志数据帧开始 |
| 数据位 | 5~9 bits | 通常为 8 bits,低位在前(LSB first) |
| 校验位 | 0/1 bit | 可选奇校验/偶校验/无校验 |
| 停止位 | 1/1.5/2 bits | 逻辑高电平,标志数据帧结束 |
关键参数对齐:在设备树中,UART 节点通常通过
current-speed 属性指定波特率,而数据位、校验位和停止位则由终端或应用层配置。调试串口最常用的组合是 115200 8N1(波特率 115200,8 数据位,无校验,1 停止位)。
下图展示了 UART 一帧数据的典型波形结构:
2.2 RS232 / RS485 电平转换
SoC 内部 UART 控制器输出的信号通常是 TTL/CMOS 电平(0V ~ 3.3V 或 0V ~ 1.8V),而工业现场常用的 RS232 和 RS485 标准使用完全不同的电平定义。设备树移植时,需要根据实际硬件设计选择对应的电平转换芯片,并在 dts 中正确描述其连接关系。
| 标准 | 逻辑 1 | 逻辑 0 | 传输方式 | 最大距离 | 典型芯片 |
|---|---|---|---|---|---|
| TTL | 2.0V ~ 3.3V | 0V ~ 0.8V | 单端 | < 1m | 直连 SoC |
| RS232 | -15V ~ -3V | +3V ~ +15V | 单端 | ~15m | MAX3232, SP3232 |
| RS485 | A-B > +200mV | A-B < -200mV | 差分 | ~1200m | MAX3485, SP3485 |
移植适配要点:在设备树中,电平转换芯片通常不需要显式描述,但转换芯片的 使能引脚(如 RS485 的 RE/DE) 必须通过 GPIO 或 pinctrl 正确配置。如果调试串口使用 RS485 半双工模式,还需要在 UART 节点中增加
rts-gpios 或 linux,rs485-enabled-at-boot-time 属性来控制收发切换。
下图展示了从 SoC 到 RS232/RS485 接口的典型硬件链路:
2.3 UART 硬件引脚功能说明
一个完整的 UART 硬件接口至少包含 TX 和 RX 两根数据线。在流控场景下,还会引入 RTS 和 CTS 两根硬件握手信号线。设备树中通过 pinctrl 和 uart-has-rtscts 等属性来配置这些引脚。
| 引脚名称 | 方向 | 功能描述 | 设备树典型配置 |
|---|---|---|---|
| TX (Transmit) | 输出 | 发送数据,由 SoC 输出到外部设备 | pins = "GPIO1_0"; function = "uart2_tx"; |
| RX (Receive) | 输入 | 接收数据,由外部设备输入到 SoC | pins = "GPIO1_1"; function = "uart2_rx"; |
| RTS (Request to Send) | 输出 | 硬件流控:SoC 通知对方可以发送数据 | pins = "GPIO1_2"; function = "uart2_rts"; |
| CTS (Clear to Send) | 输入 | 硬件流控:对方通知 SoC 可以发送数据 | pins = "GPIO1_3"; function = "uart2_cts"; |
调试串口引脚确认方法:在移植初期,如果无法确定调试串口对应的 SoC 引脚号,可以通过以下步骤快速定位:
1. 查阅芯片 数据手册(Datasheet) 中的 Pin Mux 表格。
2. 使用
3. 在
1. 查阅芯片 数据手册(Datasheet) 中的 Pin Mux 表格。
2. 使用
gpioinfo 或 cat /sys/kernel/debug/gpio 查看当前引脚复用状态。3. 在
dts 中通过 pinctrl-0 明确指定 UART 功能对应的引脚组。
下图展示了 UART 硬件流控模式下 TX/RX/RTS/CTS 四根引脚的信号交互关系:
2.4 设备树中 UART 引脚配置示例
以下是一个基于 i.MX6ULL 平台的 UART2 设备树节点片段,展示了如何通过 pinctrl 配置 TX/RX/RTS/CTS 引脚:
&uart2 {
pinctrl-names = "default";
pinctrl-0 = &pinctrl_uart2;
uart-has-rtscts; /* 启用硬件流控 */
status = "okay";
};
&iomuxc {
pinctrl_uart2: uart2grp {
fsl,pins = <
MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x1b0b1
MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1
MX6UL_PAD_UART2_RTS_B__UART2_DCE_RTS 0x1b0b1
MX6UL_PAD_UART2_CTS_B__UART2_DCE_CTS 0x1b0b1
>;
};
};
引脚配置值说明:上述代码中的
0x1b0b1 是 i.MX 平台特有的引脚配置参数,包含驱动强度、上下拉、速度等电气特性。不同 SoC 的配置值含义不同,移植时务必参考对应芯片的 IOMUX 章节。
2.5 常见问题与避坑指南
- TX/RX 接反:调试串口无输出时,首先检查 TX 和 RX 是否交叉连接。设备 A 的 TX 必须接设备 B 的 RX。
- 电平不匹配:SoC 的 TTL 电平直接连接 RS232 设备会烧毁接口,必须经过电平转换芯片。
- 流控引脚未配置:如果硬件原理图使用了 RTS/CTS,但
dts中未添加uart-has-rtscts,可能导致数据丢失或通信卡死。 - pinctrl 冲突:同一个引脚被多个外设节点引用时,内核会报 pin conflict 错误,需检查
dts中的引脚复用分配。