论坛

HC12上的PLL出现问题

开始于 克里斯 2011年9月14日
没有理由插入任何延迟。我相信你的问题是你
在每次循环迭代时重新初始化SYNR和REFDV。这是错误的,您不允许
PLL在初始化循环中正常运行。

爱德华

- - - 原始信息 - - -
来自:“克里斯”
至:<6...>
发送:2011年9月28日,星期三,7:11 PM
主题:[68HC12]回复:HC12上的PLL出现故障-续
>感谢大家的评论。
>
>我的PLL现在工作良好-我可以确定它已正确锁定
>...我不得不使用Darci的建议和大约600个时钟周期的延迟
>我的每个延迟循环都会确保数据正确。这意味着更大的循环
>我发布的原始代码中的值。没有建议的代码段
>在网上在那里做对吧!它们都有大约5个时钟延迟
>在假设寄存器状态数据为
> read is correct.
>
>正如布鲁斯在下面提到的,使用中断而不是延迟循环
>会再次成为更好的方法;只要有足够的时间
>在允许的中断事件之间。
>
>---在6 ...中,《布鲁斯·安布雷》写道:
>>
>> Hi All,
>>我一直使用锁定中断来切换到使用PLL
>>公交车时钟。首选使用Lock中断,并允许MCU执行以下操作:
>>在等待PLL初始化的同时处理更多的启动代码。
>>在锁定中断例程中,我在切换之前检查跟踪位
>>总线时钟移至PLL。我从来没有一个实例
>>PLL初始化失败。
>>
>> Bruce
>>
>> From: 克里斯
>>发送:2011年9月22日,星期四,下午1:14
>> 至:6 ...
>>主题:[68HC12]回复:HC12上的PLL出现故障-续
>>感谢您的参考Darci。
>>
>>您的EB640实际上是我检查“ TRACK”或“ TRACK”的“灵感”
>>处于锁定范围内,而不是锁定。那合适吗
>>覆盖看不到LOCK信号的情况?
>>
>>另外,我想你的意思是我的麻烦是由于不等待而引起的
>>我的延迟LOOP#1中有127个时钟周期,对吗?暗示是我的
>>第一个延迟循环应该更长一些,以确保有时间
>>获得有意义的信号输出。
>>
>>另外,由于LOCK和TRACK每隔多个周期只会更新一次,因此
>>LOOP#2重复检查这些信号的速度应该放慢
>>允许每次检查之间进行300次循环。
>>
>>这些概念正确吗?
>>
>>---在mailto:68HC12%40yahoogroups.com中,“ dleatmot”写道:
>> >
>> >抱歉,我忘记为那些讨厌我们的搜索引擎的人提供链接。
>> >
>> > http://cache.freescale.com/files/microcontrollers/doc/eng_bulletin/EB640.pdf?fpsp=1&WT_TYPE=Engineering
>> > Bulletins&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET =文档
>> >
>> >---在mailto:68HC12%40yahoogroups.com中,“ dleatmot”写道:
>> > >
>> > >
>> > >您可能想阅读我做大约7年的工程公告
>> > >在EB640之前,我认为这将向您说明发生了什么。
>> > >
>> > > Regards,
>> > > Darci
>> > >
>> > >---在mailto:68HC12%40yahoogroups.com中,“克里斯”写道:
>> > > >
>> > > >您好;现在我认为我的PLL设置问题已经阐明,
>> > > >虽然我有解决方法,但为何有效,这使我不知所措。
>> > > >
>> > > >在下面的代码中,有两个延迟循环,以确保锁定和锁定
>> > > >轨道钻头有时间改变和稳定,以确保锁定良好
>> > > >在将PLL用作系统时钟源之前。告诉之后
>> > > >PLL打开,如果我仅使用第二个延迟环路,则不会
>> > > >足够;但包括第一个延迟循环,只需要通过一次
>> > > >通过循环以确保我们在经过
>> > > >第二个延迟循环。如果锁定和第二个循环扩展了其延迟
>> > > >轨道没有打开,所以它的延迟应该是所有
>> > > >需要。我在这里想念什么?任何帮助,将不胜感激。
>> > > >
>> > > >请原谅下面冗长的代码;其调试输出显示
>> > > >每个点的时钟系统状态。
>> > > >
>> > > >无效Set_PLL_Clock(uint8_t SYNR_val,uint8_t REFDV_val)
>> > > > {
>> > > >uint8_t StatusPLLFlags8; //用于调试读取的局部变量
>> > > >时钟状态寄存器
>> > > >// uint8_t StatusPLLSetup8; //在globals.h中
>> > > >StatusPLLFlags8 = CRGFLG; //高于时CRGFLG为5C / 1C十六进制
>> > > >语句已执行
>> > > >//因此PwrOnResetFlg为开/关; LOCKhangeInterruptFlag; LOCK和
>> > > >TRACK已设置;关闭SCM,以便使用Xtal。
>> > > >StatusPLLFlags8 = CLKSEL; // CLKSEL为00十六进制,因此PLL不是
>> > > > clock source.
>> > > >//确保未使用PLL否则无法写入SYNR,或者
>> > > >PLLCTL中的REFDV或PLLON
>> > > >ClrBit(CLKSEL,PLLWAI); //如果为0,则PLL在等待模式下运行;和
>> > > >允许写入AUTO位
>> > > >StatusPLLFlags8 = CLKSEL; //用于调试
>> > > >ClrBit(CLKSEL,PLLSEL); //如果PLLSEL设置为0,则导出时钟
>> > > > from the OSCCLK
>> > > >StatusPLLFlags8 = CLKSEL; // CLKSEL是十六进制的00,因此PLL不是
>> > > > clock source.
>> > > >StatusPLLFlags8 = CRGFLG; // CRGFLG在上面时为5C / 1C十六进制
>> > > >语句已执行,因此PwrOnResetFlg为开/关,并且;
>> > > >设置了LOCKhangeInterruptFlag和LOCK和TRACK; SCM不在
>> > > >Xtal正在使用中。
>> > > >CRGFLG = 0xFF; //通过向其写入1来清除所有标志
>> > > >StatusPLLFlags8 = CRGFLG; // CRGFLG为0C十六进制,因此TRI PWRON TRACK
>> > > >中断标志关闭; LOCK,TRACK仍设置,SCM关闭
>> > > >// PLLCLK = 2 * OSCCLK * [(SYNR + 1)/(REFDIV +1)]
>> > > >//例如,对于PLLCLK = 40MHz,PLLCLK = 2 * 16MHz * 20/16
>> > > >SYNR = SYNR_val; // 17为44.3077MHz PLL;初始化LOCK和
>> > > > TRACK flags
>> > > >REFDV = REFDV_val; // 12为44.3077MHz PLL
>> > > >// ####在PLLCTL = 0b01110000下面从下往下移动
>> > > >因为必须打开PLL并稍等片刻
>> > > >//才可以进入“ LOCK”状态! AND ...需要延迟
>> > > > for the PLL since
>> > > >//刚打开后,它可能会认为它在锁定时处于锁定状态
>> > > > really does not.
>> > > >//这里有下面一行,并且只需要进行一次测试
>> > > >循环1退出之前的条件,
>> > > >//最后在〜22MHz Eclock处锁定良好。也与下面的行
>> > > >放在Loop#1和Loop#2之间,
>> > > >// AND在导致延迟的行后加上一个断点,
>> > > >22MHz时钟。但是,没有断点
>> > > >//延迟,Loop#2将快速执行并以PLL NOT退出
>> > > >锁定和8MHz时钟。为什么是
>> > > >// Loop#2延迟不足以确保良好的锁定,而只有一个
>> > > >通过循环#1,即最小的延迟,工作正常吗?
>> > > >//注意Loop#2寻找要设置的Track或Lock;飞思卡尔应用
>> > > >请注意,锁定位不可靠,无法进行快速锁定
>> > > > overshoot.
>> > > >PLLCTL = 0b01110000; // PLLCTL:
>> > > >CME = 0,PLLON = 1,AUTO = 1,ACQ = 1,xx = 0,PRE = 0,PCE = 0,SCME = 0
>> > > >// LOOP#1;拖延参见勘误表MUCTS00174(掩码集0K36N
>> > > >只要;典型口罩在这里是1L59W)
>> > > >//在设置完上述寄存器后,将LOCK信号保持为高电平,用于
>> > > > about 10 cycles.
>> > > >StatusPLLSetup8 = 0; //初始化计数器以获得良好的锁定/跟踪
>> > > > reads
>> > > > do
>> > > > {
>> > > >StatusPLLFlags8 = SYNR; // SYNR为11进制,即17
>> > > >StatusPLLFlags8 = REFDV; // REFDV为0C十六进制,即12
>> > > >StatusPLLFlags8 = CLKSEL; // CLKSEL为00十六进制,因此PLL未开启;
>> > > >StatusPLLFlags8 = CRGFLG; // CRGFLG为1C,因此设置了LOCK,TRACK和
>> > > >LOCK中断标志LOCKIF开启
>> > > >如果((StatusPLLFlags8&BIT3)== 0)//如果LOCK为零
>> > > > {
>> > > >StatusPLLSetup8 = 0x4F; //现在可以退出此循环;典型值发生在
>> > > > first loop!
>> > > > }
>> > > >StatusPLLFlags8 = PLLCTL; // PLLCTL为F1,因此ClockMonitorEnable,
>> > > >PLLON,AUTO,ACQ,SelfClockMode启用
>> > > >StatusPLLSetup8 = StatusPLLSetup8 + 1;
>> > > >CRGFLG = 0; //写入对此标志寄存器无效
>> > > > }
>> > > >而(StatusPLLSetup8<0x50); //延迟16倍5;需要一个
>> > > >锁定和跟踪的延迟真的很长吗?见上面的出口;不,我们
>> > > > don't.
>> > > >StatusPLLFlags8 = CRGFLG; // CRGFLG为5C十六进制,因此PwrOnResetFlg,
>> > > >LOCKchangeInterruptFlag,LOCK,TRACK置位; SCM关闭,所以Xtal是
>> > > > being used.
>> > > >// LOOP#2;这是放置PLLON命令的位置;但它
>> > > >在这里没有工作;往上看。
>> > > >StatusPLLSetup8 = 0x51; //
>> > > > do
>> > > > {
>> > > >StatusPLLSetup8 = StatusPLLSetup8 + 1;
>> > > >StatusPLLFlags8 = SYNR; // SYNR为11进制
>> > > >StatusPLLFlags8 = REFDV; // REFDV为0C十六进制
>> > > >StatusPLLFlags8 = CLKSEL; // CLKSEL是十六进制的00,因此PLL不是
>> > > > clock source.
>> > > >StatusPLLFlags8 = PLLCTL; // PLLCTL为70,因此SCME关闭且处于顶部
>> > > >字节是0x0111,所以就像上面的编程
>> > > >StatusPLLFlags8 = CRGFLG; // CRGFLG为1C,因此设置了LOCK,TRACK和
>> > > >LOCK中断标志LOCKIF开启
>> > > >//对于非锁定条件,要求锁定和跟踪都为零
>> > > > if ( ((CRGFLG & TRACK) == 0) && ((CRGFLG & LOCK) == 0) )
>> > > >StatusPLLSetup8 = 0x51;
>> > > > }
>> > > >而(StatusPLLSetup8<0x60); //必须至少读取“已锁定” 16
>> > > > consecutive times
>> > > >SetBit(CLKSEL,PLLSEL); //选择跟踪或跟踪时的PLL时钟
>> > > > locked.
>> > > >StatusPLLFlags8 = CLKSEL; // CLKSEL为80十六进制,因此PLL开启;和所有
>> > > >等待和停止位关闭。
>> > > >StatusPLLFlags8 = PLLCTL; // PLLCTL为70,因此CME已关闭,但PLLON
>> > > > AUTO, ACQ are on
>> > > >StatusPLLFlags8 = CRGFLG;
>> > > >} // Set_PLL_Clock的结尾
>> > > >
>> > >
>> >
>>
>>
>>
>
克里斯,你好

