3.18. UART 基础¶
UART(通用异步收发器,Universal Asynchronous Receiver-Transmitter)是在两个微控制器之间,或在微控制器与主机 PC 之间传输字节的最古老、最简单的方式。两根线承载数据——每个方向一根——并由共用的地线返回信号。两端都不运行共享时钟;它们事先约定一个 波特率,并从数据线本身恢复出每个比特的时序。
3.18.1. 帧¶
线上的每个字符都被封装在一个帧里:一个起始位、若干数据位、一个可选的奇偶校验位,以及一个或两个停止位。
一个 UART 帧:一个起始位、八个数据位和一个停止位,每一位宽度为一个比特周期(1 / baudrate 秒)。¶
线路空闲时为高电平。接收器监视下降沿,它标志着一个新帧的开始。然后接收器每个比特周期采样数据线一次——通常在每个比特的中间——并将这些比特重新组装成一个字符。停止位使线路返回空闲状态,以便能够检测到下一个起始位。
3.18.2. 波特率¶
比特周期——以及链路的速度——由 波特率 决定,即每秒的比特数。9600、19200、38400、57600、115200、230400、460800 和 921600 是标准取值;115200 是最常用的默认值。两端必须在百分之几的误差范围内约定相同的波特率,否则接收器会在错误的位置采样比特,返回的数据会出现乱码。
更高的波特率每秒传输更多数据,但对线缆长度、电容以及两端时钟的精度更敏感。对于同一工作台上两块板子之间的短链路,115200 到 921600 都能轻松工作。
3.18.3. 接线¶
一条 UART 链路使用三根线:
UART 接线:一块板子上的 TX 连到另一块板子的 RX,两块板子的地连接在一起。¶
TX → RX,双向均如此。 每块板子的发送引脚是另一块板子的接收引脚。新手常犯的一个错误是将 TX → TX 接线——两个输出相互对抗,结果两个接收端都收不到数据。
共用地。 信号电平是以地为参考的,因此两块板子必须有共同的地,否则接收器会在线路上看到错误的电压。
3.18.4. 电压电平与物理层¶
摄像头 UART 引脚上的信号电平为 3.3 V CMOS:逻辑零为地电平,逻辑一为 3.3 V。任何使用 3.3 V CMOS UART 通信的设备——另一个微控制器、设置为 3.3 V 的 USB 转串口适配器、3.3 V 的 GPS 模块——都可以直接连接。
备注
5 V CMOS UART 设备(较旧的微控制器、某些 GPS 模块、一些较旧的传感器扩展板)使用相同的 UART 帧格式,但工作在 5 V 逻辑电平。将它们直接连到摄像头是不安全的:5 V 的 TX 驱动摄像头的 RX,会超过不耐 5 V 的摄像头的绝对最大输入电压;而摄像头的 3.3 V TX 也可能达不到 5 V 设备所需的高电平阈值,无法产生干净的逻辑一。
在这两种电压之间转换需要一个 有源线路驱动器——一个专用的双向电平转换 IC,它在每条线路的两侧都有自己的驱动晶体管。来自 电平转换 的无源 MOSFET 加上拉电阻式电平转换器在这里是不够的:它们的上升沿依赖于通过电阻给线路充电,这在开关速度下没问题,但对 UART 来说太慢了。在 115200 波特率下每个比特持续约 8 µs,而无源转换器的 RC 压摆会把一个比特拖糊到下一个比特里。
有源线路驱动器能在全速 UART 速率下双向产生干净的边沿。选择一个额定支持链路运行波特率的器件,将摄像头的 TX 和 RX 接到转换器的 3.3 V 侧,并将 5 V 设备的 TX 和 RX 接到转换器的 5 V 侧。
另外三种较旧的物理层使用相同的帧格式但电压不同,它们与 3.3 V 微控制器之间需要一个电平转换器:
RS-232。 用于台式 PC 的串口和一些工业设备。线路电压大致在
±5 V到±15 V之间摆动,空闲时位于负电平。与 CMOS 相比,它极性反转且电压较高;MAX232 / MAX3232 系列(或类似)的芯片可以处理这种转换。RS-422。 一种用于点对点链路(一个驱动器,最多十个接收器)的差分信号标准。驱动器在一对平衡线上发送信号;接收器看到的是两者之间的 差值,从而忽略沿途的共模噪声。全双工链路使用两对线——每个方向一对。根据波特率不同,RS-422 的传输距离可达数十米到一千米,RS-422 收发器芯片位于摄像头的 TX / RX 与平衡线对之间。
RS-485。 RS-422 的多点同族标准——同样的差分信号,但设计为可在一条总线上接入多达 32 个驱动器和接收器。大多数链路是单对线上的半双工,每个节点的驱动器和接收器共用同样的线,由软件仲裁谁来发送。它用于工业自动化总线(Modbus、DMX512、Profibus),这些场合线缆走线很远且噪声很大;RS-485 收发器芯片位于摄像头的 TX / RX 与差分线对之间。
两者在底层比特层面上仍然发送 UART 帧。无论收发器另一侧由哪种物理层承载信号,摄像头的 machine.UART 配置(波特率、数据位、奇偶校验、停止位)都是一样的。