在线时间4067 小时
UID3441752
注册时间2017-11-21
NXP金币759444
TA的每日心情 | 开心 2024-3-26 15:16 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 32017
- 最后登录
- 2024-4-9
|
相信很多小伙伴在看到这个题目时,脑海中都会产生一个大大的问号。What?这都什么年代了,手工计算不是有些过时了吗,难道就没有软件工具能自动计算吗?莫急莫急,且听小编娓娓道来。
其实,这篇文章源自于对客户Raser的技术支持。客户需求是这样子的: 外部晶振频率为12MHz, 音频采样频率Fs为48KHz,通过设置PLL和其他时钟分频器令LPC1765 I2S的主机发送时钟TX_MCLK为256Fs,即12.288MHz。
为什么要手工计算
初看这个需求,小编觉得这完全可以使用NXP配置MCU的神器MCUXpresso Config Tools。相信很多小伙伴对MCUXpresso Config Tools非常熟悉。这是一套集成有引脚工具、时钟工具、外设工具等的工具集,可以将引脚、时钟、外设等的配置,转换为C代码。最后,用户可以将工具生成的C代码添加到自己的应用之中。这不仅降低了NXP MCU的使用复杂度,还大大提高了客户产品的开发效率。其中,与时钟配置有关的界面如下图所示。
应该说,如果MCUXpresso Config Tools能够支持LPC1765, 这一切都迎刃而解。然而,截止到2021年7月,MCUXpresso Config Tools尚不支持LPC1765,信息来自于MCUXpresso Supported DevicesTable,链接: https://community.nxp.com/t5/MCU ... -Table/ta-p/1101007。
显然,我们无法借助自动化工具计算时钟参数以达到上述客户需求,唯有通过手工计算。
I2S主机发送时钟TX_MCLK与哪些因素有关
我们可以通过逆推法得到I2S主机发送时钟TX_MCLK与外部12MHz晶振频率的关系,从而确定需要配置哪些参数才能得到12.288MHz的TX_MCLK。
首先,可以从LPC176x/5x参考手册(UM10360)得到TX_MCLK的计算公式,具体如下:
其中X和Y是I2TXRATE寄存器的位域,具体如下:
而PCLK_I2S是I2S外设时钟,其与CPU时钟CCLK的关系由PCLKSEL1寄存器确定,如下图所示。
那么,由此可知I2S外设时钟是由CPU时钟CCLK分频得到。更进一步,CCLK又是如何得到的呢?如下图所示,外部12MHz晶振的频率输入经过Main PLL(PLL0)倍频后再经CPU时钟频率分频器得到CCLK。
根据LPC176x/5x参考手册(UM10360)章节-4.5.10 PLL0 frequency calculation,我们可以得到MainPLL(PLL0)的输出PLLCLK与系统时钟sysclk(这里是外部12MHz晶振输入)的关系如下图所示。
至此,我们知道I2S主机发送时钟TX_MCLK与下列因素有关:
·外部时钟源输入FIN,这里采用12MHz外部晶振
·Main PLL (PLL0)的预分频系数N和乘法器系数M
·CPU时钟CCLK分频系数,这里记作CCLK_DIV
·I2S外设时钟PCLK_I2S分频系数,这里记作PCLK_I2S_DIV, 取值为1,2,4,8
·I2S TX_MCLK速率因子X和Y,Y应当大于或者等于X
如何确定与I2S主机发送时钟TX_MCLK有关的时钟参数
通过上面的分析,可以得到TX_MCLK的计算公式,推导过程如下:
上述公式给出了TX_MCLK与FIN、M、N 、CCLK_DIV、PCLK_I2S_DIV以及X和Y之间的关系。下面确定时钟参数时需要用到这个公式,因此提前列出。
可能有的小伙伴看到这里就会问了,你说这么多还是没说到点子上啊,到底这些时钟参数该如何确定。莫急莫急,请听我慢慢道来。
通过上面的分析,我们知道TX_MCLK来自Main PLL(PLL0)输出FPLLCLK的分频。首先,应当明确,只有找到整数的M和N,使得Main PLL(PLL0)输出FPLLCLK是12.288MHz的整数倍,才能最大程度减少TX_MCLK的频率偏移。有的小伙伴会说,12.288MHz的整数倍频率很多,我怎么知道选择哪一个。其实,如果小伙伴熟悉PLL运行原理和LPC1765 PLL这个IP的话,应当知道,PLL输出FPLLCLK有一个确定的频率范围。利用这个频率范围可以大大简化计算过程。LPC176x/5x参考手册(UM10360)中的章节-4.5.10 PLL0 frequency calculation描述了MainPLL (PLL0) 的输出频率范围。
看这里看这里,是的,您看到了,Main PLL (PLL0)的输出频率范围是275MHz~550MHz。接下来,我们在275MHz~550MHz范围内寻找12.288MHz的整数倍频率,结果如下:
通过上面的分析,Main PLL(PLL0)输出FPLLCLK由如下公式确定:
因此,Main PLL(PLL0)的乘法器系数M和预分频系数N的比值M/N由如下公式确定:
在得到M/N计算公式之后,根据上图所列的FPLLCLK取值,计算得到M/N、M和N的全部取值如下图所示。
到目前为止,我们得到22组M和N的取值。为了进一步缩小范围,我们可以利用PLL特性作为约束条件对这22组数据进行进一步筛选。根据LPC176x/5x参考手册(UM10360),可以得到如下与Main PLL(PLL0)有关的约束条件:
·PLL输入频率FIN的范围是32KHz ~ 50MHz, 这里采用12MHz满足要求。
·CCLK时钟频率FCCLK,对于LPC1769/LPC1759最大是120MHz, 其他LPC17xx系列最大是100MHz
·FPLLCLK频率范围是275 MHz 到550 MHz
·PLL输入频率FIN经过N分频后的输出,即参考频率FREF应当在100KHz到20MHz之间,否则PLL锁定不稳定
·PLL预分频系数N的取值范围是1~32, 乘法器系数M的取值分为higheroscillator frequencies(MHz)和low oscillatorfrequencies(KHz)两种情况, 前者的取值是6到512,后者参考数据表
·较小的 PLL 预分频系数N和乘法器系数M都会导致更好的 PLL 操作稳定性和更低的输出抖动。
通过分析上述约束条件,我们可以得到N的取值在1~32,所以可以过滤掉N为125的
取值情形,结果如下图所示。同时,根据最后一个约束条件,尽可能减少M和N的取值。
最终,我们确定PLL的输出FPLLCLK为307.2MHz, M取值64,N取值为5。该频率是TX_MCLK目标频率12.288MHz的25倍。为了确保FCCLK满足不超过100MHz的条件,CCLK_DIV取值为5,即FCCLK为FPLLCLK的5分频,也就是61.44MHz。又因为与TX_MCLK有关的因子Y应当大于或者等于X,所以Y取值5, X取值2,PCLK_I2S_DIV为1。
最后,对与TX_MCLK有关的时钟参数取值进行总结如下:
上述时钟参数在程序中的设置如下图所示。
测试结果
使用上述时钟参数设置,测量得到的TX_MCLK波形如下图所示。结果表明,实际测量结果与预期一致。
总结
本文以LPC1765为例,经过一系列分析和推导,给出TX_MCLK与Main PLL预分频系数N、乘法器系数M、CPU时钟频率分频系数、I2S外设时钟频率分频系数、TX_MCLK速率因子X和Y的关系公式,并以PLL的正常运行条件作为约束,最终确定相关的时钟参数设置。
本文的意义在于当无法使用自动配置工具计算相关时钟参数时,可以使用本文提供的方法推算相关时钟参数。
本文虽然以LPC1765为例,但是对于其他LPC系列的MCU同样具有借鉴意义。
|
|