多年来,我一直在启动时使用此简单代码来启用PLL
24 Mhz(16 Mhz xtal)的BUSCLK完全没有问题:

SYNR = 2; / * BUSCLK = OSCCLK *(SYNR + 1)/(REFDV + 1)* /
REFDV = 1; / * 16兆赫*(2 + 1)/(1 + 1)= 24兆赫* /
PLLON = 1; / *启用PLL * /
对于(i = 0; i<30000; i ++){} / *延迟一些时间...(45 ms)* /
while(LOCK == 0){} / *等待PLL锁定条件* /
PLLSEL = 1; / *将时钟源切换到PLLCLK * /

最好的祝福,
吉列尔莫。
El 28/09/2011 15:02,Edward Karpicz escribi
>
>没有理由插入任何延迟。我相信你的问题是你
>在每次循环迭代时重新初始化SYNR和REFDV。这是错误的,你没有
> allow
>PLL在初始化循环中正常运行。
>
> 爱德华
>
> - - - 原始信息 - - -
> 来自:“克里斯” >
> 至:<6...









































































&WT_TYPE



&WT_VENDOR&WT_FILE_FORMAT&WT_ASSET













































































































&










<
























&&&&


<




























感谢Guillermo提供以下代码;爱德华和你的意见。

我认为,根据我在 过去几周试图解决PLL难题。还有爱德华,如果你看 在我的代码中,您将看到我只在顶部设置了除法器和乘法器一次; 他们绝对不是一个循环。

即使使用错误的代码,PLL也可以工作并不奇怪-多年来我一直 使用错误的代码,它工作得很好!当我看网络时问题就来了 下面的例子,并试图吸收掩码错误 早期面罩的信息以及Darci的Motorola中的信息 关于PLL延迟的工程公告EB640。然后我开始明白我的想法 不合逻辑的结果;我将获得锁定,并且似乎已切换到 PLL实际上是时钟源,而实际上我没有,并且仍在8MHz的ECLK上 (使用我的16MHz Xtal),并且此性能似乎取决于重置类型 signal I was using.

因此,我在飞思卡尔上与Darci进行了沟通,首先是在论坛上 然后直接,慢慢地我意识到我没有正确阅读并 了解他的EB640。当他声明基准分频器定时总是更多时 超过100个周期,则表示LOCK,TRACK或AUTO状态都没有 信号更新的速度要快于此。因此可能存在故障或已知 设置寄存器的掩码错误,使LOCK处于打开状态。这个信号没有意义 但是,直到您再次查看为止,再说200个周期。如果你想成为 对其进行适当彻底的检查,并遵循在线仿真器的建议 网路上的人,您会检查LOCK是否持续显示600 或1000个周期。因此,下面的代码在第一次看到 LOCK信号不足以确保在已知情况下可靠运行 state.

