UART接收器时钟速度


14

我试图了解UART基础知识。

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

这里的问题是

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

Answers:


18

发射器和接收器时钟彼此独立,以它们独立产生的方式进行,但应进行适当匹配以确保正确传输。

起始位(低位)和停止位(高位)确保两个字节之间始终存在从高到低的转换,接收器可以同步,但是此后它是独立的:没有更多时间提示可以用来区分连续的位。它所拥有的只是它自己的时钟。因此,最简单的方法是从起始位样本开始,在其时间的中间进行采样。例如,在9600个bps的比特时间是104微秒,那么这将样品在起始位 + 52微秒,第一数据在比特 + 52微秒+ 104微秒,在该第二数据位 + 52微秒+ 2 104 µs,依此类推。是起始位的下降沿。虽然实际上不需要采样起始位(您T 0 T 0 × T 0T0T0T0×T0知道它很低),确定起始边缘不是峰值很有用。

在此处输入图片说明

对于52 µs的时序,您需要两倍于9600 bps的时钟频率,即19200 Hz。但这只是一种基本的检测方法。更高级(阅读:更准确)的方法将连续获取多个样本,以避免仅碰到一个峰值。然后,你可能确实需要一个16 9600 Hz的时钟,让每位16个蜱,其中您可以在什么应该是一个位的中间使用,也就是说,5个左右。并使用投票系统查看应将其读为高还是低。×

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

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

无与伦比的时钟
如果接收器的时钟与发送器的时钟不同步,将发生以下情况:

在此处输入图片说明

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


感谢您的帮助。谢谢!。不是应该在T0 + 104us而不是T0 + 52us处采样起始位吗?
Vivek Maran 2012年

1
@ Vivek27-不,因为起始位的持续时间为104 us,然后您将在起始位进行采样,而不是在中间进行采样。如果您给我几分钟,我将更新我的照片。:-)
stevenvh 2012年

1
@Vivek:实际上,起始位根本没有被“采样”。它的全部目的是提供从行空闲开始的初始过渡,其余字符是相对于其计时的。它的“值”始终与行空闲相对,并且本身不包含任何数据。
奥林·拉斯洛普

7
@Olin- 将对起始位进行采样,只是要检查起始边不是尖峰。
stevenvh 2012年

1
@downvoter-如果您能告诉我们这里出了什么问题,我也许可以解决它。但是然后你必须告诉我们一些事情。(您是今天也否决了我其他回答的人吗?)
stevenvh 2012年

11

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

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

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

对于8个数据位,最差的时序情况是对最后一位进行采样。距时序参考的8.5位时间,时序参考是起始位的上升沿。如果接收器关闭了1/2位或更多,则它将在另一个位中对最后一位进行采样。显然,这很糟糕。这发生在8 1/2位或1/2%的1/2位时钟频率不匹配的情况下。这是保证不匹配失败的保证。为了提高可靠性,通常需要确保接收器与发射器的匹配度在其一半以内,即2.9%。这代表最后一位的1/4位时间误差。

但是,它并不是那么简单。在上述情况下,接收器实际上在起始位的上升沿启动秒表。从理论上讲,这可以在模拟电子产品中完成,但是那将是复杂且昂贵的,并且不容易集成到数字芯片上。取而代之的是,大多数数字UART实现具有内部时钟,该时钟以预期比特率的16倍运行。然后,“秒表”将对这16个周期进行计数。这意味着在所有位采样时间中还会有一个额外的可能的错误,即1/16位,这与最后一位的另一个.7%时钟失配类似。

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

很久以前,该协议已由凸轮,杠杆和旋转轮解码。通常使用两个停止位来使该机制复位。如今,一切都以数字逻辑完成,并且1停止位已被普遍使用。您通常会看到写为8-N-1的低级协议的缩写,表示8个数据位,无奇偶校验位(忘记这些位,今天很少使用它们)和1个停止位。隐含起始位,因为那里没有选项。

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


5

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.