📄 adf4118.c
字号:
/****************************************Copyright (c)**************************
/******************************************************************************/
// 移频选频原理
//Fvco=[(P*B)+A]*Frefin/R
//P=32
//loop filter 100k----prescribe
//R=12.8M/100K=128---Parameter1
//Fvco=频点*2+170280 -1400
//B=Fvco/32-----------Parameter2
//A=Fvco-32*B
/******************************************************************************/
#include <iom128v.h>
#include <eeprom.h>
#include <macros.h>
#include <MATH.H>
#include "MF.H"
#include "GJB_define.h"
#define CLK_SEL (DDRB |=BIT6)
#define CLK_SET (PORTB|=BIT6)
#define CLK_CLR (PORTB&=~BIT6)
#define DATA_SEL (DDRB |=BIT7)
#define DATA_SET (PORTB|=BIT7)
#define DATA_CLR (PORTB&=~BIT7)
#ifdef allwinjk11
unsigned char LCAlarm[6]={0,0,0,0,0,0};
//------------------------------------------------------------------------------
void delay(int length)
{
while (length >=0)
length--;
}
//------------------------------------------------------------------------------
void LATCH_SET(UNchar channel)
{
select_CS(channel);
_NOP(); _NOP();
_NOP(); _NOP();
select_CS(0);
}
//------------------------------------------------------------------------------
void LATCH_CLR(UNchar channel)
{
select_CS(0);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void Freg_Init(void)
{
DDRA |= 0xFF;
DDRC |= (BIT5 + BIT6 + BIT7);
DDRG |= (BIT0 + BIT1);
PORTG|=BIT1+BIT0;
DATA_SEL;
CLK_SEL;
DATA_SET;
CLK_SET;
}
//------------------------------------------------------------------------------
// R_Counter R Register already answer=128
// F_Function C Register Function Latch
// N_Counter N Register N=BP+A
// channel LATCH latch pin
//------------------------------------------------------------------------------
void ADF4118_Drive(UNlong R_Counter, UNlong F_Function,UNlong N_Counter,UNchar channel)
{
UNlong temp1;
int i;
temp1=0x100000;
//Update R Latch, the writing order should be R, C, N
CLK_SET ;
DATA_SET;
LATCH_CLR(channel);
//delay(30);
for(i=0;i<21;i++)
{
if((temp1&R_Counter)==0x0)
DATA_CLR;
else
DATA_SET;
CLK_CLR;
delay(30);
CLK_SET ;
temp1=temp1>>1;
delay(30);
}
LATCH_SET(channel);
delay(30);
temp1=0x100000;
LATCH_CLR(channel);
for(i=0;i<21;i++) //Update C Latch
{
if((temp1&F_Function)==0x0)
DATA_CLR;
else
DATA_SET;
CLK_CLR;
delay(30);
CLK_SET ;
temp1=temp1>>1;
delay(30);
}
temp1=0x100000;
LATCH_SET(channel);
delay(30);
LATCH_CLR(channel);
delay(5000); //interval between programming C and N register needs to be at least 5ms
for(i=0;i<21;i++) //Update N Register
{
if((temp1&N_Counter)==0x0)
DATA_CLR;
else
DATA_SET;
CLK_CLR;
delay(30);
CLK_SET ;
delay(30);
temp1=temp1>>1;
}
LATCH_SET(channel);
}
/******************************************************************************/
/*Function :设置900频段子函数*/
/*Entrance :
//ChannelNumber-----设置的频点号
//CsNumber----------频点对应的硬件编号
//MType-------------移频类型:0---下行移频 1---上行移频 */
/*Return :0----所设置的频点不符合要求,1---频点设置成功 */
/******************************************************************************/
UNchar Set900FreqMove(UNint ChannelNumber, UNchar CsNumber,UNchar MType)
{
UNchar i;
UNint BaseFreq;
UNlong R_Value;
UNlong N_Value;
UNlong A_Value;
UNlong B_Value;
UNlong F_Value;
UNlong Fvco;
if((ChannelNumber <= 124)||((ChannelNumber >= 975) && (ChannelNumber <= 1023)))
{
if(MType==0)
{
if (ChannelNumber <= 124 )
BaseFreq = 9350; //935--954MHZ
else if ((ChannelNumber >= 975) && (ChannelNumber <= 1023))
BaseFreq = 7302; //9250-0.2*974=7302
}
else if(MType==1)
{
if (ChannelNumber <= 124 )
BaseFreq = 8900; //885---909MHZ
else if ((ChannelNumber >= 975) && (ChannelNumber <= 1023))
BaseFreq = 6852; //8800-0.2*974=6852
}
R_Value =0x000200;
F_Value =0x00092;
//under is parameter
Fvco=(ChannelNumber*2+ BaseFreq-1400)/32;
Fvco<<=7; //设置了B
B_Value=Fvco;
A_Value=(((ChannelNumber*2+ BaseFreq-1400)%32)<<2); //设置了A
N_Value=B_Value+A_Value+0x01;
// N_Value=0x7c89;
ADF4118_Drive(R_Value,F_Value, N_Value,CsNumber);
i=1;
}
else{
i=0;
}
return(i);
}
/******************************************************************************/
/*Function :设置1800频段子函数*/
/*Entrance :
//ChannelNumber-----设置的频点号
//Cs----------------频点对应的硬件编号
//MType-------------移频类型:0---下行移频 1---上行移频 */
/*Return :0----所设置的频点不符合要求,1---频点设置成功 */
/******************************************************************************/
UNchar Set1800FreqMove(UNint ChannelNumber, UNchar Cs,UNchar MType)
{
UNchar i;
UNlong BaseFreq1800;
UNlong R_Value;
UNlong N_Value;
UNlong A_Value;
UNlong B_Value;
UNlong F_Value;
UNlong Fvco;
if ((ChannelNumber >= 512) && (ChannelNumber <= 735))
{
if(MType==0)
BaseFreq1800 = 17028; //down 1805---1880 17028=1805-511*0.2
else if(MType==1)
BaseFreq1800 = 16078; //up 1710----1785 16124=1710-511*0.2
R_Value =0x000100;
F_Value =0x00092;
//under is parameter
Fvco=((ChannelNumber*2+BaseFreq1800-1400)/2)/32;
Fvco<<=7;
B_Value=Fvco;
A_Value=((((ChannelNumber*2+ BaseFreq1800-1400)/2)%32)<<2);
N_Value =B_Value+A_Value+0x01;
//N_Value=0x8239;
ADF4118_Drive(R_Value,F_Value, N_Value,Cs);
i=1;
}
else
i=0;
return(i);
}
/******************************************************************************/
UNchar Set900DownFreqSelect(unsigned int ChannelNumber,unsigned char CsNumber) //下行的900选频
{
UNchar i;
UNint BaseFreq;
UNlong R_Value;
UNlong N_Value;
UNlong A_Value;
UNlong B_Value;
UNlong F_Value;
UNlong Fvco;
if((ChannelNumber <= 124)||((ChannelNumber >= 975) && (ChannelNumber <= 1023)))
{
if (ChannelNumber <= 124 )
BaseFreq = 9350; //935--954MHZ
else if ((ChannelNumber >= 975) && (ChannelNumber <= 1023))
BaseFreq = 7302; //9250-0.2*974=7302
R_Value =0x000200;
F_Value =0x00093;
//under is parameter
Fvco=(ChannelNumber*2+ BaseFreq-710)/32;
Fvco<<=7; //设置了B
B_Value=Fvco;
A_Value=(((ChannelNumber*2+ BaseFreq-710)%32)<<2); //设置了A
N_Value=B_Value+A_Value+0x01;
// N_Value=0x7c89;
ADF4118_Drive(R_Value,F_Value, N_Value,CsNumber);
i=1;
}
else{
i=0;
}
return(i);
}
/******************************************************************************/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -