NUC140之PLL(频率合成器LMX2541)

33 篇文章 1 订阅

PLL 是一种集成了锁相环、鉴相器、振荡器为一体的频率合成芯片,

以LMX2541为例,它是一款小数分频的频率合成器,输出频率31.6MHz~4GHz,

具有非常好的相位噪声和杂散指标。采用SPI控制驱动程序如下:

#include "PLL_Thread.h"
#include "DrvSPI.h"
const int16_t OffSetArray[] = {8000, 7500, 7300, 5000, 4000, 2500, 0, -2500, -4000, -5000, -7300, -7500, -

8000};

//寄存器0
volatile TRegister_R0 Register_R0_TX;	//Register_R0_RX,

//寄存器1
volatile TRegister_R1 Register_R1_TX;	 //Register_R1_RX,

//寄存器2
volatile TRegister_R2 Register_R2_TX; //Register_R2_RX,

//寄存器4
volatile TRegister_R4 Register_R4_TX;	 //Register_R4_RX,

//Register_R2.Map.default0 = Register_R2_default;
//	Register_R2.Map.PLL_DEN = PLL_DEN_RX_VALUE;						
//	LMX2541_Set_Register(Register_R2.Value,LMX2541_REG2);

//寄存器6 extern
 volatile TRegister_R6 Register_R6;


//
寄存器8
//TRegister_R8 Register_R8;
//
寄存器9
//TRegister_R9 Register_R9;
//
寄存器12
//TRegister_R12 Register_R12;
//
寄存器13
//TRegister_R13 Register_R13;

void IniSPI(void);
//void IniLMX2541_GPIO(void);
void IniLMX2541_Ctrl_GPIO(void);
void IniLMX2541(void);
void LMX2541_Set_Register(uint32_t Register_Value,TLMX2541_REG  Register_Addr);
void LMX2541_Write_Data(uint32_t Value);
uint8_t LMX2541_Modify_FRE(uint32_t Fre_Value,uint8_t OffSet);
uint8_t LMX2541_Modify_RFGain(uint8_t Gain_Value);
void LMX2541_Modify_LoopFilter(TLMX2541_RES  RES_R3,TLMX2541_RES  RES_R4,TLMX2541_CAP3  CAP_C3,TLMX2541_CAP4 CAP_C4,uint8_t vco_div_value);
void PTT_SW(uint8_t ptt);
void EINT1_Callback(void);
void GPIO_GPAB_Callbackfunc(uint32_t portA,uint32_t portB);
//void GPIO_GPCDE_Callbackfunc(uint32_t portC,uint32_t portD,uint32_t portE);


//void LMX2541_Modify_PLL (uint8_t PLL_R,uint32_t PLL_N, uint32_t PLL_NUM, uint32_t PLL_DEN);


void IniSPI(void)
{
	/* Configure SPI0 related multi-function pins */
    DrvGPIO_InitFunction(E_FUNC_SPI0);

    /* Configure SPI0 as a master, 32-bit transaction */
    DrvSPI_Open(eDRVSPI_PORT0,eDRVSPI_MASTER,eDRVSPI_TYPE1,32);
    
	/* Disable the automatic slave select function of SS0. */
	DrvSPI_DisableAutoSS(eDRVSPI_PORT0);

	/* Set the active level of slave select. */
    DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT0, eDRVSPI_ACTIVE_LOW_FALLING);

	DrvSPI_Set2BitTransferMode(eDRVSPI_PORT0,FALSE);
   
    /* The transfer order of SPI0 is MSB first */ 
	DrvSPI_SetEndian(eDRVSPI_PORT0, eDRVSPI_MSB_FIRST);
	
	/* SPI clock rate 1M */
    DrvSPI_SetClockFreq(eDRVSPI_PORT0,1000000, 0);
}


/*
	函数名称:IniLMX2541_Ctrl_GPIO
	函数功能:初始化控制LMX2541	相关引脚功能
	入口函数:无
	出口函数:无
	返回值:无
*/
void IniLMX2541_Ctrl_GPIO(void)
{
	
//	DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);											//SYTEST
//	DrvGPIO_Open(E_GPA,11, E_IO_INPUT);											
//	DrvGPIO_Open(E_GPB,3, E_IO_OUTPUT);											//VCTL
	

	//IniSPI();
//	DrvGPIO_Open(E_GPC,0, E_IO_OUTPUT);	   										//LE
//	DrvGPIO_Open(E_GPC,1, E_IO_OUTPUT);											//CLK
//	DrvGPIO_Open(E_GPC,7, E_IO_INPUT);											//SYSLOCK_STU
//	DrvGPIO_Open(E_GPE,0, E_IO_OUTPUT);											//RFEN
//    DrvGPIO_Open(E_GPE,1, E_IO_OUTPUT);											//DATA_PLL
//	DrvGPIO_Open(E_GPE,2, E_IO_OUTPUT);											//CLK_PLL
//	DrvGPIO_Open(E_GPE,3, E_IO_OUTPUT);											//EN_PLL	
//	
//	SYTEST(SYNCLOCK);															//默认为频合正常
	
	//DrvGPIO_EnableInt(E_GPB,2, E_IO_BOTH_EDGE,E_MODE_EDGE);						//打开LOCK中断
	
	//DrvGPIO_SetIntCallback(GPIO_GPAB_Callbackfunc, GPIO_GPCDE_Callbackfunc);
	//DrvGPIO_EnableEINT1(E_IO_BOTH_EDGE, E_MODE_EDGE,EINT1_Callback);						
}
/******************************************
 ********初始化送数IO口********************
******************************************/

//void IniLMX2541_GPIO(void)
//{
//	DrvGPIO_Open(E_GPE,3, E_IO_OUTPUT);											//EN_PLL
//	DrvGPIO_Open(E_GPE,2, E_IO_OUTPUT);											//CLK_PLL
//	DrvGPIO_Open(E_GPE,1, E_IO_OUTPUT);											//DATA_PLL
//}
/*
	函数名称:IniLMX2541
	函数功能:初始化LMX2541	相关寄存器
	入口函数:无
	出口函数:无
	返回值:无
*/
void IniLMX2541(void)
{
	//寄存器2
	TRegister_R2 Register_R2;
	
	//寄存器3
	TRegister_R3 Register_R3;
	
	//寄存器4
//	TRegister_R4 Register_R4;
	
	//寄存器5
	TRegister_R5 Register_R5;
		
	//寄存器7
	TRegister_R7 Register_R7;
	
	TRegister_R8 Register_R8;

	TRegister_R9 Register_R9;

	TRegister_R12 Register_R12;

	TRegister_R13 Register_R13;
	
	IniLMX2541_Ctrl_GPIO();										//初始化控制LMX2541的寄存器引脚
	
	RFEN_PLL(0);												//关闭射频输出
		
	//初始化寄存器7
	Register_R7.Map.default0 = Register_R7_default;
	LMX2541_Set_Register(Register_R7.Value,LMX2541_REG7);

	//初始化寄存器13
	Register_R13.Map.default0 = Register_R13_default;
	Register_R13.Map.VCO_DIV_OPT = 0;
	LMX2541_Set_Register(Register_R13.Value,LMX2541_REG13);

	//初始化寄存器12
	Register_R12.Map.default0 = Register_R12_default;
	LMX2541_Set_Register(Register_R12.Value,LMX2541_REG12);

	//初始化寄存器9
	Register_R9.Map.default0 = Register_R9_default;
	LMX2541_Set_Register(Register_R9.Value,LMX2541_REG9);

	//初始化寄存器8
	Register_R8.Map.default0 = Register_R8_default;
	Register_R8.Map.AC_TEMP_COMP = 5;
	LMX2541_Set_Register(Register_R8.Value,LMX2541_REG8);

	//初始化寄存器6
	Register_R6.Map.default0 = Register_R6_default;
//	Register_R6.Map.VCOGAIN = 12;
	Register_R6.Map.OUTTERM = 12;
	Register_R6.Map.DIVGAIN = 12;
	Register_R6.Map.RFOUT = 1;									//射频开关由RFoutEN控制
	Register_R6.Map.Addr = LMX2541_REG6;
	LMX2541_Write_Data(Register_R6.Value);

	//初始化寄存器5
	Register_R5.Map.default0 = Register_R5_default;
	Register_R5.Map.FL_CPG = 0;
	Register_R5.Map.FL_RF_LF = 0;
	Register_R5.Map.FL_R3_LF = 0;
	Register_R5.Map.FL_TOC = 0;									//禁用FastLock
	LMX2541_Set_Register(Register_R5.Value,LMX2541_REG5);

	//初始化寄存器4(环路滤波器)
//	LMX2541_Modify_LoopFilter(LMX2541_RES_1k,LMX2541_RES_200,LMX2541_CAP3_20,LMX2541_CAP4_100,20);

	
	//初始化寄存器3
	Register_R3.Map.FSK = 0;			//禁用FSK
	Register_R3.Map.default0 = Register_R3_default;
	Register_R3.Map.DLOCK = 0;			//锁定时间为13.5ns
	Register_R3.Map.CPT = 0;			//禁止使用3态
	Register_R3.Map.DITH = 3;			//禁止使用抖动
	Register_R3.Map.ORDER = 3;			//使用小数分频
	Register_R3.Map.FDM = 1;			//使用小数分频时,分子和分母都是22bit
	Register_R3.Map.OSC_2X = 0;			//不使用双倍晶振
	Register_R3.Map.CPP = 0;			//全功能模式下,电荷泵极性为负极
	Register_R3.Map.MUX = 8;
	Register_R3.Map.CPG = 15;			//选择最大的充电泵电流 1600uA
	Register_R3.Map.XO = 0;
	Register_R3.Map.POWERDOWN = 0;		//不关闭器件
	Register_R3.Map.MODE = 0;			//全功能模式
//	Register_R3.Map.Addr = LMX2541_REG3;
	LMX2541_Set_Register(Register_R3.Value,LMX2541_REG3);

	//初始化寄存器2
	Register_R2.Map.default0 = Register_R2_default;
	Register_R2.Map.PLL_DEN = PLL_DEN_MAX_VALUE;
	LMX2541_Set_Register(Register_R2.Value,LMX2541_REG2);

	//初始化寄存器1
	//Register_R1_RX.Map.Addr = LMX2541_REG1;							//地址
	//Register_R1_RX.Map.default0 = Register_R1_default;

	Register_R1_TX.Map.Addr = LMX2541_REG1;							//地址
	Register_R1_TX.Map.default0 = Register_R1_default;
	
	//初始化寄存器0
	//Register_R0_RX.Map.Addr = LMX2541_REG0;							//地址
	Register_R0_TX.Map.Addr = LMX2541_REG0;							//地址
	
					
}


