ADI锁相环LTC6946-2使用(3-基于SPI的寄存器配置)

要完成锁相环的寄存器配置,需要对照协议将锁相环的每一个寄存器所要实现的功能分析清除。从大的方面来讲,寄存器分为系统信息及状态查询型寄存器、功能型寄存器、性能型寄存器,其中第一种寄存器多为只读寄存器,后两种多为读写型寄存器。三种寄存器中功能型寄存器最为重要,功能型寄存器配置正确了,系统的输出就基本上没有什么大的问题了,性能型寄存器只是在当前功能上实现性能的优化,而系统状态寄存器通常用于判断当前锁相环的工作状态。
首先从LTC6946手册中找到寄存器介绍的章节,详细阅读每一个寄存器的介绍后发现,真正需要配置的只有寄存器2~A,寄存器0是锁相环状态寄存器,寄存器1是用来对寄存器0的状态进行掩码处理,可以不用关心,而寄存器B是系统信息寄存器,也可以忽略。
在这里插入图片描述
在这里插入图片描述

这里我不再详细分析每一个寄存器的每一个bit的作用,我只根据程序配置对我们实际用到的bit位做重点介绍,配置程序如下,其中调用的函数可以在上一章的SPI讲解中找到:

/**
*  函 数:  LTC6946FreqConfig()
*  功 能:  锁相环输出时钟频率和功率配置
*  作 者:
*  日 志:  函数创建
*/
void LTC6946FreqConfig(uint8_t freq)
{
	uint8_t val = 0;
	uint8_t reg = 0;
	uint8_t valBuf[] = {0x58, 0x5A, 0x5C};
	
	/*配置寄存器2, PDREFO-1 OMUTE-1*/
	reg = 0x0A;
	SpiUpdateRegist(SPI_REG_2_ADDR, reg);	
	val = SpiReadRegist(SPI_REG_2_ADDR);
	if (val != reg)
	{
		printf("< register 2 config error!\n");
	}
	
	/*配置寄存器2, PDREFO-1 OMUTE-1*/
	reg = 0x24;
	SpiUpdateRegist(SPI_REG_1_ADDR, reg);	
	val = SpiReadRegist(SPI_REG_1_ADDR);
	if (val != reg)
	{
		printf("< register 1 config error!\n");
	}
	
	/*配置寄存器3*/
	reg = 0x00;
	SpiUpdateRegist(SPI_REG_3_ADDR, reg);
	val = SpiReadRegist(SPI_REG_3_ADDR);
	if (val != reg)
	{
		printf("< register 3 config error!\n");
	}
	
	/*配置寄存器4 R-25*/
	reg = 0x19;
	SpiUpdateRegist(SPI_REG_4_ADDR, reg);
	val = SpiReadRegist(SPI_REG_4_ADDR);
	if (val != reg)
	{
		printf("< register 4 config error!\n");
	}
	
	/*配置寄存器5 N-H07*/
	reg = 0x07;
	SpiUpdateRegist(SPI_REG_5_ADDR, reg);
	val = SpiReadRegist(SPI_REG_5_ADDR);
	if (val != reg)
	{
		printf("< register 5 config error!\n");
	}
	
	/*配置寄存器6 N-L8bit*/
	reg = valBuf[freq];
	SpiUpdateRegist(SPI_REG_6_ADDR, reg);
	val = SpiReadRegist(SPI_REG_6_ADDR);
	if (val != reg)
	{
		printf("< register 6 config error!\n");
	}
	
	/*配置寄存器7,开始输出校准*/
	reg = 0x03;//0x63;
	SpiUpdateRegist(SPI_REG_7_ADDR, reg);
	val = SpiReadRegist(SPI_REG_7_ADDR);
	if (val != (reg & 0xFD))
	{
		printf("< register 7 config error!\n");
	}
	
	/*配置寄存器8,BST-1 FILT-1 OD-1*/
	reg = 0xA9; 
	SpiUpdateRegist(SPI_REG_8_ADDR, reg);
	val = SpiReadRegist(SPI_REG_8_ADDR);
	if (val != reg)
	{
		printf("< register 8 config error!\n");
	}
	
	/*配置寄存器9,LKWIN-1(2MHz) LKCNT-1(128)采用1/15的步长因子, CP-B(5.6mA)*/
	reg = 0x59; 
	SpiUpdateRegist(SPI_REG_9_ADDR, reg);
	val = SpiReadRegist(SPI_REG_9_ADDR);
	if (val != reg)
	{
		printf("< register 9 config error!\n");
	}
	
	/*配置寄存器A,CPCHI-1 CPCLO-1*/
	reg = 0xC0; 
	SpiUpdateRegist(SPI_REG_A_ADDR, reg);
	val = SpiReadRegist(SPI_REG_A_ADDR);
	if (val != reg)
	{
		printf("< register A config error!\n");
	}
	
	/*配置寄存器2, OMUTE = 0*/
	reg = 0x08;
	SpiUpdateRegist(SPI_REG_2_ADDR, reg);	
	val = SpiReadRegist(SPI_REG_2_ADDR);
	if (val != reg)
	{
		printf("< register 2 config error!\n");
	}
	
	printf("< LTC6946-2 register config complete, wait for locked!\r\n");
	
	val = 0;
	while (!val)
	{
		val = SpiReadRegist(SPI_REG_0_ADDR);
		val = (val >> 2) & 0x01;
	}
	
	gRfLocked = 1; /*指示频点已经配置完成*/
	
	printf("< LTC6946-2 PLL locked!\r\n");
}

寄存器的配置顺序是2-3-4-5-6-7-8-9-A-2,每一个寄存器的配置值为:

寄存器VALUE
0124
020A
0300
0419
0507
0658/5A/5C
0703
08A9
0959
0ACD
0208

我们想要输出的目标频率有3个,分别是3760MHz/3764MHz/3768MHz,现在以这几个目标频率为例讲解各个寄存器的配置情况。

02寄存器: 配置为0A主要目的是想关闭RF输出并打开REFO,手册里有以下描述:
For correct PLL operation all internal blocks should be
enabled, but PDREFO should be set if the REFO pin is
not being used. OMUTE may remain asserted (or the
MUTE pin held low) until programming is complete
我们硬件设计里REFO没有使用,所以按照厂家要求需要将REFO位置1.

03寄存器: 该寄存器的高4位是B,低2位是R,B是数字校准环路的分频器,计算方法如下:
在这里插入图片描述
其中fpfd为鉴相器频率,是有参考频率和分频系数决定的,我们实际使用的参考频是50MHz,分频系数(即R,前文环路滤波器有提到)为25,故fpfd为2MHz,fCAL_MAX由使用的芯片型号决定,可根据表7获得,计算出B之后需要查表获取寄存器配置的索引:

在这里插入图片描述
在这里插入图片描述
B = 2 / 1.33 = 1.5 根据表8查得BD为0000(2进制),因为R为25,故RD[9]和RD[8]都为0,所以03寄存器配置为0x00;

04寄存器: 该寄存器是分频系数R的低8位,我们计算的R为25,可以直接转换为十六进制为0x19;

05寄存器: 倍频系数N的高8位,根据前章我们知道N为1880,故此处值为0x07;

06寄存器: 倍频系数N的低8位,此处为0x58或0x5A或0x5C;

07寄存器: 当寄存器6配置完之后,就可以开始VCO校准了,使能ALC功能项(ALCMON = 1, ALCCAL = 1),同时使能LKEN,这个bit位主要是用于使能PLL的锁定指示,方便后边对锁相环的状态查询;

08寄存器: 该寄存器中的BST和FILT是用来改善参考频率的性能,也就是前文所提到的性能寄存器,它是由参考频率本身特性决定的,可由查表获得:
在这里插入图片描述
根据实际测量,我们的参考频率Vpp小于2.0V,故BST配置为1,我们的参考频率为50MHz,故FILT为1,FRO为配置的输出功率,这个可根据自己的实际需求来选择,我们这里选择了-3dBm,所以RFO为1,OD为最终输出分频比(此值改动不需要重新进行VCO校准),我们这里配置的是1。综上,该寄存器配置为0xA9;

09寄存器: 该寄存器主要是VCO校准的一些参数和环路滤波器的电荷泵电流配置,其中LKWIN可以根据输入的参考频率查表3获得,LKCNT这里我们选择128,原因是我们在计算BW时采用了官方推荐的因子15,电荷泵选择了5.8mA,原因可以参考前章环路滤波器设计。

在这里插入图片描述

在这里插入图片描述

综上,寄存器09的配置值为0x59;

寄存器0A: 该寄存器主要是用于电荷泵的错误状态监测,我们采用了官方推荐的配置值0xC0;

寄存器02: 最后再配置一次寄存器02,将RF打开,REFO关闭即可,配置值为0x08.

至此,所有的寄存器就配置完成了,回到配置程序,我们可以看到在每次配置完成之后,我都对寄存器进行了一次读取,这样做的好处是可以及时确认当前寄存器配置是否成功,另外需要注意的是LKEN在置为1后,系统在启动校准后会自动清零,所以寄存器07在配置后读取的值和配置值会略有不同。在程序的最后,我们使用while查询PLL的锁频状态,只有当寄存器01的LOCK位被置为1时才说明系统配置正确,PLL锁频完成。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值