此外,由于LOCK并不是可靠的锁定指示,(如Motorola所指出 在某些情况下,即使您处于锁定状态,锁定也可能永远不会继续进行 错误),我正在寻找TRACK或LOCK信号(实际上,TRACK是等效的 以查看AUTO状态信号)来告诉我是否处于锁定状态。

因此总而言之,虽然代码可以产生良好的PLL操作,但仍然违反了 规则,如果您需要确定PLL操作,则必须等待足够长的时间才能 获得对您所做的任何更改的有效系统响应。对于PLL信号 例如LOCK和TRACK,此等待时间约为200个周期。避免思考 当您的PLL系统欠佳时,您就被锁定了,您必须看到几个 连续有效的TRACK信号之前,您可以确保正确锁定,并且 因此,您必须等待大约1000个周期,然后您才能看到持续的时间 验证锁。

显然,工业/汽车领域的系统都可以正确地做到这一点。的 不幸的是,网络示例中没有适当编码的良好示例。

---在6 ...中,“ 吉列尔莫·莫利纳”写道:
>
> 克里斯,你好
>
>多年来,我一直在启动时使用此简单代码来启用PLL
>24 Mhz(16 Mhz xtal)的BUSCLK完全没有问题:
>
>SYNR = 2; / * BUSCLK = OSCCLK *(SYNR + 1)/(REFDV + 1)* /
>REFDV = 1; / * 16兆赫*(2 + 1)/(1 + 1)= 24兆赫* /
>PLLON = 1; / *启用PLL * /
> 对于(i = 0; i<30000; i ++){} / *延迟一些时间...(45 ms)* /
>while(LOCK == 0){} / *等待PLL锁定条件* /
>PLLSEL = 1; / *将时钟源切换到PLLCLK * /
>
> 最好的祝福,
> 吉列尔莫。
>
>
>El 28/09/2011 15:02,Edward Karpicz escribi
> >
> >没有理由插入任何延迟。我相信你的问题是你
> >在每次循环迭代时重新初始化SYNR和REFDV。这是错误的,你没有
> > allow
> >PLL在初始化循环中正常运行。
> >
> > 爱德华
> >
> > - - - 原始信息 - - -
> > 来自:“克里斯” >
> > 至:<6...









































































&WT_TYPE



&WT_VENDOR&WT_FILE_FORMAT&WT_ASSET













































































































&










<
























&&&&


<




























克里斯,

是的,很抱歉,您的代码未在循环中设置SYNR / REFDV。发生了什么事
对我来说,可能是我太累了,您声明要插入
延迟循环在我的大脑中触发了“哦,不,这是不好的做法
最好,并在此处添加空循环,在此处添加空循环”。
延误以使更多的成功实践成为可能是有意义的
每次MCU复位仅初始化一次并初始化为PLL时钟。好
实践是基于EMI / ESD可以随时解锁PLL的事实,
因此,您需要具有PLL锁定/解锁中断才能可靠地执行此操作,
将消除任何延迟的需求。如果由于某种原因您不能使用
中断,那么您应该确定需要多少延迟以及如何延迟
它取决于PLL滤波器和振荡器时钟。未知,对不对?所以也许
只需尝试等待LOCK或清除LOCKIF,初始化SYNR和REFDV,然后
等待LOCKIF,然后在您的主循环中检查PLL是否仍处于锁定状态,
必要时重新切换到PLL时钟?即使没有
中断,没有未知的延迟。 BTW是在中指定的那100个周期
数据表?如果没有,并且仅在EB中指定,那么我们为什么要依靠它
并继续浪费MCU周期?自EB以来PLL模块没有变化
看到了不久的光? S12C,S12X上的PLL模块是否没有变化?不带
需要特定的延迟,所有S12 / S12X的PLL代码都相同
最近的S12XE,S12P等。这是我的IMO。

最好的祝福
爱德华

- - - 原始信息 - - -
来自:“克里斯”
至:<6...>
发送:2011年9月29日,星期四,8:25 PM
主题:[68HC12]回复:HC12上的PLL出现故障-续
感谢Guillermo提供以下代码;爱德华和你的意见。

我相信,根据我的经验,你们俩都不正确
过去几周试图解决PLL难题。还有爱德华,如果你
看一下我的代码,您会看到我只设置了除数和乘数
在顶部;他们绝对不是一个循环。

即使有错误的代码,PLL也可以工作并不奇怪-多年来我一直
一直在使用错误的代码,并且效果很好!我看的时候问题就来了
在网络示例(例如下面的示例)中,尝试吸收面具
早期遮罩集的错误信息以及Darci的信息
摩托罗拉工程公告EB640关于PLL延迟。然后我开始看到
我认为是不合逻辑的结果;我会得到锁,似乎
实际上我并没有将PLL转换为时钟源
仍在8MHz的ECLK上(使用我的16MHz Xtal),这种性能似乎
取决于我使用的复位信号的类型。

因此,我在飞思卡尔与Darci进行了交流,首先是在本论坛中
但是然后直接,慢慢地我意识到我没有正确阅读
并了解他的EB640。当他声明参考分频器时序为
总是超过100个周期,这意味着LOCK,TRACK和
AUTO状态信号的更新速度超过此速度。所以可能有一个
毛刺或已知的寄存器设置掩码错误,会导致LOCK锁定。那
信号没有意义,但是直到您再次查看(例如200个周期)
后来。如果您想对其进行适当的彻底了解,请按照
在网络上建议在线仿真人员,您可以检查一下
始终可以看到LOCK 600或1000个周期。因此代码
第一次看到LOCK信号时跳出的下面的效果不好
足以确保在已知状态下可靠运行。

此外,由于LOCK并不是可靠的锁定指示,(例如Motorola
指出,即使您被锁定,LOCK也可能永远不会继续,在某些情况下
低相位误差),我正在寻找TRACK或LOCK信号(实际上是TRACK
等同于查看AUTO状态信号)告诉我是否
是否锁定。

因此总而言之,虽然代码可以产生良好的PLL操作,但仍然违反了
规则,如果您需要确定PLL操作,则必须等待足够长的时间
以获得对您所做的任何更改的有效系统响应。如果是PLL
信号,例如LOCK和TRACK,此等待时间约为200个周期。避免
如果您的锁相环系统欠佳,以为您被锁定了,那么您必须
在确定之前,请先查看几个连续的有效TRACK信号
正确锁定,因此您必须等待大约1000个周期
请参阅不断验证锁。

显然,工业/汽车领域的系统都可以正确地做到这一点。
网上的例子中没有正确编码的好例子,
不幸。

---在6 ...中,“ 吉列尔莫·莫利纳”写道:
>
> 克里斯,你好
>
>多年来,我一直在启动时使用此简单代码来启用PLL
>24 Mhz(16 Mhz xtal)的BUSCLK完全没有问题:
>
>SYNR = 2; / * BUSCLK = OSCCLK *(SYNR + 1)/(REFDV + 1)* /
>REFDV = 1; / * 16兆赫*(2 + 1)/(1 + 1)= 24兆赫* /
>PLLON = 1; / *启用PLL * /
> 对于(i = 0; i<30000; i ++){} / *延迟一些时间...(45 ms)* /
>while(LOCK == 0){} / *等待PLL锁定条件* /
>PLLSEL = 1; / *将时钟源切换到PLLCLK * /
>
> 最好的祝福,
> 吉列尔莫。
>El 28/09/2011 15:02,Edward Karpicz escribi
> >
> >没有理由插入任何延迟。我相信你的问题是
> > you
> >在每次循环迭代时重新初始化SYNR和REFDV。这是错误的,你没有
> > allow
> >PLL在初始化循环中正常运行。
> >
> > 爱德华
> >
> > - - - 原始信息 - - -
> > 来自:“克里斯” >
> > 至:<6...










































































&WT_TYPE



&WT_VENDOR&WT_FILE_FORMAT&WT_ASSET




















































































































&











<


























&&&&


<