/*
	函数名称:LMX2541_Set_Register
	函数功能:设置寄存器的值
	入口函数:
		Register_Value:寄存器的值;
		Register_Addr:寄存器地址,该值可以为:LMX2541_REG0,LMX2541_REG1,LMX2541_REG2,LMX2541_REG3,LMX2541_REG4,
											LMX2541_REG5,LMX2541_REG6,LMX2541_REG7,LMX2541_REG8,LMX2541_REG9,
											LMX2541_REG12,LMX2541_REG13
	出口函数:无
	返回值:无
*/
void LMX2541_Set_Register(uint32_t Register_Value,TLMX2541_REG  Register_Addr)
{
	uint32_t SendData = 0;
	SendData = Register_Value & 0xFFFFFFF0;
	SendData += Register_Addr;
	LMX2541_Write_Data(SendData);
}


/*
	函数名称:LMX2541_Write_Data
	函数功能:发送数据到LMX2541
	入口函数:
		Value:要发送到LMX2541的值;
		
	出口函数:无
	返回值:无
*/
//void LMX2541_Write_Data(uint32_t Value)
//{
//	DrvSPI_ClrSS(eDRVSPI_PORT0, eDRVSPI_SS0);				   //set high
//	DrvSPI_SetSS(eDRVSPI_PORT0, eDRVSPI_SS0);				   //set low
//	DrvSPI_SingleWrite(eDRVSPI_PORT0,&Value);
//	while(DrvSPI_IsBusy(eDRVSPI_PORT0));
//	DrvSPI_ClrSS(eDRVSPI_PORT0, eDRVSPI_SS0);				   //set high
//	DrvSPI_SetSS(eDRVSPI_PORT0, eDRVSPI_SS0);				   //set low
//}
void LMX2541_Write_Data(uint32_t Value)
{
	uint8_t i;
	EN_PLL(1);
	delay(5);												//set high
	EN_PLL(0);												//set low
	delay(5);
	for(i=0;i<32;i++)
	{
		CLK_PLL(0);
		delay(5);
		if((Value&0x80000000)==0x80000000)
		{
			DATA_PLL(1);	
		}
		else
		{
		    DATA_PLL(0);
		}
		delay(5);
		CLK_PLL(1);
		delay(5);
		Value=Value<<1;
	}
	CLK_PLL(0);	
	delay(5);
	EN_PLL(1);												//set high
	delay(5);
	EN_PLL(0);												//set low
	delay(5);
	RFEN_PLL(1);
	delay(5);
}

/*
	函数名称:LMX2541_Modify_FRE
	函数功能:修改LMX2541的输出频率
	入口函数:

		
	出口函数:无
	返回值:
	1:频率设置成功
	0:频率设置失败


*/
uint8_t LMX2541_Modify_FRE(const uint32_t Fre_Value,const uint8_t OffSet_subscript)
{
	uint8_t ModValue = 0,VCO_DIV_TX = 0;	  //VCO_DIV_RX = 0,
	uint16_t PLL_CNT_N = 0;
	uint32_t VCO_OUT = 0,PLL_CNT_NUM = 0;   	
	float point = 0.0;

	uint32_t RealFre_Tx = 0;	   //RealFre_Rx = 0,
	
	if((Fre_Value>MAXFRE)||(Fre_Value<MINFRE)||(Fre_Value%5 != 0)||(OffSet_subscript>12))
	{
		return 0;				//频率值或频偏值超出范围
	}
	
	ModValue = Fre_Value%100;

	if((ModValue == 20)||(ModValue == 45)||(ModValue == 70)||(ModValue == 95))
	{
		return 0;
	}
	
	if(Fre_Value%25 == 0)	
	{
		RealFre_Tx = Fre_Value * 1000;
	}
	else				
	{

		RealFre_Tx *= 1000;

		
		if( OffSet_subscript>12 )
		{
			return 0;
		}

	}
   	

	//RealFre_Rx = RealFre_Tx + 35250000;
	RealFre_Tx += 35250000;
	RealFre_Tx += OffSetArray[OffSet_subscript];


	//计算接收频率值
	//VCO_DIV_RX = VCO_MAX_VALUE/RealFre_Rx;					//计算VCO_DIV

	//VCO_OUT = RealFre_Rx * VCO_DIV_RX;						//计算VCO的值

	PLL_CNT_N = VCO_OUT / FPD_VALUE;						//计算N值

	point = ((float)(VCO_OUT % FPD_VALUE)/FPD_VALUE);		//计算小数值

	PLL_CNT_NUM = point * PLL_DEN_MAX_VALUE;				//计算分子值


//	Register_R0_RX.Map.PLL_NUM_L = PLL_CNT_NUM & 0x0000ffff;			//PLL_NUM低16位
//	Register_R0_RX.Map.PLL_N_L = PLL_CNT_N & 0x00000fff;				//PLL_N低12位
			

	//Register_R1_RX.Map.default0 = Register_R1_default;
//	Register_R1_RX.Map.PLL_NUM_H = ((PLL_CNT_NUM >> 16)&0x0000003f);	//PLL_NUM高6位
//	Register_R1_RX.Map.PLL_N_H = ((PLL_CNT_N >> 12)&0x0000003f);		//PLL_N高6位
//	Register_R1_RX.Map.PLL_R = PLL_R_VALUE;								//PLL_R
	//Register_R1_RX.Map.Addr = LMX2541_REG1;							//地址

	//Register_R4_RX.Map.VCO_DIV = VCO_DIV_RX;

	//计算发射机频率
	VCO_DIV_TX = VCO_MAX_VALUE/RealFre_Tx;					//计算VCO_DIV

	VCO_OUT = RealFre_Tx * VCO_DIV_TX;						//计算VCO的值

	PLL_CNT_N = VCO_OUT / FPD_VALUE;						//计算N值

	point = ((float)(VCO_OUT % FPD_VALUE)/FPD_VALUE);		//计算小数值


	PLL_CNT_NUM = point * PLL_DEN_MAX_VALUE;				//计算分子值


	Register_R0_TX.Map.PLL_NUM_L = PLL_CNT_NUM & 0x0000ffff;			//PLL_NUM低16位
	Register_R0_TX.Map.PLL_N_L = PLL_CNT_N & 0x00000fff;				//PLL_N低12位
				

	//Register_R1_TX.Map.default0 = Register_R1_default;
	Register_R1_TX.Map.PLL_NUM_H = ((PLL_CNT_NUM >> 16)&0x0000003f);	//PLL_NUM高6位
	Register_R1_TX.Map.PLL_N_H = ((PLL_CNT_N >> 12)&0x0000003f);		//PLL_N高6位
	Register_R1_TX.Map.PLL_R = PLL_R_VALUE;								//PLL_R
	//Register_R1_TX.Map.Addr = LMX2541_REG1;							//地址

	Register_R4_TX.Map.VCO_DIV = VCO_DIV_TX;

	Register_R6.Map.RFOUT = 0;		
	LMX2541_Write_Data(Register_R6.Value);							//关闭射频输出
//	RFEN_PLL(0);													//关闭射频输出

	LMX2541_Modify_LoopFilter(LMX2541_RES_1k,LMX2541_RES_200,LMX2541_CAP3_20,LMX2541_CAP4_100,VCO_DIV_TX);
//	LMX2541_Write_Data(Register_R1_TX.Value);					//修改R1的值
//	LMX2541_Write_Data(Register_R0_TX.Value);					//修改R0的值

//	LMX2541_Modify_LoopFilter(LMX2541_RES_1k,LMX2541_RES_200,LMX2541_CAP3_20,LMX2541_CAP4_100,VCO_DIV_RX);
	LMX2541_Write_Data(Register_R4_TX.Value);					//修改R4的值
	LMX2541_Write_Data(Register_R1_TX.Value);					//修改R1的值
	LMX2541_Write_Data(Register_R0_TX.Value);					//修改R0的值
//	RFEN_PLL(1);												//打开射频输出

	Register_R6.Map.RFOUT = 2;
	LMX2541_Write_Data(Register_R6.Value);							//打开射频输出	

	//VCTL(FOUT_RX);
	//RFEN_PLL(FOUT_TX);
	return 1;
}





/*
	函数名称:LMX2541_Modify_RFGain
	函数功能:修改LMX2541的输出增益
	入口函数:
		Gain_Value:输出的增益值,取值范围为0~15
		
	出口函数:无
	返回值:
	1:修改成功
	0:修改失败
*/
uint8_t LMX2541_Modify_RFGain(uint8_t Gain_Value)
{	
	if(Gain_Value<16)
	{
//		Register_R6.Map.RFOUT = 0;									//关闭射频输出
//		LMX2541_Write_Data(Register_R6.Value);
	
		Register_R6.Map.OUTTERM = Gain_Value;
//		Register_R6.Map.DIVGAIN = 12;
//		Register_R6.Map.RFOUT = 1;									//打开射频输出
		LMX2541_Write_Data(Register_R6.Value);

		return 1;
	}
	else
	{
		return 0;
	}	
}



/*
	函数名称:LMX2541_Modify_LoopFilter
	函数功能:修改LMX2541内部环路滤波器的参数
	入口函数:
		RES_R3:电阻R3的阻值,该值可以为 LMX2541_RES_200,LMX2541_RES_1k,LMX2541_RES_2k,LMX2541_RES_4k,LMX2541_RES_16k,分别对应的阻值为
				200,1k,2k,4k,16k

		RES_R4:电阻R4的阻值,该值可以为 LMX2541_RES_200,LMX2541_RES_1k,LMX2541_RES_2k,LMX2541_RES_4k,LMX2541_RES_16k,分别对应的阻值为
				200,1k,2k,4k,16k

		CAP_C3:电阻C3的电容值,该值可以为 LMX2541_CAP3_0,LMX2541_CAP3_1,LMX2541_CAP3_5,LMX2541_CAP3_6,LMX2541_CAP3_10,LMX2541_CAP3_11,
							LMX2541_CAP3_15,LMX2541_CAP3_16,LMX2541_CAP3_20,LMX2541_CAP3_21,LMX2541_CAP3_25,LMX2541_CAP3_26,
							LMX2541_CAP3_30,LMX2541_CAP3_31,LMX2541_CAP3_35,LMX2541_CAP3_36

				对应的电容值为(pF): 0,1,5,6,10,11,
							15,16,20,21,25,26,
							30,31,35,36

		CAP_C4:电阻C4的电容值,该值可以为 LMX2541_CAP4_0=0,LMX2541_CAP4_5,LMX2541_CAP4_20,LMX2541_CAP4_25,LMX2541_CAP4_40,LMX2541_CAP4_45,
							LMX2541_CAP4_60,LMX2541_CAP4_65,LMX2541_CAP4_100,LMX2541_CAP4_105,LMX2541_CAP4_120,LMX2541_CAP4_125,
							LMX2541_CAP4_140,LMX2541_CAP4_145,LMX2541_CAP4_160,LMX2541_CAP4_165

				对应的电容值为(pF): 0,5,20,25,40,45,
							60,65,100,105,120,125,
							140,145,160,165
		
		vco_div_value:VCO的分频值 0~63

	出口函数:无
	返回值:无
*/
void LMX2541_Modify_LoopFilter(TLMX2541_RES  RES_R3,TLMX2541_RES  RES_R4,TLMX2541_CAP3  CAP_C3,TLMX2541_CAP4 CAP_C4,uint8_t vco_div_value)
{	
	//接收寄存器4
//	Register_R4_RX.Map.C4_LF = CAP_C4;
//	Register_R4_RX.Map.C3_LF = CAP_C3;
//	Register_R4_RX.Map.R4_LF = RES_R4;
//	Register_R4_RX.Map.R3_LF = RES_R3;
//	Register_R4_RX.Map.VCO_DIV = vco_div_value;
//	Register_R4_RX.Map.OSC_FREQ = OSC_FREQ_VALUE;
//	Register_R4_RX.Map.Addr = LMX2541_REG4;
	

	//发射寄存器4
	Register_R4_TX.Map.C4_LF = CAP_C4;
	Register_R4_TX.Map.C3_LF = CAP_C3;
	Register_R4_TX.Map.R4_LF = RES_R4;
	Register_R4_TX.Map.R3_LF = RES_R3;
	Register_R4_TX.Map.VCO_DIV = vco_div_value;
	Register_R4_TX.Map.OSC_FREQ = OSC_FREQ_VALUE;
	Register_R4_TX.Map.Addr = LMX2541_REG4;
//	LMX2541_Write_Data(Register_R4.Value);							//修改环路滤波器的值
				
}

/*
	函数名称:PTT_SW
	函数功能:收发频率切换
	入口函数:ptt,收发状态 1:收状态 ; 0:发状态		
	出口函数:无
	返回值:无
*/
void PTT_SW(uint8_t ptt)
{
//	Register_R6.Map.RFOUT = 0;		
//	LMX2541_Write_Data(Register_R6.Value);							//关闭射频输出
	if(ptt)
	{
		RFEN_PLL(1);													//关闭射频输出 PTT反相
	}
	else
	{
		RFEN_PLL(0);													//打开射频输出
	}
	
	/*
	if((ptt)||(VOP_ERR))							//收状态
	{		
		LMX2541_Write_Data(Register_R4_RX.Value);					//修改R4的值
		LMX2541_Write_Data(Register_R1_RX.Value);					//修改R1的值
		LMX2541_Write_Data(Register_R0_RX.Value);					//修改R0的值
		//VCTL(FOUT_RX);
		//RFEN_PLL(FOUT_RX);		
	}
	else		//发状态
	{
		LMX2541_Write_Data(Register_R4_TX.Value);					//修改R4的值
		LMX2541_Write_Data(Register_R1_TX.Value);					//修改R1的值
		LMX2541_Write_Data(Register_R0_TX.Value);					//修改R0的值
		//VCTL(FOUT_TX);
		//RFEN_PLL(FOUT_TX);	
	}
	*/
//	Register_R6.Map.RFOUT = 1;
//	LMX2541_Write_Data(Register_R6.Value);							//打开射频输出
}

/*
	函数名称:EINT1_Callback
	函数功能:PTT中断回调函数
	入口函数:param:无意义		
	出口函数:无
	返回值:无
*/
void EINT1_Callback(void)
{
//	PTT_SW(PTT_STU);
}

/*
	函数名称: GPIO_GPAB_Callbackfunc
	函数功能:锁定指示中断
	入口函数:
		portA:端口A的中断引脚指示
		portB:端口B的中断引脚指示		
	出口函数:无
	返回值:无
*/
void GPIO_GPAB_Callbackfunc(uint32_t portA,uint32_t portB)
{
//	if(portB & (1<<2))
//	{
//		if(LOCK_STU)
//		{
//			SYTEST(SYNCLOCK);							//频合锁定
//			Register_R6.Map.RFOUT = 1;		
//			LMX2541_Write_Data(Register_R6.Value);							//打开射频输出
//		}
//		else
//		{
//			SYTEST(SYNCUNLOCK);							//频合失锁
//			Register_R6.Map.RFOUT = 0;		
//			LMX2541_Write_Data(Register_R6.Value);							//关闭射频输出
//		}	
//	}
}


void LMX2541_Set_Register_R0(uint32_t Register_Value)
{
	DrvSPI_ClrSS(eDRVSPI_PORT0, eDRVSPI_SS0);				   //set high
	DrvSPI_SetSS(eDRVSPI_PORT0, eDRVSPI_SS0);				   //set low
	
	DrvSPI_SingleWrite(eDRVSPI_PORT0,&Register_Value);
	while(DrvSPI_IsBusy(eDRVSPI_PORT0));
	DrvSPI_ClrSS(eDRVSPI_PORT0, eDRVSPI_SS0);
	DrvSPI_SetSS(eDRVSPI_PORT0, eDRVSPI_SS0);	
}
/*
	函数名称: GPIO_GPCDE_Callbackfunc
	函数功能:无
	入口函数:
		portC:端口C的中断引脚指示
		portD:端口D的中断引脚指示
		portE:端口E的中断引脚指示		
	出口函数:无
	返回值:无
*/
//void GPIO_GPCDE_Callbackfunc(uint32_t portC,uint32_t portD,uint32_t portE)
//{
//	
//}

void PLL_control_entry(void *parameter)
{
    /* 调度器上锁,上锁后,将不再切换到其他线程,仅响应中断 */
  rt_enter_critical();	
	DrvGPIO_DisableEINT0();
	DrvGPIO_DisableEINT0();

	DrvGPIO_Open(E_GPC, 0, E_IO_OUTPUT); 
 	DrvGPIO_Open(E_GPC, 1, E_IO_OUTPUT);
	DrvGPIO_Open(E_GPC, 3, E_IO_OUTPUT);
	DrvGPIO_Open(E_GPD, 15, E_IO_INPUT);


	IniLMX2541();
	LMX2541_Modify_FRE(118000,6);


    /* 调度器解锁 */
    rt_exit_critical();
	DrvGPIO_EnableEINT0(E_IO_BOTH_EDGE, E_MODE_EDGE, 

						PTT_Mic_Callback); 
	DrvGPIO_EnableEINT1(E_IO_BOTH_EDGE, E_MODE_EDGE, 

						PTT_Rem_Callback);

	while(1)
	{
		rt_thread_delay(200);
	}
}


 

头文件如下

#ifndef PLL_THREAD_H
#define PLL_THREAD_H
#include "stdint.h"
#include "DrvGPIO.h"
#include "Globe_Value.h"
#include "GPIO_Irq_Thread.h"
#include <rtthread.h>

typedef enum {LMX2541_REG0=0,LMX2541_REG1,LMX2541_REG2,LMX2541_REG3,LMX2541_REG4,
						LMX2541_REG5,LMX2541_REG6,LMX2541_REG7,LMX2541_REG8,LMX2541_REG9,
						LMX2541_REG12=12,LMX2541_REG13=13}TLMX2541_REG;

typedef enum {LMX2541_RES_200=0,LMX2541_RES_1k,LMX2541_RES_2k,LMX2541_RES_4k,LMX2541_RES_16k}TLMX2541_RES;

typedef enum {LMX2541_CAP3_0=0,LMX2541_CAP3_1,LMX2541_CAP3_5,LMX2541_CAP3_6,LMX2541_CAP3_10,LMX2541_CAP3_11,
							LMX2541_CAP3_15,LMX2541_CAP3_16,LMX2541_CAP3_20,LMX2541_CAP3_21,LMX2541_CAP3_25,LMX2541_CAP3_26,
							LMX2541_CAP3_30,LMX2541_CAP3_31,LMX2541_CAP3_35,LMX2541_CAP3_36}TLMX2541_CAP3;

typedef enum {LMX2541_CAP4_0=0,LMX2541_CAP4_5,LMX2541_CAP4_20,LMX2541_CAP4_25,LMX2541_CAP4_40,LMX2541_CAP4_45,
							LMX2541_CAP4_60,LMX2541_CAP4_65,LMX2541_CAP4_100,LMX2541_CAP4_105,LMX2541_CAP4_120,LMX2541_CAP4_125,
							LMX2541_CAP4_140,LMX2541_CAP4_145,LMX2541_CAP4_160,LMX2541_CAP4_165}TLMX2541_CAP4;


//寄存器0
typedef union {
	struct{
		uint32_t Addr:4;		//地址
		uint32_t PLL_N_L:12;	//PLL_N低12位
		uint32_t PLL_NUM_L:16;	//PLL_NUM低16位		
	}Map;
	uint32_t Value;
}TRegister_R0;

//寄存器1
typedef union {
	struct {
		uint32_t Addr:4;		//地址
		uint32_t PLL_R:12;			//PLL_R
		uint32_t PLL_N_H:6;			//PLL_N高6位
		uint32_t PLL_NUM_H:6;		//PLL_NUM高6位
		uint32_t default0:4;		
	}Map;
	uint32_t Value;
}TRegister_R1;

//寄存器2
typedef union {
	struct {
		uint32_t Addr:4;		//地址
		uint32_t PLL_DEN:22;	//PLL_DEN高6位
		uint32_t default0:6;		
	}Map;
	uint32_t Value;
}TRegister_R2;

//寄存器3
typedef union {
	struct{
		uint32_t Addr:4;		//地址
		uint32_t MODE:2;
		uint32_t POWERDOWN:1;
		uint32_t XO:1;
		uint32_t CPG:5;
		uint32_t MUX:4;
		uint32_t CPP:1;
		uint32_t OSC_2X:1;
		uint32_t FDM:1;
		uint32_t ORDER:3;
		uint32_t DITH:2;
		uint32_t CPT:1;
		uint32_t DLOCK:3;
		uint32_t default0:2;
		uint32_t FSK:1;											
	}Map;
	uint32_t Value;
}TRegister_R3;

//寄存器4
typedef union {
	struct{
		uint32_t Addr:4;		//地址
		uint32_t OSC_FREQ:8;
		uint32_t VCO_DIV:6;
		uint32_t R3_LF:3;
		uint32_t R4_LF:3;
		uint32_t C3_LF:4;
		uint32_t C4_LF:4;		
	}Map;
	uint32_t Value;
}TRegister_R4;


//寄存器5
typedef union {
	struct{
		uint32_t Addr:4;		//地址
		uint32_t FL_TOC:14;
		uint32_t FL_R3_LF:3;
		uint32_t FL_RF_LF:3;
		uint32_t FL_CPG:5;
		uint32_t default0:3;
		
	}Map;
	uint32_t Value;
}TRegister_R5;

//寄存器6
typedef union {
	struct{
		uint32_t Addr:4;		//地址
		uint32_t RFOUT:2;
		uint32_t DIVGAIN:4;
		uint32_t OUTTERM:4;
		uint32_t VCOGAIN:4;
		uint32_t default0:14;						
	}Map;
	uint32_t Value;
}TRegister_R6;

//寄存器7
typedef union {
	struct{
		uint32_t Addr:4;		//地址
		uint32_t default0:28;		
	}Map;
	uint32_t Value;
}TRegister_R7;

//寄存器8
typedef union {
	struct{
		uint32_t Addr:4;		//地址
		uint32_t AC_TEMP_COMP:5;
		uint32_t default0:23;		
	}Map;
	uint32_t Value;
}TRegister_R8;

//寄存器9
typedef union {
	struct{
		uint32_t Addr:4;		//地址
		uint32_t default0:28;		
	}Map;
	uint32_t Value;
}TRegister_R9;

//寄存器12
typedef union {
	struct{
		uint32_t Addr:4;		//地址
		uint32_t default0:28;		
	}Map;
	uint32_t Value;
}TRegister_R12;

//寄存器13
typedef union {
	struct{
		uint32_t Addr:4;		//地址
		uint32_t VCO_DIV_OPT:3;
		uint32_t default0:25;		
	}Map;
	uint32_t Value;
}TRegister_R13;

#define Register_R1_default		0
#define Register_R2_default		1
#define	Register_R3_default		0
#define	Register_R5_default		5
#define	Register_R6_default		7
#define	Register_R7_default		1
#define	Register_R8_default		0x88E7
#define	Register_R9_default		0x2800140
#define	Register_R12_default	1
#define	Register_R13_default	1

#define VCO_MAX_VALUE			4000000000							//VCO的最大值
#define FPD_VALUE				1600000//400000 							//鉴相频率值

#define PLL_DEN_MAX_VALUE		4194303					 	        //分母的最大值
//#define PLL_DEN_CNT_VALUE		73100								//用于计算的 N值的分母
//#define PLL_DEN_RX_VALUE		365500								分母  5*73100
//#define PLL_DEN_TX_VALUE		146200								分母  2*73100
#define PLL_R_VALUE				8//32
//#define VCO_DIV_RX_VALUE		20									
//#define VCO_DIV_TX_VALUE		25								
#define OSC_FREQ_VALUE			13									//参考源的频率值(MHz)
#define FOUT_RX					1									
#define FOUT_TX					0									
#define SYNCLOCK				0									//频合锁定
#define SYNCUNLOCK				1									//频合失锁

#define MAXFRE	143975			//允许的最大频率值(kHz)
#define MINFRE	118000			//允许的最小频率值(kHz)

