DSPc55x锁相环初始化程序的理解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

锁相环初始化程序的理解

1、ioport关键字用于对I/O空间进行寻址

2、dsp_lk=12

3、phase locked的意思是相位同步的意思;锁相技术:对于接收到的信号,仿制一个时钟信

号,使得这两个信号从某种角度来看是同步的(或者说,相干的)。

4、PLL init()函数的理解

#include "5509.h"

#include "util.h"

DSPCLK dspclk;

void PLL_Init(int freq)

{

int i;

DSPCLK dspclk; //这是一个结构体类型,在#include "util.h"文件中有DSPCLK的定义

ioport unsigned int *clkmd;

ioport unsigned int *sysr;

clkmd=(unsigned int *)0x1c00; //时钟产生寄存器CLKMD的地址是0x1C00

sysr=(unsigned int *)0x07fd; //这个寄存器用于控制某些特定设备的功能,它的地址为0x7fd

// Calculate PLL multiplier values (only integral multiples now)

dspclk.clkin = DSP_CLKIN; //dspclk_clkin=12

dspclk.pllmult = (freq *2)/ dspclk.clkin; //pllmult=freq*2/12关于这个问题

//因此freq=pllmult*12/2,此时我们可以对照发现PLL DIV 默认值为1,而input frequency在util.h文件中给出值为12,但为什么一开始PLL DIV=1呢?下面这张图是spru317g的关于Reset Values of CLKMD Bits and The Effects,我们看到PLL DIV初始值是00,难道是和sysr寄存器中的CLK DIV有关?可sprs205文档中并未说明CLK DIV究竟复位后值为几。

但看下面的代码可知,PLL DIV是被置1的。刚刚所看的文件是DSP被复位后的初始值,而PLL DIV=1是此函数PLL_Init(int freq)的设置值,所以PLL DIV被认为是1 if(dspclk.pllmult>= 32)dspclk.pllmult=31;

//如果倍频值超过最大的31,则将其视为31倍频

// Turn the PLL off使PLL处于旁路模式

*clkmd &= ~0x10; //pll enable = 0;旁路模式,就是PLL通过BYPASS DIV对输入信号进行分频

for(i=*clkmd&1; i!= 0 ;i=*clkmd&1); //查询clkmd的LOCK位,如果为1,PLL 工作于锁定模式,则继续等待,直到LOCK=0,PLL被旁路,

// 初始化锁相环的一些标识位

*clkmd &= ~0x4000; // iai=0;确定锁相环是否重新锁相当时钟发生器退出闲置模式时,此设置使用上一次的参数设置

*clkmd |= 0x2000; // iob=1;自动切换到旁路模式,重新开始跟踪锁定后,又自动切换到锁定模式

// 设置乘法器/除法器

// WriteMask(pCMOD -> clkmd,

// CLKMD_PLLDIV_1 | CLKMD_BYPASSDIV_1,

// CLKMD_PLLDIV_MASK | CLKMD_BYPASSDIV_MASK);

*clkmd &= ~0xc; //使得2、3位BYPASS DIV=00,1分频

*clkmd |= 4; //使得2位置1 , BYPASS DIV=01

*clkmd &= ~0x60; //使得5、6位置0

*clkmd |= 0x20; //第5位置1,PLL DIV=01

//WriteField(pCMOD -> clkmd, dspclk.pllmult, CLKMD_PLLMULT_MASK);

*clkmd &= ~0x0f80; //第7~11位置0,PLL MULT=0

*clkmd |= dspclk.pllmult<<7; //因为PLL MULT是7~11位,dspclk.pllmult所以左移7位

// 打开锁相环

*clkmd|=0x10; //PLL ENABLE=1

for(i=0;i<10;i++); //等待锁定模式,在相位锁定的过程中,时钟发生器仍处于旁路模式

for(i=*clkmd&1; i!= 1 ;i=*clkmd&1); //查询clkmd的LOCK位,如果为0,PLL被旁路,则继续等待,直到LOCK=1,PLL处于锁定模式

*sysr=2; // CLKOUT等于CPU时钟除以4

}

PLL锁相环就是将时钟发生器的信号进行分频倍频的处理以供CPU工作,PLL模式与旁路模式是两种分倍频的工作模式,通过各自的标志位进行相应的分频倍频计算。并且,由于pll的锁相需要同步,因此是需要一定的等待时间,此时便仍处于BYPASS模式。

另外SYSR寄存器只是对CLKOUT这个引脚的输出信号进行设定,将CPU时钟信号通过sysr的低三位决定CLKDIV进行分频最终输出,而CPU时钟信号并未改变,因此并不影响pll的编程

相关文档
最新文档