现在的位置: 首页 > 综合 > 正文

C8051F310配置ADF4106和max2150

2018年02月01日 ⁄ 综合 ⁄ 共 5684字 ⁄ 字号 评论关闭

/******************** (C) COPYRIGHT 2013 xxxx  Cor. *****************************
* File Name          : main.c
* Author             : xxxx
* 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);
}
  }
}

//TIME0中断
void Timer0_Isr(void) interrupt 1
{
  TL0 = 0x00;
  TH0 = 0xF0;
  Number --;
  if(Number == 0){
   Number = 400;
   if(!LD2){
       Config_4106(freq_val); 
    }
  }
}

#if 0
/*********************************************************
** 函数名: Calc_4106
** 功能描述:  (B*P+A)*F_PFD = RFout,计算N
** 输 入:  RFout输出频率,F_PFD鉴相频率
** 输 出:  N寄存器内容
*********************************************************/
uint Calc_4106(uint RFout,uchar F_PFD)
{
    uint  N;
    uchar A,B;
RFout /= F_PFD;
B = (uint)(RFout/8);//Prescaler=8
A = RFout - 8*B;
N = B<<8 | (int)A<<2 | 1;
return N;
}

/*********************************************************
** 函数名: Calc_2150
** 输 入: F_lo输出频率,F_comp鉴相频率
** 输 出:  N寄存器内容 
** 功能描述:  计算2150
** 全局变量:  无
*********************************************************/
void Calc_2150(uint F_lo,uchar F_comp)
{
    float D;
    uchar N;
uint word1,word2,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
//-----------------------------------------------------------------------------

抱歉!评论已关闭.