/*
*********************************************************************************************************
* Atmega168
* File : serial.C
* By : Jason Yang
* Version : V0.01
* Data : Jan 1, 2012
*********************************************************************************************************
*/
// 39M
// 8151 / 2090 8155/2091 = 39.00047824 12.26
#include "include.h"
ST_ADF4360_9_C ADF4360_regC;
ST_ADF4360_9_N ADF4360_regN;
ST_ADF4360_9_R ADF4360_regR;
INT8U ADF4360_wflag; // Write to chip
INT8U ADF4360_sflag; // Save to eeprom
INT32U ADF4360_ref;
INT32U ADF4360_Fset;
INT32U ADF4360_Dset;
INT32U ADF4360_Fppm;
INT32U ADF4360_Dppm;
/*
*********************************************************************************************************
* ADF4360_init
*
* Description :
* Arguments : Eep=0, write default setting, Eep=1: read setting from eeprom
* Returned Values :
* Note(s)/Warnings :
*********************************************************************************************************
*/
void ADF4360_init(INT8U Eep)
{
if(Eep == 0){
ADF4360_ref = 0;
*(INT32U *)&ADF4360_regC = 0;
*(INT32U *)&ADF4360_regN = 0;
*(INT32U *)&ADF4360_regR = 0;
ADF4360_set(ADF4360_DIVCNT, 0);
ADF4360_set(ADF4360_BCNT, 0);
ADF4360_set(ADF4360_BANDCLK, ADF4360_BANDCLK_8);
ADF4360_set(ADF4360_COREPOWER, ADF4360_COREPOWER_500);
}else{
ADF4360_eep_read(0, 0xFF);
}
ADF4360_regC.Bits = ADF4360_BITS_CTRL;
ADF4360_regN.Bits = ADF4360_BITS_NCNT;
ADF4360_regR.Bits = ADF4360_BITS_RCNT;
ADF4360_write(1);
ADF4360_eep_save(0,1);
}
/*
*********************************************************************************************************
* ADF4360_refset
*
* Description :
* Arguments : Ref=0:return RefClk; Ref>0: set, save and return RefClk
* Returned Values :
* Note(s)/Warnings : Auto write refclk to eeprom
*********************************************************************************************************
*/
INT32U ADF4360_refset(INT32U Ref)
{
if(Ref){
ADF4360_ref = Ref;
ADF4360_sflag |= 0x08;
}
return Ref;
}
/*
*********************************************************************************************************
* ADF4360_set
*
* Description :
* Arguments :
* Returned Values :
* Note(s)/Warnings :
*********************************************************************************************************
*/
INT8U ADF4360_set(INT8U Cmd, INT16U Dat)
{
switch(Cmd){
case ADF4360_COREPOWER: ADF4360_regC.CorePower = Dat; break;
case ADF4360_CNTRESET: ADF4360_regC.CntReset = Dat; break;
case ADF4360_DIVCTRL: ADF4360_regC.DivCtrl = Dat; break;
case ADF4360_PHASEPLRT: ADF4360_regC.PhasePlrt = Dat; break;
case ADF4360_CP3ST: ADF4360_regC.Cp3st = Dat; break;
case ADF4360_CPGAIN:
case ADF4360_CPGAIN2: ADF4360_regC.CpGain = Dat; ADF4360_regN.CpGain = Dat; break;
case ADF4360_MUTELD: ADF4360_regC.MuteLd = Dat; break;
case ADF4360_OUTPOWER: ADF4360_regC.OutPower = Dat; break;
case ADF4360_CURRENT1: ADF4360_regC.Current1 = Dat; break;
case ADF4360_CURRENT2: ADF4360_regC.Current2 = Dat; break;
case ADF4360_PWRDOWN: ADF4360_regC.PwrDown = Dat; break;
case ADF4360_DIVCNT: if(Dat < 2) Dat = 2; ADF4360_regN.DivCnt = Dat; break;
case ADF4360_BCNT: if(Dat < 3) Dat = 3; ADF4360_regN.Bcnt = Dat; break;
//case ADF4360_CPGAIN2: ADF4360_regN.CpGain = Dat; break;
case ADF4360_REFCNT: ADF4360_regR.RefCnt = Dat; break;
case ADF4360_ANTIPW: ADF4360_regR.AntiPW = Dat; break;
case ADF4360_LDPREC: ADF4360_regR.LDprec = Dat; break;
case ADF4360_TEST: ADF4360_regR.Test = Dat; break;
case ADF4360_BANDCLK: ADF4360_regR.BandClk = Dat; break;
default:
return 1;
}
ADF4360_wflag |= 1<<(Cmd/24);
ADF4360_sflag |= 1<<(Cmd/24);
return 0;
}
/*
*********************************************************************************************************
* ADF4360_get
*
* Description :
* Arguments :
* Returned Values : 0=OK 1=Error
* Note(s)/Warnings :
*********************************************************************************************************
*/
INT8U ADF4360_get(INT8U Cmd, INT16U *Dat)
{
INT16U Msk;
switch(Cmd){
case ADF4360_COREPOWER: *Dat = ADF4360_regC.CorePower; break;
case ADF4360_CNTRESET: *Dat = ADF4360_regC.CntReset; break;
case ADF4360_DIVCTRL: *Dat = ADF4360_regC.DivCtrl; break;
case ADF4360_PHASEPLRT: *Dat = ADF4360_regC.PhasePlrt; break;
case ADF4360_CP3ST: *Dat = ADF4360_regC.Cp3st; break;
case ADF4360_CPGAIN: *Dat = ADF4360_regC.CpGain; break;
case ADF4360_MUTELD: *Dat = ADF4360_regC.MuteLd; break;
case ADF4360_OUTPOWER: *Dat = ADF4360_regC.OutPower; break;
case ADF4360_CURRENT1: *Dat = ADF4360_regC.Current1; break;
case ADF4360_CURRENT2: *Dat = ADF4360_regC.Current2; break;
case ADF4360_PWRDOWN: *Dat = ADF4360_regC.PwrDown; break;
case ADF4360_DIVCNT: *Dat = ADF4360_regN.DivCnt; break;
case ADF4360_BCNT: *Dat = ADF4360_regN.Bcnt; break;
case ADF4360_CPGAIN2: *Dat = ADF4360_regN.CpGain ; break;
case ADF4360_REFCNT: *Dat = ADF4360_regR.RefCnt; break;
case ADF4360_ANTIPW: *Dat = ADF4360_regR.AntiPW; break;
case ADF4360_LDPREC: *Dat = ADF4360_regR.LDprec; break;
case ADF4360_TEST: *Dat = ADF4360_regR.Test; break;
case ADF4360_BANDCLK: *Dat = ADF4360_regR.BandClk; break;
default:
return 1;
}
return 0;
}
/*
*********************************************************************************************************
* ADF4360_write
*
* Description :
* Arguments : All=0: write according to ADF4360_wflag; All=1: write all
* Returned Values :
* Note(s)/Warnings :
*********************************************************************************************************
*/
static void _ADF4360HalWrite(INT32U Dat)
{
INT8U i;
ADF4360_CLK_OUT;
ADF4360_CLK_CLR;
ADF4360_DAT_OUT;
ADF4360_LE_CLR;
for(i = 0; i<24;i++){
if((Dat>> (23-i)) & 1)
ADF4360_DAT_SET;
else
ADF4360_DAT_CLR;
_NOP();_NOP();
ADF4360_CLK_SET;
_NOP();_NOP();
ADF4360_CLK_CLR;
}
_NOP();_NOP();
ADF4360_LE_SET;
ADF4360_CLK_TRI;
ADF4360_DAT_TRI;
}
void ADF4360_write(INT8U All)
{
if(All)
ADF4360_wflag = 0x07;
Pause_10uS(10);
if(ADF4360_wflag & 0x04)
_ADF4360HalWrite(*(INT32U *)&ADF4360_regR);
Pause_10uS(20);
if(ADF4360_wflag & 0x01)
_ADF4360HalWrite(*(INT32U *)&ADF4360_regC); //0
Pause_10uS(20);
if(ADF4360_wflag & 0x02)
_ADF4360HalWrite(*(INT32U *)&ADF4360_regN); //1
ADF4360_wflag = 0;
}
/*
*********************************************************************************************************
* ADF4360_eep_save, ADF4360_eep_read
*
* Description :
* Arguments :