/******************** (C) COPYRIGHT 2013 JZDF Cor. *****************************
* File Name : main.c
* Author : Liuyong
* Version : V1.0.0
* Date : 08/10/2013
* Description : 根据外部信号配置MAX2150ETI和ADF4106BRU。
发射频率源MAX2150ETI配置要求
参考频率:20MHz
鉴相频率:20MHz
输出频率:999M~1121MHz
接收频率源ADF4106BRU配置要求
参考频率:20MHz
鉴相频率:1MHz
*******************************************************************************/
#include "C8051F310.h"
#include "public.h"
//输入引脚定义
//sbit freq_0 = P1^2; //输入频率码低位
//sbit freq_1 = P1^3;
//sbit freq_2 = P1^4;
//sbit freq_3 = P1^5;
//sbit freq_4 = P1^6;
//sbit freq_5 = P1^7; //输入频率码高位
//sbit BIT_EN_In = P1^1; //校准使能信号
//sbit mod_SSR_IFF = P1^0;//模式选择(1=IFF,0=SSR)
sbit Ask_In = P0^7; //ASK输入
//输出引脚定义
sbit Ask_Out1 = P0^6; //ASK输出,当选择发射时该端口输出与P0.7脚信号一致,当校准模式时该端口输出一个固定的低电平
sbit SW = P0^5; //模式选择,根据BIT_EN来选择,当BIT_EN有效时,该引脚输出高电平,平时默认为低电平
sbit Ask_Out2 = P0^4; //ASK输出,当选择校准模式时该端口输出与P0.7脚信号一致,当发射模式时该端口输出一个固定的低电平
sbit VTT = P0^2; //当P1.0~IFF/SSR引脚为高时,该端口输出低电平;当P1.0~IFF/SSR引脚为低时,该端口输出高电平
sbit BIT_EN_Out = P2^2; //校准使能信号,与P1.1的状态保持一致
//发射频率源
sbit LE1 = P2^3;
sbit DATA1 = P2^4;
sbit CLK1 = P2^5;
sbit LD1 = P2^6;
//接收频率源
sbit CLK2 = P3^4;
sbit DATA2 = P3^3;
sbit LE2 = P3^2;
sbit LD2 = P3^1;
uchar freq_val = 0;
uchar old = 0xff;
uint Number = 400;
/*********************************************************
** 函数名: Reset_Sources_Init
** 功能描述: 时钟丢失时允许复位
** 输 入: None
** 输 出: None
*********************************************************/
void Reset_Sources_Init()
{
RSTSRC = 0x04;
}
//允许TIME0中断
void Interrupts_Init()
{
IE = 0x02;
}
void Timer_Init()
{
TCON = 0x10;
TMOD = 0x01;
TL0 = 0x00;
TH0 = 0xF0;
}
/*********************************************************
** 函数名: Port_IO_Init
** 功能描述: IO口配置
** 输 入: None
** 输 出: None
*********************************************************/
void Port_IO_Init()
{
// P1 Open-Drain
P1MDOUT = 0x00;
P0MDOUT = 0x7F;// P0.7 Open-Drain
// P2MDOUT = 0xEF;//DATA1,DATA2 Open-Drain
P2MDOUT = 0x3F;
//P3MDOUT = 0x17;
P3MDOUT = 0xFC;
XBR1 = 0x40;
}
/*********************************************************
** 函数名: Oscillator_Init
** 功能描述: 禁止看门狗,及内部时钟配置(24.5M)
** 输 入: None
** 输 出: None
*********************************************************/
void Oscillator_Init()
{
PCA0MD &=~0x40;
PCA0MD = 0x00;
OSCICN = 0xc3;
}
/*********************************************************
** 函数名: Delay
** 功能描述: 延时函数
** 输 入: time
** 输 出: None
*********************************************************/
void Delay(uint time)
{
while(--time);
}
/*********************************************************
** 函数名: Init_Device
** 功能描述: 初始化
** 输 入: None
** 输 出: None
*********************************************************/
void Init_Device(void)
{
Reset_Sources_Init();
Port_IO_Init();
Oscillator_Init();
Timer_Init();
Interrupts_Init();
Delay(10);
}
/*********************************************************
** 函数名: Config_4106
** 功能描述: 配置ADF4106
** 输 入: index1,具体看tab_4106表
** 输 出: None
*********************************************************/
void Config_4106(uchar index1)
{
uchar i,j,k;
uchar m;
LE2 = 0;
CLK2 = 0;
m = 0;
for(i = 0;i < 12;i ++){
k = tab_4106[index1][i];
for(j = 0;j < 8;j++){
DATA2 = k & 0x80;
Delay(1);
CLK2 = 1;
Delay(1);
k<<=1;
CLK2 = 0;
}
m++;
if(m >= 3){//3字节一送
m = 0;
LE2 = 1;
Delay(1);
LE2 = 0;
}
}
LE2 = 1;
}
/*********************************************************
** 函数名: send_data
** 功能描述: SPI发送16bit数据
** 输 入: temp
** 输 出: None
*********************************************************/
void send_data(uint temp){
uchar i;
Delay(10);
LE1=0;
Delay(2);
CLK1=0;
for(i=0;i<16;i++){
temp<<=1;
DATA1=CY;
Delay(2);
CLK1=1;
Delay(2);
CLK1=0;
}
CLK1=0;
Delay(2);
DATA1=0;
Delay(2);
LE1=1;
Delay(10);
}
/*********************************************************
** 函数名: Config_2150
** 功能描述: 配置MAX2150
** 输 入: index,tab_max2150数组下表
** 输 出: None
*********************************************************/
void Config_2150(uchar index){
send_data(tab_max2150[index*3] );
send_data(tab_max2150[index*3+1]);
send_data(tab_max2150[index*3+2]);
}
/*********************************************************
** 函数名: main
** 功能描述: 主函数
** 输 入: None
** 输 出: None
*********************************************************/
void main()
{
bool cal_mode = 0;
bool cal_mode1 = 0;
Init_Device();
SW=0;
send_data(0x107F);//max2150第四个word
EA = 1;
while(1){
P1 = 0xff;
freq_val = 0;
freq_val = P1;
//cal_mode = BIT_EN_In;//TODO
if(freq_val & 0x02) cal_mode = 1;
else cal_mode = 0;
if(freq_val & 0x01) cal_mode1 = 1;
else cal_mode1 = 0;
SW = cal_mode;
BIT_EN_Out = cal_mode;//校准使能
VTT = !cal_mode1;//0:SSR,1:IFF
if(cal_mode){//校准模式
Ask_Out1 = 0;//ASK1:ASK输出
Ask_Out2 = Ask_In;
}else{//发射模式
Ask_Out1 = Ask_In;
Ask_Out2 = 0;
}
//VTT = !mod_SSR_IFF;//0:SSR,1:IFF
//BIT_EN_Out = BIT_EN_In;//校准使能
///
freq_val = (freq_val>>2) & 0x3F;
///
if(old != freq_val){//变化则重新配置
old = freq_val;
Config_4106(freq_val);
Config_2150(freq_val);
}
}
5?
//TIME0中断
void Timer0_I{r(void) interrtpt 1
{
TL0 = 0x00;
TH0 = 0xF0;
Nember --;
if(Number == 0){
$ Number = 400;
if(!LD2){
( Colfig_5106(freq_val);
! }
}
}
#if 0
/********j*******************
**"**********?**********
**
** 数蜜: Calc_4106
** 甫能描蕍: (B*P+A)*F_PFD =`RFout,计算N
** 输 离: RFnut输出频率F_PFD鉴相频翵
** 输 出: N寄存器内容
*:****?*************************************************/
uilt Calc_4106(鮥nt RFout,uchar F_PFD)
{
$ uint N;
uchAr A,B;
RFout /= F_PVD;
B = (uint)(RFout/8);'/Prescaler=8
a = RFouu - 8*B;
N = B<<8 | iot)<<3 } 1;
return N;
}
/***(*******+********
*"?*************:***j**************
** 函数名: (Calc_2150
+* 蠕 入: F_lo输出频率,F_co}p鉴相频率
J** 蠕$出: N寄存器内容
** 功能描述: 计算615?J**$全局变量: 无
************************************ ***(**********?****/
void Calc_2150(uint G_lo,uchar F_comp)
{
float D;
$ qchar N;
Uint$word1,wort2,word3,FH,FL;
ulong F;
D = (float)F_lo/(float)F_comp;
N = (uchar)D;
F = (D*100-N*100)/100*268435456;//pow(2,28) 13421772.8 0.04999924
FH = (ulong)F>>14;
FL = (ulong)F & 0x0077; // FL = (ulong)F & 0x3FFF;
word1 = FH<<2;
word2 = (FL<<2)+1;
word3 = 18<<10 | N<<2 | 2;
}
#endif
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------
* File Name : main.c
* Author : Liuyong
* Version : V1.0.0
* Date : 08/10/2013
* Description : 根据外部信号配置MAX2150ETI和ADF4106BRU。
发射频率源MAX2150ETI配置要求
参考频率:20MHz
鉴相频率:20MHz
输出频率:999M~1121MHz
接收频率源ADF4106BRU配置要求
参考频率:20MHz
鉴相频率:1MHz
*******************************************************************************/
#include "C8051F310.h"
#include "public.h"
//输入引脚定义
//sbit freq_0 = P1^2; //输入频率码低位
//sbit freq_1 = P1^3;
//sbit freq_2 = P1^4;
//sbit freq_3 = P1^5;
//sbit freq_4 = P1^6;
//sbit freq_5 = P1^7; //输入频率码高位
//sbit BIT_EN_In = P1^1; //校准使能信号
//sbit mod_SSR_IFF = P1^0;//模式选择(1=IFF,0=SSR)
sbit Ask_In = P0^7; //ASK输入
//输出引脚定义
sbit Ask_Out1 = P0^6; //ASK输出,当选择发射时该端口输出与P0.7脚信号一致,当校准模式时该端口输出一个固定的低电平
sbit SW = P0^5; //模式选择,根据BIT_EN来选择,当BIT_EN有效时,该引脚输出高电平,平时默认为低电平
sbit Ask_Out2 = P0^4; //ASK输出,当选择校准模式时该端口输出与P0.7脚信号一致,当发射模式时该端口输出一个固定的低电平
sbit VTT = P0^2; //当P1.0~IFF/SSR引脚为高时,该端口输出低电平;当P1.0~IFF/SSR引脚为低时,该端口输出高电平
sbit BIT_EN_Out = P2^2; //校准使能信号,与P1.1的状态保持一致
//发射频率源
sbit LE1 = P2^3;
sbit DATA1 = P2^4;
sbit CLK1 = P2^5;
sbit LD1 = P2^6;
//接收频率源
sbit CLK2 = P3^4;
sbit DATA2 = P3^3;
sbit LE2 = P3^2;
sbit LD2 = P3^1;
uchar freq_val = 0;
uchar old = 0xff;
uint Number = 400;
/*********************************************************
** 函数名: Reset_Sources_Init
** 功能描述: 时钟丢失时允许复位
** 输 入: None
** 输 出: None
*********************************************************/
void Reset_Sources_Init()
{
RSTSRC = 0x04;
}
//允许TIME0中断
void Interrupts_Init()
{
IE = 0x02;
}
void Timer_Init()
{
TCON = 0x10;
TMOD = 0x01;
TL0 = 0x00;
TH0 = 0xF0;
}
/*********************************************************
** 函数名: Port_IO_Init
** 功能描述: IO口配置
** 输 入: None
** 输 出: None
*********************************************************/
void Port_IO_Init()
{
// P1 Open-Drain
P1MDOUT = 0x00;
P0MDOUT = 0x7F;// P0.7 Open-Drain
// P2MDOUT = 0xEF;//DATA1,DATA2 Open-Drain
P2MDOUT = 0x3F;
//P3MDOUT = 0x17;
P3MDOUT = 0xFC;
XBR1 = 0x40;
}
/*********************************************************
** 函数名: Oscillator_Init
** 功能描述: 禁止看门狗,及内部时钟配置(24.5M)
** 输 入: None
** 输 出: None
*********************************************************/
void Oscillator_Init()
{
PCA0MD &=~0x40;
PCA0MD = 0x00;
OSCICN = 0xc3;
}
/*********************************************************
** 函数名: Delay
** 功能描述: 延时函数
** 输 入: time
** 输 出: None
*********************************************************/
void Delay(uint time)
{
while(--time);
}
/*********************************************************
** 函数名: Init_Device
** 功能描述: 初始化
** 输 入: None
** 输 出: None
*********************************************************/
void Init_Device(void)
{
Reset_Sources_Init();
Port_IO_Init();
Oscillator_Init();
Timer_Init();
Interrupts_Init();
Delay(10);
}
/*********************************************************
** 函数名: Config_4106
** 功能描述: 配置ADF4106
** 输 入: index1,具体看tab_4106表
** 输 出: None
*********************************************************/
void Config_4106(uchar index1)
{
uchar i,j,k;
uchar m;
LE2 = 0;
CLK2 = 0;
m = 0;
for(i = 0;i < 12;i ++){
k = tab_4106[index1][i];
for(j = 0;j < 8;j++){
DATA2 = k & 0x80;
Delay(1);
CLK2 = 1;
Delay(1);
k<<=1;
CLK2 = 0;
}
m++;
if(m >= 3){//3字节一送
m = 0;
LE2 = 1;
Delay(1);
LE2 = 0;
}
}
LE2 = 1;
}
/*********************************************************
** 函数名: send_data
** 功能描述: SPI发送16bit数据
** 输 入: temp
** 输 出: None
*********************************************************/
void send_data(uint temp){
uchar i;
Delay(10);
LE1=0;
Delay(2);
CLK1=0;
for(i=0;i<16;i++){
temp<<=1;
DATA1=CY;
Delay(2);
CLK1=1;
Delay(2);
CLK1=0;
}
CLK1=0;
Delay(2);
DATA1=0;
Delay(2);
LE1=1;
Delay(10);
}
/*********************************************************
** 函数名: Config_2150
** 功能描述: 配置MAX2150
** 输 入: index,tab_max2150数组下表
** 输 出: None
*********************************************************/
void Config_2150(uchar index){
send_data(tab_max2150[index*3] );
send_data(tab_max2150[index*3+1]);
send_data(tab_max2150[index*3+2]);
}
/*********************************************************
** 函数名: main
** 功能描述: 主函数
** 输 入: None
** 输 出: None
*********************************************************/
void main()
{
bool cal_mode = 0;
bool cal_mode1 = 0;
Init_Device();
SW=0;
send_data(0x107F);//max2150第四个word
EA = 1;
while(1){
P1 = 0xff;
freq_val = 0;
freq_val = P1;
//cal_mode = BIT_EN_In;//TODO
if(freq_val & 0x02) cal_mode = 1;
else cal_mode = 0;
if(freq_val & 0x01) cal_mode1 = 1;
else cal_mode1 = 0;
SW = cal_mode;
BIT_EN_Out = cal_mode;//校准使能
VTT = !cal_mode1;//0:SSR,1:IFF
if(cal_mode){//校准模式
Ask_Out1 = 0;//ASK1:ASK输出
Ask_Out2 = Ask_In;
}else{//发射模式
Ask_Out1 = Ask_In;
Ask_Out2 = 0;
}
//VTT = !mod_SSR_IFF;//0:SSR,1:IFF
//BIT_EN_Out = BIT_EN_In;//校准使能
///
freq_val = (freq_val>>2) & 0x3F;
///
if(old != freq_val){//变化则重新配置
old = freq_val;
Config_4106(freq_val);
Config_2150(freq_val);
}
}
5?
//TIME0中断
void Timer0_I{r(void) interrtpt 1
{
TL0 = 0x00;
TH0 = 0xF0;
Nember --;
if(Number == 0){
$ Number = 400;
if(!LD2){
( Colfig_5106(freq_val);
! }
}
}
#if 0
/********j*******************
**"**********?**********
**
** 数蜜: Calc_4106
** 甫能描蕍: (B*P+A)*F_PFD =`RFout,计算N
** 输 离: RFnut输出频率F_PFD鉴相频翵
** 输 出: N寄存器内容
*:****?*************************************************/
uilt Calc_4106(鮥nt RFout,uchar F_PFD)
{
$ uint N;
uchAr A,B;
RFout /= F_PVD;
B = (uint)(RFout/8);'/Prescaler=8
a = RFouu - 8*B;
N = B<<8 | iot)<<3 } 1;
return N;
}
/***(*******+********
*"?*************:***j**************
** 函数名: (Calc_2150
+* 蠕 入: F_lo输出频率,F_co}p鉴相频率
J** 蠕$出: N寄存器内容
** 功能描述: 计算615?J**$全局变量: 无
************************************ ***(**********?****/
void Calc_2150(uint G_lo,uchar F_comp)
{
float D;
$ qchar N;
Uint$word1,wort2,word3,FH,FL;
ulong F;
D = (float)F_lo/(float)F_comp;
N = (uchar)D;
F = (D*100-N*100)/100*268435456;//pow(2,28) 13421772.8 0.04999924
FH = (ulong)F>>14;
FL = (ulong)F & 0x0077; // FL = (ulong)F & 0x3FFF;
word1 = FH<<2;
word2 = (FL<<2)+1;
word3 = 18<<10 | N<<2 | 2;
}
#endif
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------