⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad9856.c

📁 该程序是AD9856的驱动部分
💻 C
字号:
#include "msp430x14x.h" // Standard Equations
#include "ad9856.h"
#include "bitmat.h"

//BIT DEFINE
#define LD_BIT BIT0//P1.0
                
#define CS_BIT BIT7//P2.7
#define SDIO_BIT BIT6//P2.6
#define SCLK_BIT BIT5//P2.5
#define TXEN_BIT BIT4//P2.4
#define PS2_BIT BIT3//P2.3
#define PS1_BIT BIT2//P2.2
#define RESET_BIT BIT1//P2.1
#define PD_BIT BIT0//P2.0

#define LI_BIT BIT5//P2.5
#define LQ_BIT BIT6//P2.6

//OUT DEFINE
#define LD_OUT P1OUT

#define CS_OUT P2OUT
#define SDIO_OUT P2OUT
#define SCLK_OUT P2OUT
#define TXEN_OUT P2OUT
#define PS2_OUT P2OUT
#define PS1_OUT P2OUT
#define RESET_OUT P2OUT
#define PD_OUT P2OUT

#define LI_OUT P2OUT
#define LQ_OUT P2OUT

//DIR DEFINE
#define LD_DIR P1DIR

#define CS_DIR P2DIR
#define SDIO_DIR P2DIR
#define SCLK_DIR P2DIR
#define TXEN_DIR P2DIR
#define PS2_DIR P2DIR
#define PS1_DIR P2DIR
#define RESET_DIR P2DIR
#define PD_DIR P2DIR

#define LI_DIR P2DIR
#define LQ_DIR P2DIR

//IN DEFINE
#define LD_IN P1IN

#define CS_IN P2IN
#define SDIO_IN P2IN
#define SCLK_IN P2IN
#define TXEN_IN P2IN
#define PS2_IN P2IN
#define PS1_IN P2IN
#define RESET_IN P2IN
#define PD_IN P2IN

#define LI_IN P2IN
#define LQ_IN P2IN

#define power_up_8320() sbi(PD_DIR,PD_BIT);sbi(PD_OUT,PD_BIT)

#define sel_ps0() cbi(PS1_OUT,PS1_BIT);cbi(PS2_OUT,PS2_BIT)
#define sel_ps1() cbi(PS1_OUT,PS1_BIT);sbi(PS2_OUT,PS2_BIT)
#define sel_ps2() sbi(PS1_OUT,PS1_BIT);cbi(PS2_OUT,PS2_BIT)
#define sel_ps3() sbi(PS1_OUT,PS1_BIT);sbi(PS2_OUT,PS2_BIT)

char I_data = 0xff,Q_data = 0x93;

static char cfg_word[26] =
{
  0x20,0xd2,//16倍频 = 128MHz
  //0x06,0x12,//3倍频 = 60MHz
  
  0x66,0x66,0x66,0x15,//128 / 10.7
  //0xda,0x40,0xa7,0x2d,//60 / 10.7
  //0xab,0xaa,0xaa,0x2a,//120 / 20
  0x80,0x00,//内插率4 X 32 X 2,Fiq = 500k
  
  0x66,0x66,0x66,0x15,//128 / 10.7
  0x82,0x00,//内插率4 X 32 X 2,Fiq = 500k
  
  0x66,0x66,0x66,0x15,//128 / 10.7
  0x82,0x00,//内插率4 X 32 X 2,Fiq = 500k
  
  0x66,0x66,0x66,0x15,//128 / 10.7
  0x80,0x00,//内插率4 X 32 X 2,Fiq = 500k
};

