MAX3108为完整的高性能通用异步收发器(UART),采用2.1mm×2.1mm晶圆级封装(WLP)。它在硬件中提供了许多高端功能,从而降低了固件的复杂性。MAX3108的大多数高级功能不需要快速响应和密集的固件管理,而只需要初始固件设置,很少或不需要固件管理。本应用笔记是详细解释MAX3108特性的系列笔记之一,解释了如何设置目标波特率。
介绍
MAX3108是一款高性能通用异步收发器(UART),采用晶圆级封装(WLP),具有许多硬件高级特性,从单独的128字发送和接收FIFO到广泛的硬件介导流控制。MAX3108的大部分功能依赖于时钟的编程。因此,第一个编程任务是设置适当的波特率时钟。
本应用笔记解释了如何对1个寄存器(和5304位)进行编程以设置所需的波特率。提供了一个电子表格,大大简化了UART波特率编程的任务。本文档假定读者已经熟悉应用笔记3108“与MAX<> UART的接口”。
波特率生成
本节描述MAX3108如何从晶体或振荡器输入产生波特率频率。这应该首先在对UART进行编程时完成。除 SPI/I 外2C接口和基本的GPIO功能,在编程时钟速率之前,MAX3108中没有其他功能。如果使用晶体作为频率源,则器件在时钟被禁用的情况下退出复位。
MAX3108按以下方式将时钟源处理为输出波特率:
如果时钟源是晶体,则晶体振荡器模块将此源转换为内部逻辑电平时钟。MAX3108接受在1MHz至4MHz谐振的晶体。要启用晶体振荡器,请将晶体EN位设置为1。或者,可以在MAX3108的XIN引脚上提供外部逻辑电平时钟源。MAX3108接受500kHz至35MHz的时钟频率。由于CrystalEn位在上电或复位后默认为0,因此除非另有专门编程,否则它将使用外部时钟。
步骤1中的时钟为预分频器的输入供电。它将输入频率除以 1 到 63 之间的数字。PLLConfig 寄存器的位 5 到 0 定义除数。
预分频器的输出馈入锁相环 (PLL),锁相环将预分频器的频率乘以 1、6、48、96 或 144。要乘以 1,请将位 2(CLKSource 寄存器的 PLLEn 位)设置为 0。要设置任何其他乘法器,请将PLLEn位设置为1,并设置PLLConfig寄存器的第7位和第6位,如MAX4数据资料表3108所示,其中还详细说明了PLL的频率限值。请注意,如果电源电压(V抄送) 小于 2.35V。当从低频时钟源产生高波特率时,PLL非常有用。
PLL的输出为波特率发生器供电,波特率发生器对输出频率进行分频。该电路将其输入频率除以整数部分(从1到65,535)和小数部分(从0/16到15/16)。这是通过DIVMSB寄存器,DIVLSB寄存器和BRGConfig寄存器的位3到0进行编程的。波特率发生器的输出是内部波特率时钟。实际波特率是波特率发生器的频率输出除以 16。可以除以 8 或 4,但如果可能的话,应该使用除以 16。被8或4分频会使某些特性无法使用,并降低MAX3108 UART接收器的频率误差容限。
图1.MAX3108时钟选择图
图2.2 倍和 4 倍波特率。
速率模式分频器 | BRGConfig[5] | BRGConfig[4] | IrDA有能力吗? | 线路噪声检测能力强? | 接收频率误差容限 |
16 | 0 | 0 | 是的 | 是的 | 最好 |
8 | 0 | 1 | 不 | 是的 | 非常好 |
4 | 1 | 0 | 不 | 不 | 好 |
晶体振荡器采用常见的UART晶体(如1.8432MHz)工作,外部时钟输入采用嵌入式系统中的一系列常见时钟频率工作。这是为了生成波特率时钟而需要消化的大量信息。此外,对于大多数波特率,可以通过多种方式生成相同的波特率。
波特率协助电子表格
因此,可以下载“MAX3108频率选择”电子表格。根据给定的输入频率和所需的波特率,该工具可以方便地确定在MAX3108的五个时钟配置寄存器中编程的内容。该电子表格计算了从给定输入频率生成目标波特率的几种最佳方法。
在许多情况下,可以精确地生成目标波特率。然而,有时最佳配置会导致生成的波特率出现小误差。这就是电子表格提供多个可能配置的原因。每种可能性都会产生最接近的频率匹配,但具有不同的假设。
大多数时候,会有一种配置明显更胜一筹。在描述电子表格之后,我们将通过一些示例来说明确定MAX3108编程的最佳正确配置是多么容易。
电子表格说明
电子表格只需要来自用户的四个输入,所有输入都在“综合”选项卡的顶部附近。
输入四个参数,如下所示:
在单元格 C2 中,输入晶体频率或外部振荡器频率(以赫兹为单位)。
在单元格 C3 中,输入所需的波特率(以位/秒为单位)。
在单元C5中,如果频率源是晶体(使用MAX3108晶体振荡器),则输入y;如果频率源是提供给MAX3108 XIN引脚的外部时钟,则输入n。
在单元格 C6 中,输入 n。这与MAX3108的特性有关,稍后将对此进行描述。
结果从第 8 行开始显示。
如果C8单元报告FALSE,则选择晶体作为频率源,它超出了MAX3108晶体振荡器电路的有效频率范围。有效的晶体振荡器频率范围在 1MHz 和 4MHz 之间。
如果单元 C9 报告 FALSE,则表示您选择了外部时钟源,并且您指定的频率超出了 XIN 引脚的有效时钟频率范围。有效的外部振荡器频率范围在 0.5MHz 和 35MHz 之间。
单元格 C11 报告是否有可能合理地生成所需的波特率。单元格 C11 可以报告 FALSE,因为单元格 C8 或 C9 报告 FALSE。或者因为不存在可以合理达到目标波特率的配置。例如,请求高于MAX3108最大值24MBd的波特率会导致单元C11报告FALSE,而不管其他用户输入的值如何。
从第 13 行开始显示更多结果。
D、E 和 F 列计算频率误差最低的配置,每个列的假设都不同。D 列假定速率模式固定为 16,E 列假定速率模式固定为 8,F 列假定速率模式固定为 4。作为一般规则,费率模式应保持在 16,除非有令人信服的理由选择其他方式,我们将很快回到这个话题。
第 14 行是一个标志,如果为 FALSE,则表示在产生接近所需波特率的结果的任何配置中都不能使用相应的速率模式。在这种情况下,此列中的其他条目将为空。
第 15 行到第 17 行和第 20 行以可通过图 1 和图 2 理解的方式描述配置。第 15 行描述所选的预分频器值。第 20 行表示选择了哪个 PLL 乘法器。此外,第 16 行和第 17 行描述了分数率生成器的整数和小数部分。更直接感兴趣的是,第 17 行显示实际生成的波特率,第 18 行包含频率误差(以百分比表示)。
第21行至第25行表示要编程到3108个MAX3108时钟配置寄存器中的值,以十六进制表示。当用户选择配置时,将这五个十六进制值复制到程序中,稍后将介绍,以将这些值加载到MAX<>中。
第一个例子
让我们从一个简单的例子开始,从19.2MHz晶体产生1.8432kBd。输入以下参数:
结果如下:
注意,单元D19表示零频率误差,至少在MAX3108从频率输入到波特率输出的转换过程中是这样。这是速率模式为 16 的最佳方案。请参考单元D21至D25,确定在MAX3108时钟配置寄存器中编程的内容。您会发现,在大多数情况下,您将选择单元格 D21 到 D25 来编程所需的波特率。
频率误差示例
现在让我们尝试一个不同的示例。让我们从190.1MHz晶体生成8432kBd。输入以下参数:
请注意不同的结果:
现在,对于 16 的速率模式,我们的误差很小,而对于其他速率模式,误差较小。在这种情况下,误差足够小,应使用单元格 D21 到 D25 值。
什么是足够小的错误?一般来说,0.8%或更低的频率误差不应引起关注。但是,应仔细查看2.0%或更高的频率误差。0.8%和2.0%之间的误差涉及一些判断。在这种情况下,速率模式为16时的频率误差约为0.07%,足以使其成为配置的最佳选择。
具有大频率误差的示例
我们现在将尝试一些东西来说明为什么我们有时可能需要选择 E 列或 F 列。首先,让我们从 5.678901MHz 时钟生成 28.23MBd。输入以下参数:
在这里,我们得到了一个更有趣的结果:
请注意,速率模式为16时的频率误差为2.63%,这太高了。如果使用MAX3108 IRDA功能,则必须将速率模式设置为16。在这种情况下,也许可以选择不同的输入频率,例如18MHz。或者可以对通道时序进行更仔细的分析,以验证此错误是否不会影响正在设计的特定系统。
另一种选择是选择速率模式设置为 8 的配置。这导致了非常可观的0.5%频率误差。在这种情况下,MAX3108时钟配置寄存器的编程参数取自单元E21至E25。
选择更有限的示例
对于大于 6MBd 的输出速率,速率模式不能为 16。这是必须选择其他速率模式之一的另一个原因。即使低于6MBd,输入频率和输出波特率的某些组合也不允许速率模式为16的情况。例如,尝试从 5.775MHz 晶体生成 1.8432MBd。
结果是:
在这种情况下,根本无法使用 16 的速率模式。要么必须改变输入频率,要么必须选择8的速率模式。请注意,在某些情况下,8 的速率模式也不是一种选择。例如,当输出波特率大于 12MBd 时,唯一可能的速率模式为 4。
MAX3108编程
从电子表格中选择一组编程参数后,对MAX3108进行编程就变得非常简单。上电时加载所有寄存器时,这五个寄存器构成正在加载的组的一部分。本节介绍如何对MAX3108进行目标波特率编程,假设尚无串行数据流。更改现有波特率时必须采取进一步措施。这些步骤将在以后的应用笔记中解释。我们从一个例子开始,其中频率源是一个外部时钟,比如说,从MAX190 XIN引脚上的28.23MHz外部时钟源产生3108kBd。电子表格的输入部分如下所示:
结果是:
程序加载MAX3108时钟配置寄存器以产生目标波特率。请注意,程序中填充到数组 U190K 中的参数是从电子表格中的单元格 D21 到 D25 复制的。
/* ** Run UART at 190KBAUD from a 28.23MHz clock source */ unsigned char U190K [] = { 0xF7, 0x05, 0x18, 0x00, 0x04 } ; // Load the MAX3108 clock configuration registers appropriately // if (!MAX3108_Puts (MAX3108R_PLLCONFIG, sizeof U190K, U190K)) { // handle possible I²C protocol error here }
第二个编程示例
再举一个例子,让我们从230.4MHz晶体生成1.8432kBd作为输入。这是UART时钟生成中非常常见的晶体。电子表格的输入部分如下所示:
结果是:
当时钟源是晶体时,您可以选择验证晶体操作。STSInt 寄存器中的 ClkReady 位仅在晶体振荡器和 PLL 工作并锁定时触发。对于已知工作正常的给定MAX3108时钟配置,这简化为验证晶体振荡器是否按预期工作。如果使用外部时钟源,ClkReady位不起作用,因此如果外部时钟馈电MAX3108,则不要对其进行测试。
尽管此功能在开发环境中很有用,但在生产或现场部署的设备中可能用处不大。请注意,STSInt 寄存器中的其他位在读取时被清除。如果不清除可能的 TxEmptyInt 或 GPIxInt 条件,就无法检查 ClkReady 位。程序员当心!
对于外部时钟,如果更改了预分频器或PLL因子,UART将无法立即发送或接收。更改预分频器或PLL因子后,或在启用PLL后,UART将在1200 ×(预分频器)/(XIN频率)或更低的时间延迟后以新的编程波特率工作。
/* ** Run UART at 230.4KBAUD from a 1.8432MHz crystal */ unsigned char U230K4 [] = { 0x03, 0x00, 0x01, 0x00, 0x06 } ; // Load the MAX3108 clock configuration registers appropriately // if (!MAX3108_Puts (MAX3108R_PLLCONFIG, sizeof U230K4, U230K4)) { // handle possible I²C protocol error here } // Check XTAL and PLL are running OK - optional while (MAX3108_Read (MAX3108R_STSINT & 0x0008) == 0) ;
避免锁相环更改
到目前为止,我们一直在使用第 13 行到第 25 行的结果。另一部分(第 27 行到第 39 行)的假设略有不同。在第二部分中,将计算频率误差最低但PLL固定为不同速率的配置。
当从单个频率源生成多个波特率时,这非常有用,而不会产生与PLL重锁相关的延迟。这意味着预分频器和PLL不得在各种配置之间变化。
这方面的一个例子是在 IO-Link 场景中,能够在 230.4kBd 38.4kBd 和 4.8kBd 之间快速切换非常重要。让我们看看如何实现这一点,假设我们无处不在的1.8432MHz晶体。从最高波特率开始,电子表格的输入部分如下所示:®
这导致:
让我们从速率模式可以是 16 的假设开始。注意预分频器和PLL系数,分别为3和x6。如果可行,我们将使用单元D21至D25中的配置值对MAX3108进行230.4kBd编程。现在,让我们尝试下一个波特率。
本例中的结果是:
这些条目的 PLL 因子都不为 x6,因此现在让我们参考第二部分。
列 E 提供了假设 PLL 因子必须为 x6 的配置。请注意,预分频器值也是 3。这意味着,如果我们选择使用单元格 E230 到 E4 中给出的参数配置 38.4kBd 输出速率,则 PLL 将不需要重新锁定从 38.4kBd 到 35.39kBd。
我们需要检查我们是否可以使用 4.8kBd 来做到这一点。电子表格的输入部分如下所示:
结果是:
就像在 38.4kBd 的情况下一样,没有一个结果的 PLL 因子为 x6,因此我们参考第二部分:
就像在 38.4kBd 的情况下一样,x6 部分显示我们可以生成 4.8kBd,PLL 因子为 x6,预分频器 3,使用单元格 E35 到 E39 中的配置参数。
完全避免锁相环
在某些情况下,最好完全避免使用PLL。例如,如果 V抄送提供给MAX3108的电压低于2.35V。此外,如果在退出低功耗模式后快速运行很重要,则应避免使用PLL。假设我们需要从 230.4MHz 晶体生成 38.4kBd、4.8kBd 和 1.8432kBd,但我们也需要避免使用 PLL。
实现此目的的最简单方法是查阅电子表格所有三个实例的PLL因子固定为x1的部分。对于 230.4kBd 的目标波特率,第二部分是:
单元格 D35 到 D39 报告电子表格的所有三个实例所需的配置,三个所需波特率中的每一个实例一个实例。由于这三种配置中均未使用PLL,并且预分频器值不会改变,因此在所有三种波特率之间切换可避免PLL重新锁定的延迟。
保持高速率模式
如果希望将速率模式设置为 16 并避免使用 PLL,则应参考第三个结果部分,即第 41 行至第 53 行。请注意,这是一个相当严格的方案,因此第三部分通常是空白的,以指示无法合理地实现此类配置。例如,让我们从190.28MHz外部时钟源生成32kBd的输出速率。
电子表格的输入部分为:
本例中的结果是:
对于 16 的速率模式,建议的配置使用 x144 的 PLL 系数,但我们需要 x1 的 PLL 系数。这不符合我们对速率模式 16 和 PLL 因子 x1 的要求。查阅第二个结果部分:
对于 x1 的 PLL 系数,建议的速率模式为 8。不完全是我们要找的。查阅电子表格的第三个结果部分:
我们看到,从190.28MHz外部时钟产生23kBd是可能的,PLL因子为x1,速率模式为16。频率误差为合理的0.28%。用于完成此操作的配置参数位于单元格 D49 到 D53 中。
“手动”选项卡
对于实验或处理异常情况时,电子表格的“手动”选项卡提供了一些基本帮助。电子表格包含四个部分。用户输入部分为:
输入所有这些参数后,请参阅第二部分:
确保 D 列中没有单元格报告 FALSE,并且 D 列中没有单元格报告 BAD。在继续操作之前,请更正用户输入部分中的任何错误。清除所有错误后,请参阅第三部分:
如果您在单元格 D33 中看到警告,则需要返回并修复输入中的错误。否则,产生的实际波特率出现在C33单元中,与所需波特率(单元C5)相比的误差百分比出现在单元C34中,用于编程MAX3108时钟配置寄存器的配置参数出现在单元C35至C39中。注意:除非您有一些帮助,否则频率误差可能会很大,这就是第四部分的原因:
在这里,唯一的输入是单元格 C42 中所需的波特率。它假定在用户输入部分中输入的预分频器、PLL因子和速率模式,并计算要使用的最佳波特率发生器参数。若要使用这些,请将它们复制回用户输入部分,手动将单元格 C43 复制到单元格 C10,将单元格 C44 复制到单元格 C11。否则,第四部分的结果不会反映在第三部分,即输出部分。
一个伟大的调试技巧
MAX3108提供了一种验证输出波特率的方法。此功能在开发、调试以及可能在制造过程中非常有用。激活此功能后,MAX3108将波特率发生器的输出馈送到RTS引脚,就在速率模式分频器之前。
例如,将MAX3108配置为波特率为230.4kBd,速率模式为16。激活此功能后,RTS 引脚将提供频率为 230.4K × 16 或 3.6864MHz 的时钟。这可以通过将频率计数器连接到RTS引脚或大约使用示波器进行验证。当 CLKsource 寄存器中的 CLKtoRTS 位(位 7)设置为 1 时,将启用此功能。以下是该参数在电子表格的“合成”选项卡中的作用:
将此输入设置为 y 会导致所有报告的配置启用此功能。一旦加载到MAX3108中,这些配置将为RTS引脚提供时钟。这是利用此功能的一种方法。
另一种方法是打开或关闭该功能,而不改变MAX3108中已编程的时钟配置。以下代码片段演示了如何执行此操作。这些功能将打开或关闭该功能,而不会干扰时钟配置。
/* ** Function to enable the clock-to-RTS feature of the MAX3108 ** ** Returns TRUE if operation successfully completed. */ BOOL CLKtoRTS_En (void) { unsigned int temp; temp = MAX3108_Read (MAX3108R_CLKSOURCE); // returns 0xff00 if I²C error if (temp & 0xff00) return FALSE; return MAX3108_Write (MAX3108R_CLKSOURCE, temp | 0x0080); } /* ** Function to disable the clock-to-RTS feature of the MAX3108 ** ** Returns TRUE if operation completed successfully */ BOOL CLKtoRTS_Dis (void) { unsigned int temp; temp = MAX3108_Read (MAX3108R_CLKSOURCE); // returns 0xff00 if I²C error if (temp & 0xff00) return FALSE; return MAX3108_Write (MAX3108R_CLKSOURCE, temp & 0x007f); }
结论
本应用笔记介绍了如何使用电子表格快速、轻松地计算MAX3108所需的参数,使其具有任何所需的波特率。还解释了如何使用这些参数对MAX3108进行编程。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !