UART接收器时钟速度

电器工程 串行 UART 沟通
2022-01-06 04:27:04

我试图了解 UART 基础知识。据了解

  • 它是一种异步通信协议,因此 TX 和 RX 时钟彼此独立
  • 数据接收通过使用起始位和一个或多个停止位来保证。此外,接收器必须知道数据速率,以便生成合适的时钟来驱动用于接收的SIPO 寄存器。

这里的问题是

提到通常使用16X比特率的时钟来恢复数据。那么如何将bps转换为时钟频率呢?请提供一些参考资料来研究 UART 接收器中使用的时钟机制。

3个回答

发送器和接收器时钟彼此独立,它们是独立生成的,但它们应该很好地匹配以确保正确传输。

起始位(低)和停止位(高)保证在两个字节之间总是有一个接收器可以同步的从高到低的转换,但之后它就靠自己了:没有更多的时间了它可以用来区分连续位的提示。它只有自己的时钟。所以最简单的事情是从开始位开始,在其时间的中间对每个位进行采样。例如,在 9600 bps 时,一个位时间为 104 µs,那么它将在 \$T_0\$ + 52 µs 处采样起始位,在 \$T_0\$ + 52 µs + 104 µs 处的第一个数据位,第二个数据位位在 \$T_0\$ + 52 µs + 2 \$\times\$ 104 µs,依此类推。\$T_0\$ 是起始位的下降沿。虽然对起始位进行采样并不是真正必要的(你知道它很低),但确定起始边沿是有用的

在此处输入图像描述

对于 52 µs 的时序,您需要两倍的 9600 bps 时钟频率,即 19200 Hz。但这只是一种基本的检测方法。更高级(阅读:更准确)的方法将连续采集多个样本,以避免只触及那个尖峰。那么您可能确实需要一个 16 \\$\\times\\$ 9600 Hz 时钟来获得每比特 16 个滴答声,其中您可以使用,比如说,5 左右,应该是位的中间。并且使用投票系统来查看它是否应该被读取为高或低。

如果我没记错的话,68HC11 在开始、中间和结束时采集了几个样本,如果电平发生变化(不能保证),第一个和最后一个可能会重新同步。

采样时钟不是来自比特率,而是相反。对于 9600 bps,您必须将采样时钟设置为 153 600 Hz,您将通过预分频器从微控制器的时钟频率中得出该值。然后位时钟由另一个除以 16 得到。

不匹配的时钟
如果接收器的时钟与发送器的时钟不同步,则会发生以下情况:

在此处输入图像描述

接收器的时钟慢了 6.25 %,您可以看到每个下一位的采样将越来越晚。典型的 UART 传输由 10 位组成:1 个起始位、8 个数据位的有效负载和 1 个停止位。然后,如果您在中间进行采样,则可以承受在最后一点(即停止位)处偏离一半的情况。十位上的半位是 5%,所以我们的 6.25% 偏差我们会遇到问题。这在图中清楚地显示:已经在第三个数据位,我们在边缘附近采样。

让我们退后一步,谈谈 UART 使用的低级信令协议。TX 和 RX 是数据线,不是时钟。时钟仅在每个 UART 内部,这就是为什么必须事先就波特率达成一致。

不传输时,线路处于空闲状态。要发送一个字节(例如,其他数据宽度是可能的),发送器首先发送起始位接收器使用起始位前沿的时间和已知的波特率来解码字符的其余部分。为简单起见,我们假设正在使用 100 kBaud。这意味着每个位时间为 10 µs 长。这包括起始位、数据位和停止位。因此,第一个数据位的中间将在起始位前沿之后的 15 µs,第二个在 25 µs,依此类推。

只要接收器和发送器时钟相同,这可能会永远持续下去。但是,它们永远不会完全相同,因此它不能永远持续下去。为了使接收器时钟与发送器时钟重新同步,数据字符结束,线路空闲一段时间,然后重复该过程。时序误差从起始位的前沿开始累积,因此最大漂移在最后一位。一旦该字符结束,接收器将重置等待下一个起始位并重复该过程。

对于 8 个数据位,最坏的时序情况是对最后一位进行采样。即从时序参考开始的 8.5 位时间,即起始位的前沿。如果接收器关闭 1/2 位或更多,它将在不同的位期间对最后一位进行采样。显然这是不好的。这发生在 8 1/2 位中 1/2 位的时钟频率不匹配,即 5.9%。这是保证失败的不匹配。为了可靠性,您通常希望确保接收器与发射器的匹配度在一半以内,即 2.9%。这代表最后一位的 1/4 位时间错误。

然而,事情并不是那么简单。在上述场景中,接收器实质上是在起始位的前沿启动秒表。这在理论上可以在模拟电子设备中完成,但这将是复杂且昂贵的,并且不容易集成到数字芯片上。相反,大多数数字 UART 实现都有一个以 16 倍预期比特率运行的内部时钟。“秒表”然后计算这 16 次循环。这意味着在所有位采样时间中增加了 1/16 位的额外可能误差,这就像最后一位的另一个 0.7% 的时钟不匹配。

希望这可以清楚地说明什么是停止位,位时序是如何工作的,以及 16x 时钟是什么。我主要跳过了停止位,但也许您现在可以自己了解为什么至少需要一个停止位。基本上,停止位是字符之间强制的最小行空闲时间。这是接收器完成接收字符并为开始位的下一个前沿做好准备的时间。如果没有停止位,则最后一个数据位可能与起始位具有相同的极性,并且接收器将没有边沿来启动其秒表。

很久以前,这个协议被凸轮、杠杆和纺车解码。通常使用两个停止位来允许机制复位。如今,一切都在数字逻辑中完成,并且几乎普遍使用 1 个停止位。你经常看到低级协议被简写为 8-N-1,这意味着 8 个数据位,没有奇偶校验位(忘记这些,它们今天很少使用)和 1 个停止位。起始位是隐含的,因为那里没有选项。

使用 8-N-1,一个 8 位字节的数据实际上需要 10 位时间来发送。这是“比特率”和“波特率”之间存在区别的原因之一。波特率是指单个位信号时间,包括开始位和停止位。在 100 kBaud 时,传输的每个位需要 10 µs,包括开始位和停止位。因此,整个字符需要 100 µs,但只传输 8 位实际数据。波特率是100k,但从更高层次来看数据传输比特率只有80kBits/s。

传输的比特率是时钟速率除以(如您所说,通常是)16。您还有一些非数据位用于帧位(开始,奇偶校验,停止)。因此,对于 16000Hz 时钟,您每秒获得 1000 位,但在插入最少的帧位之后,每秒仅插入 800 个数据位或 100 个字节。

对于接收,接收器从起始位的中间开始计数 16 个时钟并对线路进行采样,称为它所看到的“第一个数据位”。它重复这个计数和采样足够的时间来读取整个符号,然后它确认停止位的存在并开始等待下一个起始位。

只要接收器时钟接近发送器时钟的速率,采样就会命中传输信号的正确部分。