串行通信(USB或RS232)中的波特率是否需要准确?


8

在串行通信中,波特率是否意味着我们必须使用精确的时钟速度,或者这是我们可以使用的速度范围?

如果它是一个精确值,那么它应该是多少?例如,我可以使用555作为串行通信电路的时钟吗?


UART通常可以承受大约3%的偏差。不过要取决于特定的一个。
尤金(Eugene Sh)。

对于USB,它将在标准中指定,可以免费下载。
Photon

Answers:


6

时序必须足够准确,以使它们在协议重新同步之前不会漂移。


UART串行在每个字节上重新同步,一个字节约为10位(8位数据加上开始和停止位置)。我们假设我们的UART以每个位的中间为目标。如果一切都是完美的,并且只有一端不正确,则链接的两端之间可能会有大约5%的差异。

然而:

  1. 链接的两端相对于标称值可能不准确。在最坏的情况下,一端可能会低于标称值,而另一端可能会超过标称值。
  2. 可能存在系统错误。例如,大多数UART的波特率发生器设置范围有限。
  3. 您的UART基于速度有限的主时钟。即使时钟和波特率发生器是完美的,这也将导致它没有碰到每个位的确切中间位置。

最重要的是,时钟上的1%误差几乎可以确定。5%的错误几乎可以肯定是一个问题。在这两个数字之间,根据整体情况,可能有问题也可能没有问题。

对于RC振荡器,这是一个很高的要求。假设您的R的公差为1%,而您的C的公差为2%。这样就为RC网络的时间常数提供了3%的容差,并且这是在考虑驱动程序芯片引入的任何错误之前的容差。

因此,最重要的是您应该查看晶体或陶瓷谐振器。


至于USB,我没有经验可以从第一条原则进行分析,但是https://www.silabs.com/community/interface/knowledge-base.entry.html/2004/03/15/usb_clock_tolerance-gVai表示1.5%低速时为0.25%,全速时为0.25%。


如果可以以3%或更精细的步长编程波特率并且可以使用适当的“训练”序列,则RC精度可能不是问题。如果知道对方将交替发送0xF8和0xF0(分别低四位和五位时间),将波特率设置为33%更快,则应使它始终接收0xF0(5.33位时间)和0x80(6.67位)次)。接收其他值将使您知道一个速度快于或慢于“超过33%”的速度,而接收到重复的0xF0 0x80将表明应将速度降低25%并开始实际通信。
超级猫

8

RS232型串行系统中通常使用的UART通过根据预定义的波特率基准频率时钟的分频对数据线的中间位进行采样来工作。这样,如果发送的数据和接收器不在相同的频率上,则“采样点”将在连续的位上更靠近位帧的边缘徘徊。

对于普通UART,一个字节的位长为10或11位。1个开始,8个数据和1或2个停止位。在第10位上的一半漂移会转化为0.5 / 10 = 5%的错误。

但是,实际上,您的容忍度小于该容忍度,因为您还需要增加基频周期的延迟,这会增加与起始位前沿的偏移量。基本频率越高,效果越差。

至于为此目的使用555计时器,除非您计划在555电路中进行手动调整,否则我不建议您使用它。

USART另一方面使用更复杂的控制方法,该方法尝试将发送接收到的数据同步。这可以通过使用具有嵌入式时钟的数据模式,通过使用的时钟或对接收到的数据沿进行某种形式的锁相来实现。(尽管可以说后者确实是伪同步的。)


既然您知道您在说什么,我想我会提到缩写“ U S ART”,这应该是此答案的一部分。好吧,在看来,这将使答案完整,在此之后应该给我+1。
哈里·斯文森

1
@HarrySvensson嗯..我同意..但是试图决定的是,这对于555包装OP来说只会使答案更加混乱。
Trevor_G

1
USART的不同之处在于它可以是同步的。而且,如果将其用作同步接口,则时钟是两端通用的,则时钟速度无关紧要。
gbarry

1
哦,可以的,它可以在评论中,谢谢@gbarry。我不介意 +1特雷弗。
哈里·斯文森

@HarrySvensson我确实添加了一个简短的波浪形手法来说明完整性的差异
。.– Trevor_G
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.