UART频率有多重要?


17

我将使用8 MHz晶振以16 MIPS(PLL 4x,2个周期指令)运行我的微控制器。但是,8 MHz不会划分为任何UART频率AFAIK ...这些频率有多重要?我计划使用115,200波特。

UART能否在±1%的范围内运行?如果这不起作用,我应该使用哪个频率?(为了获得最大处理速度,我希望尽可能接近16 MIPS。)如果有问题,我正在使用PIC24FJ64GA004。

Answers:


13

如果您在1%以内,则应该可以。

假设您的UART使用16倍过采样时钟,例如,您可以将其设置为1,843,200 Hz至16倍过采样115,200 bps。(这样的过采样是很常见的)这使UART从起始位的下降沿开始以8个超时钟计数,因此在之后,它可以将位单元的中心定位在超时钟的+/-周期内。它将计算超频的16个周期,以确定何时采样数据。

如果您认为它可以到达起始位的中心,那么为了在8个数据位上的正确位单元中保持对串行数据的采样,时钟频率必须保持在(8-0.5)/ 8和(8 + 0.5)之间)/ 8或预期比特率的+/- 6.25%。更高的超频接近击中起始位中心的理想条件,但是8x或16x通常足够接近,您可以假设5%的不匹配将起作用。

但是,您不能指望频率完美的另一面。如果将速度为4%的设备连接到速度为4%的设备,则会遇到问题。我碰到过至少一种情况:一台PC的运行速度有点慢,而一台设备的运行速度却快,而两者只能勉强沟通,尽管同一台设备可以与其他PC正常运行,而PC可以与其他PC正常运行设备。(O观察到它们的频率大约为112kbps和119kbps)因此,最好尽可能地接近标称频率。我从未见过名义上2%以内的任何问题。

通常要做的是使用一个主时钟速率,该时钟速率提供预期UART过采样速率乘以波特率的整数倍。例如,如果您想让CPU运行在大约8MHz的频率上,则可以使用7.3728MHz的振荡器,将其除以4得到1.8432MHz,恰好是115200的16倍。


8 MHz除以69可得到115,942,在±1%的范围内。我想知道PIC是否支持这种类型的波特率生成器除法。我希望如此,但我认为不会。
Thomas O

PIC具有波特率发生器。它会很好地工作,但仅适用于低波特率(如9600),不适用于高波特率(如115,200),它变得不精确。
Thomas O

您认为我可以使用7.3728 MHz的晶体吗?(我不打算使用内部7.37 MHz振荡器,因为我想要精度。)它允许我除以64以得到115,200的UART频率。这是我可以忍受的最快速度。
Thomas O

1
如果您的UART支持,最好给它一个超频(例如16倍),以便它可以对起始位进行过采样并找到位单元的中心,但是将115K的16倍提高到1%以内可能是一个挑战,除非您使用了波特率多的晶体。
JustJeff 2010年

4

不需要1%@JustJeff提及。大多数UART在最后一位允许半个位错误。大多数情况下,一帧包含1个起始位,8个数据位和1个停止位,总共10位。10位上的一半是5%(JustJeff的6.25%并未考虑起始和终止位)。


1
不要误导我;关于“ 1%”,我的发言是,这可能很难实现。“ 6.25%” 假设您碰巧碰到了起始位的中心,这将是最大允许值在这种情况下接收器与发射器时钟速率差值
JustJeff 2011年

1

JustJeff忘记了开始位,但是Stevenh添加了停止位。假设共有8个数据位,1个起始位,没有奇偶校验位的通用协议(停止位的数量无关紧要),则从起始位的上升沿到中间位有8 1/2位时间。最后一个数据位。通常,您希望接收器在1/4位时间内对最后一位进行采样。请注意,1/2位是保证失败的阈值。由于总是存在一些电气噪声和抖动,因此附近的任何东西都变得不可靠。

1/4除以8 1/2 = 2.94%。

正如JustJeff提到的那样,大多数UART实现实际上都是使用异步16x时钟采样输入数据的。这增加了另一个1/16位时间不确定性,因为这是可以测量起始位前沿的误差。8 1/2位中的1/16位时间是另一个0.74%。这来自先前计算的错误预算。最终,接收器将允许2.2%的时钟失配,以使其在其中心的1/4位时间内对最后一位进行采样。

正如其他人所说,当需要精确的波特率时,通常使用7.3728MHz晶体。通常,您可以安排在接近晶体错误的情况下达到UART波特率时,以接近其最大速率运行CPU。


我不同意停止位无关紧要。在这个问题中,由于停止位被错误地设置为低电平,通信失败。
stevenvh 2011年

停止位必须存在,才能进行整体通信,但是对于大多数UART,它不会进入错误预算计算。UART将在最后一个数据位之后到下一个起始位的下一个上升沿之前需要一些最少的时间。这就是停止时间。当这个时间不满足时,您会收到“成帧错误”。也许是像数据位一样采样的,但是我知道对它的处理方式有所不同。旧的电传打字机需要2个停止位,以便机械机构有时间准备抓取下一个字符。
奥林·拉斯洛普

我提到起跑位三遍了,不是吗?
JustJeff 2011年

@OlinLathrop:保证发送其MSB是一个字节时零将有需要的停止位下一个起始位的下降沿。在数据线低于预期的情况下,不同的设备的行为会有所不同,但是,如果没有停止位,则传输的零字节序列将不包含有用的时序信息。这样的要求可以通过固定框架开销不到25%的其他方法来满足,但是我不知道有人这样做。
2013年

1

尚未提及的一点是,某些设备希望针对接收到的每个字节的数据发送一个字节的数据。如果这样的设备连续地馈送数据,其波特率甚至比发送设备的波特率还要慢0.1%,并且它没有发送微缩的停止位的功能,则其输出将每连续1000个字节落后一个字节如果设备限制为16个字节的缓冲,则在传递大约16,000个字节后它将丢弃一个字节的数据,此后每千个字节将丢弃大约一个字节。值得注意的是,正是由于这个原因,所谓的“ 1200波特”调制解调器实际上以略高于1200位/秒(我认为大约为1202)的速率运行(即使发送器的速度比实际速度快0.15%)是,

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.