/*************************************************/
//写一个字节到AD9856
/*************************************************/
void AD9856WriteByte(char address, char *data,int lengh)
{ 
  unsigned int ByteCounter,BitCounter;
  address &= ~0xe0;
  address += (((lengh - 1) & 0x03) << 5);
  
  cbi(CS_OUT,CS_BIT);
  
  for(BitCounter = 8;BitCounter;BitCounter --)
  {
    cbi(SCLK_OUT,SCLK_BIT);
    if(address & (1 << (BitCounter - 1)))
    {
      sbi(SDIO_OUT,SDIO_BIT);
    }
    else
    {
      cbi(SDIO_OUT,SDIO_BIT);
    }
    sbi(SCLK_OUT,SCLK_BIT);
  }
  
  for(ByteCounter = 0;ByteCounter < lengh;ByteCounter ++) 
  {
    for(BitCounter = 8;BitCounter;BitCounter --)
    {
      cbi(SCLK_OUT,SCLK_BIT);
      if(data[ByteCounter] & (1 << (BitCounter - 1)))
      {
        sbi(SDIO_OUT,SDIO_BIT);
      }
      else
      {
        cbi(SDIO_OUT,SDIO_BIT);
      }
      sbi(SCLK_OUT,SCLK_BIT);
    }
  }
  
  sbi(CS_OUT,CS_BIT);
}

void change_mode(char mode)
{
  if(mode)//Single-tone Mode
  {
    cfg_word[1] |= 0x10;
  }
  else
  {
    cfg_word[1] &= ~0x10;
  }
  AD9856WriteByte(1,cfg_word + 1,1);
}

void set_in_rate(char rate)
{
  cfg_word[6] &= 0x03;
  cfg_word[6] |= rate << 2;
  AD9856WriteByte(6,cfg_word + 6,1);
}

void delay(void)
{
  char i;
  for(i=0;i<200;i++);
}

void write_iq(char data_i,char data_q)
{
  P1DIR = 0xff;
  
  cbi(LI_OUT,LI_BIT);
  P1OUT = data_i;
  sbi(LI_OUT,LI_BIT);
  cbi(LI_OUT,LI_BIT);
  
  cbi(LQ_OUT,LQ_BIT);
  P1OUT = data_q;
  sbi(LQ_OUT,LQ_BIT);
  cbi(LQ_OUT,LQ_BIT);
  
  sbi(TXEN_OUT,TXEN_BIT);
  //delay();
  //cbi(TXEN_OUT,TXEN_BIT);
}

/*************************************************/
//初始化AD9856
/*************************************************/
void init_ad9856(void)
{
  char i;
  
  sbi(PS1_DIR,PS1_BIT);
  sbi(PS2_DIR,PS2_BIT);
  cbi(PS1_OUT,PS1_BIT);
  cbi(PS2_OUT,PS2_BIT);
  
  sbi(SDIO_DIR,SDIO_BIT);
  sbi(CS_DIR,CS_BIT);
  sbi(SCLK_DIR,SCLK_BIT);
  
  sbi(TXEN_DIR,TXEN_BIT);
  cbi(TXEN_OUT,TXEN_BIT);
  
  sbi(LD_DIR,LD_BIT);
  
  P1DIR = 0xff;
  
  sbi(RESET_DIR,RESET_BIT);
  
  sbi(RESET_OUT,RESET_BIT);
  for(i = 0;i < 200;i ++)
  {
    delay();
  }
  cbi(RESET_OUT,RESET_BIT);
  
  for(i = 0;i < 26;i ++)
  {
    AD9856WriteByte(i,cfg_word + i,1);
  }
    
  power_up_8320();
  
  change_mode(0);//~ Single-tone Mode
  
  write_iq(0xff,0x3f);
  
  while(1)
  {
    //write_iq(0xff,0x3f);
    sel_ps0();
    delay();
    sel_ps1();
    delay();
  }
  sel_ps2();
  sel_ps3();
  sel_ps0();
}

/*************************************************/
//关闭AD9856
/*************************************************/

void un_init_ad9856(void)
{
  cfg_word[1] |= 0x20;
  AD9856WriteByte(1,cfg_word + 1,1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -