2. UART硬件设计:从电平到接口,一个都不能错
做UART驱动,光懂协议寄存器是不够的。硬件设计上的坑,往往在板子回来才暴露。今天咱们把RS232电平转换、TTL电平、DB9接口和流控信号彻底理清楚。
2.1 TTL电平 vs RS232电平:为什么需要转换?
先说个基本概念。MCU的UART引脚输出的是TTL电平——0V代表逻辑0,3.3V(或5V)代表逻辑1。但RS232标准不是这样玩的。
| 参数 | TTL电平 | RS232电平 |
|---|---|---|
| 逻辑0 | 0V (GND) | +3V ~ +15V |
| 逻辑1 | 3.3V / 5V | -3V ~ -15V |
| 传输距离 | 约1米 | 可达15米 |
| 抗干扰能力 | 弱 | 强(差分思想) |
你看,RS232的逻辑电平是反的,而且电压范围更大。直接连?烧芯片是小事,通信根本不通。
核心结论:MCU和PC串口之间,必须加电平转换芯片。常见的有MAX232、SP3232、MAX3232。
2.2 电平转换芯片怎么选?
我个人习惯用MAX3232。为什么?它支持3.3V供电,而且内置电荷泵,不需要额外的±12V电源。
典型电路长这样:
MCU (3.3V) MAX3232 DB9
TX ──────────────> T1IN → T1OUT ──> 引脚2 (RXD)
RX <────────────── R1OUT ← R1IN <── 引脚3 (TXD)
GND ──────────────> GND ────> 引脚5 (GND)
注意那几个电容——我见过有人用错容值,导致通信丢包。MAX3232的电荷泵需要4个0.1μF的电容,别省。
避坑指南:我曾经在一个项目里用了劣质电解电容,结果高温下容量衰减,串口间歇性失灵。后来全部换成X7R陶瓷电容,问题解决。
2.3 DB9接口定义:别把收发搞反
DB9是RS232最常用的连接器。但很多新手会搞混引脚顺序——尤其是公头和母头的区别。
| 引脚号 | 信号名 | 方向(DTE视角) | 说明 |
|---|---|---|---|
| 1 | DCD | 输入 | 载波检测 |
| 2 | RXD | 输入 | 接收数据 |
| 3 | TXD | 输出 | 发送数据 |
| 4 | DTR | 输出 | 数据终端就绪 |
| 5 | GND | - | 信号地 |
| 6 | DSR | 输入 | 数据设备就绪 |
| 7 | RTS | 输出 | 请求发送 |
| 8 | CTS | 输入 | 清除发送 |
| 9 | RI | 输入 | 振铃指示 |
记住一个口诀:2收3发5地。这是最常用的三线制接法。
小技巧:如果你用USB转串口模块,通常模块上会标注TXD/RXD。注意交叉连接——模块的TXD接设备的RXD,反之亦然。我见过有人直连,结果两边都在发,谁也收不到。
2.4 流控信号:硬件流控 vs 软件流控
流控解决什么问题?说白了就是防止数据溢出。发送方太快,接收方来不及处理,数据就丢了。
两种主流方案:
- 硬件流控(RTS/CTS):用两根专用信号线。接收方拉低CTS,发送方就暂停。实时性好,不占用数据带宽。
- 软件流控(XON/XOFF):在数据流中插入特殊字符。0x13(XOFF)让发送方暂停,0x11(XON)恢复。简单,但只适用于文本传输。
我个人偏好硬件流控。为什么?软件流控有个致命问题——如果传输的是二进制数据,0x13和0x11可能出现在数据中,造成误触发。
经验之谈:在高速通信(比如115200bps以上)或者大数据量传输时,一定要用硬件流控。我曾经在一个数据采集项目里,因为没用流控,每传几百KB就丢几个字节,排查了两天才找到原因。
2.5 知识体系总览
下面这张图把本章的核心逻辑串起来了:
2.6 实战接线示例
假设你手头有个STM32开发板,要跟PC通信。典型接线如下:
- MCU端:PA9 (TX) → MAX3232的T1IN,PA10 (RX) → MAX3232的R1OUT
- 转换芯片端:MAX3232的T1OUT → DB9的引脚2,R1IN → DB9的引脚3
- 地线:MCU GND → MAX3232 GND → DB9引脚5
- 电容:4个0.1μF陶瓷电容,紧贴芯片引脚放置
重要提醒:DB9外壳(金属部分)最好接大地(机壳地),而不是信号地。否则静电可能通过串口线打坏芯片。我吃过这个亏——一批产品在冬天频繁死机,最后发现是静电通过未接地的DB9外壳耦合到信号线上。
2.7 小结
UART硬件设计,说白了就是三件事:电平匹配、接口正确、流控得当。电平转换芯片选MAX3232系列最省心,DB9记住2收3发5地,高速通信用硬件流控。把这些基础打牢,后面写驱动才能事半功倍。