📄 adf4001.c
字号:
#include<avr/io.h>
#define uchar unsigned char
#define ulong unsigned long
#define nop() __asm__ __volatile__ ("nop");
#define ADF4110_CONTROL PORTB
#define ADF4110_DDR DDRB
#define ADF4110_LE_H ADF4110_CONTROL|=_BV(PB0)
#define ADF4110_LE_L ADF4110_CONTROL&=~_BV(PB0)
#define ADF4110_DATA_H ADF4110_CONTROL|=_BV(PB1)
#define ADF4110_DATA_L ADF4110_CONTROL&=~_BV(PB1)
#define ADF4110_CLK_H ADF4110_CONTROL|=_BV(PB2)
#define ADF4110_CLK_L ADF4110_CONTROL&=~_BV(PB2)
#define ADF4110_CE_H ADF4110_CONTROL|=_BV(PB3)
#define ADF4110_CE_L ADF4110_CONTROL&=~_BV(PB3)
volatile unsigned long test_data;///////////////////////test/////////////////////
void delayN(unsigned int N)
{ unsigned int i;
for(i=0;i<N;i++)
nop();
}
void ADF4110_data_input(unsigned long data)
{ uchar i=0;
uchar N=24;
do
{ test_data=0x800000>>i;////////////////test///////////
test_data=test_data&data; /////test///////////
if(test_data!=0 )
{ ADF4110_DATA_H;
}
else
{ ADF4110_DATA_L;
}
ADF4110_CLK_H;
i++;
ADF4110_CLK_L;
}while(--N);
ADF4110_LE_H;
ADF4110_LE_L;
}
void ADF4110_INT()
{ ADF4110_DDR|=_BV(0)|_BV(1)|_BV(2)|_BV(3); //把ADF4110_DDR设置成输出,但不影响剩下的IO口
//ADF4110_CONTROL&=(~_BV(0))&(~_BV(1))&(~_BV(2));//把ADF4110的用到的四个断口输出置为0
ADF4110_LE_L;
ADF4110_CLK_L;
ADF4110_DATA_L;
ADF4110_CE_H;
}
/********************************************************************************************
函数adf4110_control 的入口参数: lock_frequency 为需要锁定的频率(adf4110要大于80M)
step_frequency 为频率的步进(也就是参考分频器的输出频率) FREFin_frequency 为晶振频率
以上参数的单位都是HZ
********************************************************************************************/
void adf4110_control(ulong lock_frequency,ulong step_frequency,ulong FREFin_frequency)
{ ulong adf4110_data;
ulong N;
adf4110_data=0x1ff893;//极性:正
//adf4110_data=0x1ff813;//极性:负
ADF4110_data_input(adf4110_data);//set initialization latch,P=8 fastlock mode disabled, Icp=5ma
delayN(40);//延时60us
adf4110_data=0x020000|( (FREFin_frequency/step_frequency)<<2 );
ADF4110_data_input(adf4110_data);//set R latch
delayN(40);//延时60us
N=lock_frequency/step_frequency;
adf4110_data=0x000001|(N<<8);
ADF4110_data_input(adf4110_data);//set AB latch
}
void main()
{ ADF4110_INT();
adf4110_control(34000000,100000,5000000);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -