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 一帧数据的典型波形结构:

UART 数据帧波形(115200 8N1) 空闲 高电平 起始 低电平 D0 LSB D1 D2 D3 D4 D5 D6 D7 MSB 停止 高电平 空闲 起始 数据位(8 bits) 停止

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 接口的典型硬件链路:

UART 电平转换硬件链路 SoC UART 控制器 TTL 电平 电平转换 MAX3232 TTL ↔ RS232 或 MAX3485 RS232 DB9 连接器 RS485 A/B 差分线 设备树中需通过 pinctrl 配置 TX/RX 引脚为 UART 功能,电平转换芯片通常由硬件原理图决定,dts 无需描述

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. 使用 gpioinfo 或 cat /sys/kernel/debug/gpio 查看当前引脚复用状态。
3. 在 dts 中通过 pinctrl-0 明确指定 UART 功能对应的引脚组。

下图展示了 UART 硬件流控模式下 TX/RX/RTS/CTS 四根引脚的信号交互关系:

UART 硬件流控引脚交互(RTS/CTS) 设备 A (SoC) 设备 B (外设) TX → RX RX ← TX RTS → CTS CTS ← RTS 实线为数据线(TX/RX),虚线为流控线(RTS/CTS);设备树中启用流控需添加 uart-has-rtscts 属性

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 中的引脚复用分配。