第2章:UART物理层:RS-232、RS-485、TTL电平标准详解
大家好,我是你们的嵌入式系统讲师。今天我们来聊聊UART物理层的那些事儿。很多初学者写驱动时,逻辑完全正确,但就是通信失败——十有八九是电平标准搞错了。我当年刚入行时也踩过这个坑,所以这一章咱们把它彻底讲透。
2.1 为什么需要不同的电平标准?
UART协议本身只定义了数据帧的格式(起始位、数据位、校验位、停止位),但它没规定信号线上到底用多少伏代表“1”和“0”。这就好比大家约定好了说话的内容,但没规定用多大的声音说。
不同的应用场景对电压、距离、抗干扰能力的要求完全不同。于是就有了三种主流的物理层实现:
- TTL电平:板级通信,距离短(<1米),电压低(0~5V或0~3.3V)
- RS-232:早期PC与外设通信,距离中等(约15米),电压高(±12V左右)
- RS-485:工业现场总线,距离远(可达1200米),差分信号抗干扰强
核心要点:同一个UART控制器,配上不同的电平转换芯片,就能变成TTL、RS-232或RS-485接口。驱动开发者需要关心的,是逻辑电平的对应关系,而不是物理电压值。
2.2 TTL电平标准
TTL(Transistor-Transistor Logic)是我们在开发板上最常见到的。说白了,就是直接用芯片的供电电压来代表逻辑电平。
| 参数 | 5V TTL | 3.3V TTL(LVTTL) |
|---|---|---|
| 逻辑1(输出) | ≥2.4V | ≥2.0V |
| 逻辑0(输出) | ≤0.4V | ≤0.4V |
| 逻辑1(输入) | ≥2.0V | ≥1.7V |
| 逻辑0(输入) | ≤0.8V | ≤0.7V |
实战经验:我个人习惯在3.3V系统中使用5V容忍(5V-tolerant)的引脚。有一次项目里误接了5V的TTL模块到3.3V的STM32上,幸好引脚支持5V容忍,否则芯片就烧了。你设计电路时一定要看数据手册的“Vin”最大值。
TTL电平的UART信号线通常只有三根:TX(发送)、RX(接收)、GND(地)。空闲时TX和RX保持高电平(逻辑1),起始位拉低(逻辑0)。
2.3 RS-232标准
RS-232是历史最悠久的串口标准。我记得早期电脑的DB9串口就是RS-232接口。它用正负电压来表示逻辑电平,而不是TTL的0~5V。
| 参数 | RS-232电平 |
|---|---|
| 逻辑1(Mark) | -3V ~ -15V |
| 逻辑0(Space) | +3V ~ +15V |
| 电压摆幅 | 约±12V |
| 最大传输距离 | 约15米(9600bps时) |
这里有个容易混淆的点:RS-232的逻辑1是负电压,逻辑0是正电压。这和TTL正好相反。所以MCU的UART引脚不能直接连RS-232接口,中间必须加电平转换芯片,比如经典的MAX232。
避坑指南:我曾经见过有人直接把3.3V的TX引脚接到RS-232的DB9接口上,结果不但通信失败,还把电脑的串口烧了。记住:TTL和RS-232之间必须用转换芯片,不能直连!
2.4 RS-485标准
RS-485是工业现场最常用的串口标准。它采用差分信号传输,抗干扰能力极强。为什么?你想想看,两根线(A和B)上传输的是互补信号,外部噪声同时叠加到两根线上,相减之后噪声就被抵消了。
| 参数 | RS-485 |
|---|---|
| 传输方式 | 差分(半双工或全双工) |
| 逻辑1 | A-B > +200mV |
| 逻辑0 | A-B < -200mV |
| 最大节点数 | 32个(标准),可扩展至256个 |
| 最大传输距离 | 1200米(100kbps时) |
| 共模电压范围 | -7V ~ +12V |
RS-485最常用的模式是半双工,即同一时刻只能发送或接收。驱动里需要控制DE(发送使能)和RE(接收使能)引脚。我习惯把DE和RE短接,用一个GPIO控制:高电平发数据,低电平收数据。
关键区别:TTL和RS-232都是单端信号(一根信号线+地),而RS-485是差分信号(两根线互为参考)。差分信号的优势在于长距离和抗共模干扰,代价是需要多一根线。
2.5 三种标准的对比总结
下面这张表是我做项目时经常参考的,建议你收藏起来:
| 特性 | TTL | RS-232 | RS-485 |
|---|---|---|---|
| 信号类型 | 单端 | 单端 | 差分 |
| 逻辑1电压 | 2.0V~5V | -3V~-15V | A-B > +200mV |
| 逻辑0电压 | 0V~0.8V | +3V~+15V | A-B < -200mV |
| 最大距离 | <1米 | ~15米 | ~1200米 |
| 最大速率 | 10Mbps+ | 115.2kbps(典型) | 10Mbps(短距离) |
| 多节点 | 点对点 | 点对点 | 多点(总线型) |
| 典型芯片 | 直连MCU | MAX232, SP3232 | MAX485, SN75176 |
2.6 电平转换电路设计要点
在实际项目中,我们经常需要在这三种标准之间转换。这里给出几个我常用的电路设计思路:
- TTL转RS-232:使用MAX232或SP3232芯片,内部有电荷泵产生±12V电压
- TTL转RS-485:使用MAX485或SN75176,注意控制DE/RE引脚
- 3.3V与5V TTL互转:用MOS管或专用电平转换芯片(如TXS0108)
我的习惯:做RS-485项目时,我总会在A、B线之间并联一个120Ω的终端电阻。为什么?因为信号在长线上会反射,终端电阻能吸收反射波。如果总线长度超过300米,这个电阻必须加,否则数据会出错。
2.7 知识结构图
下面这张SVG图帮你理清三种电平标准的核心差异和应用场景:
2.8 驱动开发中的电平适配
写驱动时,你不需要关心具体的电压值,但必须知道以下几点:
- GPIO配置:TTL电平的TX/RX引脚通常配置为推挽输出和浮空输入
- 极性反转:如果外接RS-232转换芯片,有些芯片会反转逻辑极性,驱动里可能需要配置UART的极性寄存器
- 使能控制:RS-485驱动里,发送数据前要先拉高DE引脚,发送完成后及时拉低
曾经踩过的坑:有一次我用RS-485做多机通信,发送完数据后忘记关闭DE使能,结果总线一直被自己占用,其他设备发不了数据。后来我在驱动里加了一个发送完成中断,在中断服务函数里立即拉低DE,问题才解决。
好了,这一章的内容就到这里。电平标准是UART通信的基础,搞懂了这些,后面写驱动时才能游刃有余。