#define PLL_DIS        DrvGPIO_SetBit(E_GPD, 7)
#define PLL_EN         DrvGPIO_ClrBit(E_GPD, 7)
#define PLL_CLK_HIGH   DrvGPIO_SetBit(E_GPD, 14)
#define PLL_CLK_LOW    DrvGPIO_ClrBit(E_GPD, 14)
#define PLL_DATA_HIGH  DrvGPIO_SetBit(E_GPD, 15)
#define PLL_DATA_LOW   DrvGPIO_ClrBit(E_GPD, 15)
#define PLL_RF_EN      DrvGPIO_SetBit(E_GPC, 5)
#define PLL_RF_DIS     DrvGPIO_ClrBit(E_GPC, 5)

#define RFEN_PLL(x)	((x)?(GPIOC->DOUT |= 1<<5):(GPIOC->DOUT &= ~(1<<5)))
#define DATA_PLL(x)	((x)?(GPIOC->DOUT |= 1<<3):(GPIOC->DOUT &= ~(1<<3)))
#define CLK_PLL(x)	((x)?(GPIOC->DOUT |= 1<<1):(GPIOC->DOUT &= ~(1<<1)))
#define EN_PLL(x)	((x)?(GPIOC->DOUT |= 1<<0):(GPIOC->DOUT &= ~(1<<0)))

extern void PLL_control_entry(void *parameter);

#endif

 

 

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: lmx25是一款时钟发生器,可以生成高频稳定的时钟信号。verilog是一种硬件描述语言,用于设计数字电路。lmx25 verilog是将lmx25的设计和使用以verilog语言进行描述和实现的过程。在设计lmx25时钟发生器时,使用verilog语言可以将设计和仿真过程进行统一,更加方便快捷。同时,使用verilog语言也可以充分利用计算机的计算能力,对时钟信号进行调整和优化,从而实现更高性能的时钟发生器。lmx25 verilog不仅可以应用于计算机等数字电路设备中,还可以应用于通信系统、测试设备等多种领域,为数字电路设计和实现提供更加丰富和灵活的解决方案。 ### 回答2: LMX25是一款常见的可编程逻辑器件系列,使用Verilog语言进行开发和描述。Verilog是一种硬件描述语言,通常用于设计数字电路。通过使用Verilog描述LMX25的功能和特性,可以进行逻辑仿真、综合和布局布线,最终实现对LMX25的管脚映射和器件连接。 在Verilog中,我们可以使用模块化的方式描述LMX25器件,定义其输入输出端口以及各个功能模块。通过逻辑门、寄存器、时钟和数据通路等元件的组合和连接,实现对LMX25的特定功能的描述。例如,可以定义基本逻辑门(与门、或门等),以及时钟信号和数据输入输出端口,并通过组合这些元件实现复杂的功能。同时,还可以利用条件语句、循环和分支等Verilog语法,增强描述的灵活性和复用性。 使用Verilog语言进行开发,可以进行逻辑仿真,验证设计的正确性,并通过波形查看器等工具分析和调试设计。在设计完成后,可以使用综合工具将Verilog描述的设计转换为门级网表,并进行布局布线,最终生成可用的物理设计。通过这种方式,可以将Verilog描述的LMX25设计实际转换为对应的硬件电路。 总之,通过使用Verilog语言描述LMX25,可以实现对其功能和特性的描述、验证和转换。这种硬件描述语言的使用,极大地简化了对LMX25等器件的设计和开发过程,并加快了设计周期和减少了设计错误的可能性。 ### 回答3: LMX25是一款数字 PLL锁相环) IC 芯片,由Texas Instruments(TI)公司开发和推出。它采用Verilog HDL(硬件描述语言)进行编程。Verilog HDL是一种专门用于描述数字电路设计的硬件描述语言,它被广泛应用于集成电路设计、仿真和验证。 在使用Verilog HDL编程时,我们可以使用各种Verilog基本元素和语法来描述LMX25的功能和行为。例如,我们可以使用模块化的方式定义不同的模块,每个模块代表芯片内的不同功能单元。我们可以使用寄存器、线路和组合逻辑来实现芯片的各种操作和计算。使用Verilog HDL编写的程序可以被综合工具综合为实际的电路,并且可以进行各种功能验证和时序分析。 LMX25集成了许多功能单元,包括数字频率合成器(NCO)、相位频率检测器(PFD)、定制频率锁定环(PLL)等。Verilog HDL为我们提供了一种描述和实现这些功能的强大工具。 使用Verilog HDL进行LMX25编程的过程通常包括设计、仿真和综合三个主要阶段。设计阶段中,我们使用Verilog语言描述并实现芯片的各个模块和功能。仿真阶段中,我们使用仿真工具对设计进行验证和调试。综合阶段中,我们使用综合工具将设计综合为实际的电路,以进行后续的布局和布线。 总结来说,LMX25的Verilog HDL编程可以让我们更轻松地对该芯片进行功能设计和验证。使用Verilog HDL,我们可以方便地描述和实现LMX25的各种功能和操作,并且能够进行全面的仿真和验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值