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

📄 ad9854.c

📁 430 iar F1612对 AD9854的操作
💻 C
字号:
#ifndef uchar
  #define uchar unsigned char
  #endif

//#define msp430 FQ439
#define msp430 F16

//#define parameter parrel
#define parameter seri

#define seri 1
#define parrel 0

#define FQ439  1
#define F16    0

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define bool char
#define true 1
#define false 0

#define SINGLETONE 0
#define FSK 1
#define RAMPEDFSK 2
#define CHIRP 3
#define BPSK 4

#if( msp430 == 1 )
#include  <msp430x43x.h>
#endif
#if( msp430 == 0 )
#include  <msp430x16x.h>
#endif

//////////////////////////////////////
/*
定义引脚
*/

#define MRESET P2DIR |= BIT0
#define RESETHIGH P2OUT |= BIT0
#define RESETLOW P2OUT &= ~BIT0

#define SHAPEKEYING P3DIR |= BIT6
#define SHAPEKEYINGHIGH P3OUT |= BIT6
#define SHAPEKEYINGLOW P3OUT &= ~BIT6

#define FBH P3DIR |= BIT4
#define FBHHIGH P3OUT |= BIT4
#define FBHLOW P3OUT &= ~BIT4

#define UPDATE P3DIR |= BIT0
#define UPDATEHIGH P3OUT |= BIT0
#define UPDATELOW P3OUT &= ~BIT0


////// P2.7 ~ P2.2 ADDR 
////// P2.1 -- > RD
////// P2.0 -- > MASTER_RESET
////// P1 --- > DATA
/////  
#if( parameter == 0 )  // parrel 

#define DOUT P1DIR |= 0xff
#define DIN  P1DIR &= ~0xff
#define DATAOUT P1OUT
#define DATAIN P1IN

#define SADDR P2DIR |= 0xfc
#define ADDR P2OUT

#define RD P2DIR |= BIT1
#define RDHIGH P2OUT |= BIT1
#define RDLOW P2OUT &= ~BIT1

#define WR P3DIR |= BIT2
#define WRHIGH P3OUT |= BIT2
#define WRLOW P3OUT &= ~BIT2

#endif

#if( parameter == 1 )   // mode = 1 serries mode

//-------------IO PRESET--------------//
// P2.0- UD_CLK;     P2.1(SIMO)- SDIO;
// P2.2(SOMI)-SDO;   P2.3- UCLK;
// P2.4- /CS;        P2.5- SHAPED KEY;
// P2.6- IO RST;     P2.7- RST;
//------------------------------------//

#define HADEINIT P2OUT = 0xff;P2DIR = 0xff;P3OUT=0xff;P3DIR=0xFe

#define IORESET P2DIR |= BIT4
#define IORESETHIGH P2OUT |= BIT4
#define IORESETLOW P2OUT &= ~BIT4

#define SDO P2DIR |= BIT3
#define SDOHIGH P2OUT |= BIT3
#define SDOLOW P2OUT &= ~BIT3

#define SDIO P2DIR |= BIT2
#define SDIOHIGH P2OUT |= BIT2
#define SDIOLOW P2OUT &= ~BIT2

#define SCLK P3DIR |= BIT2
#define SCLKHIGH P3OUT |= BIT2
#define SCLKLOW P3OUT &= ~BIT2

#define CSB P2DIR |= BIT1
#define CSBHIGH P2OUT |= BIT1
#define CSBLOW P2OUT &= ~BIT1

#define SDIO_IN   P2DIR&=~BIT2  //数据线选择输入
#define SDIO_OUT  P2DIR|=BIT2   //数据线选择输出
#define SDIO_DATA P2IN&BIT2     //数据线上的输入数据

#define ORAMP_H  P3OUT |= BIT7
#define ORAMP_L  P3OUT &= ~BIT7

#define IOSYNC_H  P2OUT|=BIT4   //i/o操作同步,为高时当前I/O操作立即结束
#define IOSYNC_L  P2OUT&=~BIT4


#endif
/////////////////////////////////////
/*
公用函数  delay_9854 ( uint ) MRST() IOUpdata()
*/
void delay_9854(uint time)
{
    uint i;
    for(i = 0; i < time; i++)
    {
        _NOP();
        _NOP();
        _NOP();
        _NOP();
    }
}

void MRST(void)
{
   RESETHIGH;
   delay_9854(5000);
   RESETLOW;
}

void IOUpdate(void)
{
    UPDATELOW;
    delay_9854(5);
    UPDATEHIGH;
    delay_9854(5);
    UPDATELOW;
}

#if( parameter == 0 )  // parrel
uint systemclk;

void ParallelSendByte(uchar addr, uchar data)
{
    DOUT;
    WRHIGH;
    ADDR = (addr & 0x3f);
    WRLOW;
    DATAOUT = data;
    WRHIGH;
}

uchar ParallelReadByte(uchar addr)
{
    uchar result;
    DIN;
    RDHIGH;
    ADDR = (addr & 0x3f);
    RDLOW;
    result = DATAIN;
    RDHIGH;
    return result;
}

void ParallelSetReg(uchar saddr, uchar *data, uchar n)
{
    uchar i;
    for(i = 0; i < n; i++)
    {
        ParallelSendByte(saddr + i, *data);
        data++;
    }
    IOUpdate();
}

void ParallelSetPhase(uchar saddr, float phase)
{
    uchar temp[2];
    uchar ph;
    
    ph = (uint) (phase * 45.51111111);
    ph = ph & 0x3fff;
    temp[0] = ph / 256;
    temp[1] = ph % 256;
    ParallelSetReg(saddr, temp, 2);
}

void ParallelSetPhase1(float phase)
{
    ParallelSetPhase(0, phase);
}

void ParallelSetPhase2(float phase)
{
    ParallelSetPhase(2, phase);
}

void ParallelSetFreq(uchar saddr, double freq)
{
    double ftw1;
    double t;
    uchar i;
    uchar temp[6];
    ftw1 = (freq * 281474976.710656 / (double) systemclk);
    t = (double)  (1099511627776);
    for(i = 0; i < 6; i++)
    {
        temp[i] = (uchar) (ftw1 / t);
        ftw1 = ftw1 - temp[i] * t;
        t = t / 256.0;
    }
    ParallelSetReg(saddr, temp, 6);
}

void ParallelSetFTW1(double freq)
{
    ParallelSetFreq(4, freq);
}

void ParallelSetFTW2(double freq)
{
    ParallelSetFreq(0x0a, freq);
}

void ParallelSetDFW(double freq)
{
    ParallelSetFreq(0x10, freq);
}

void ParallelSetUDClk(ulong clk)
{
    uchar temp[4];
    long t;
    uchar i;
    t = 16777216;
    for (i = 0; i < 4; i++)
    {
        temp[i] = clk / t;
        clk = clk % t;
        t =  t >> 8;
    }
    ParallelSetReg(0x16, temp, 4);
}

void ParallelSetRRClk(ulong clk)
{
    uchar temp[3];
    long t;
    uchar i;
    t = 65536;
    for (i = 0; i < 3; i++)
    {
        temp[i] = clk / t;
        clk = clk % t;
        t = t >> 8;
    }
    ParallelSetReg(0x1a, temp, 3);
}

void ParallelSetOutShapeKey(uchar saddr, uint amplitude)
{
    uchar temp[2];
    temp[0] = amplitude / 256;
    temp[1] = amplitude % 256;
    ParallelSetReg(saddr, temp, 2);
}

void ParallelSetOSKI(uint amplitude)
{
    ParallelSetOutShapeKey(0x21, amplitude);
}

void ParallelSetOSKQ(uint amplitude)
{
    ParallelSetOutShapeKey(0x23, amplitude);
}

void ParallelSetOSKRAMPRATE(uchar rate)
{
    ParallelSetReg(0x25, &rate,1);
}

void ParallelSetQDAC(uint data)
{
   uchar temp[2];
   temp[0] = data / 256;
   temp[1] = data % 256;
   ParallelSetReg(0x26, temp, 2);
}

void ParallelPowerDown(bool flag)
{
    uchar data;
    if (flag == true)
        data = 0x17;
    else
        data = 0x00;
   ParallelSetReg(0x1d, &data, 1);
}

void ParallelSetRefClk(uchar times)
{
    uchar data;
    if(times >=  4)
    {
        data = 0x20;
        if (times >= 10)
            data |= 0x40;
        data |= times;
        systemclk = systemclk * times;
        ParallelSetReg(0x1e, &data, 1);
    }
}

void ParallelSetMode(bool triangle, bool qdac, uchar mode)
{
    uchar data;
    data = (mode << 1);
    if (triangle == true)
        data |= 0x20;
    if (qdac == true)
        data |= 0x10;
    ParallelSetReg(0x1f, &data, 1);
}

void ParallelSetOSK(bool bypass, bool osken, bool oskint)
{
    uchar data;
    data = 0;
    if (bypass == true)
        data |= 0x40;
    if (osken == true)
        data |= 0x20;
    if (oskint == true)
        data |= 0x10;
    ParallelSetReg(0x20, &data, 1);
}

void Init9854(void)
{
    DOUT;
    SADDR;
    RD;
    WR;
    MRESET;
    SHAPEKEYING;
    FBH;
    UPDATE;
    MRST();
    SHAPEKEYINGLOW;
    FBHLOW;
    WRHIGH;
    RDHIGH;
    systemclk = 20;
    ParallelPowerDown(false);
    ParallelSetRefClk(4);
    ParallelSetMode(false, false, SINGLETONE);
    ParallelSetOSK(false, false, false);
}

void SingleTone(float freq, ulong amplitude)
{
    ParallelSetMode(false, false, SINGLETONE);
    ParallelSetFTW1(freq);
    ParallelSetOSKI(amplitude);
    ParallelSetOSKQ(amplitude);
}

void UnrampedFSK(float freq1, float freq2)
{
    ParallelSetMode(false, false, FSK);
    ParallelSetFTW1(freq1);
    ParallelSetFTW2(freq2);
}

void RampedFSK(bool triangle, float freq1, float freq2, float rampedfreq, ulong rrclk)
{
    ParallelSetMode(triangle, false, RAMPEDFSK);
    ParallelSetFTW1(freq1);
    ParallelSetFTW2(freq2);    
    ParallelSetDFW(rampedfreq);
    ParallelSetRRClk(rrclk);
}

void PSK(float freq, float phase1, float phase2)
{
    ParallelSetMode(false, false, BPSK);
    ParallelSetFTW1(freq);
    ParallelSetPhase1(phase1);
    ParallelSetPhase2(phase2);
}

void AM(void)
{
}

#endif

//char CTRL_REG[]={0x10,0x64,0x00,0x00};  
char CTRL_REG[]={0x00,0x6f,0x01,0x20};
#if ( parameter == 1 )

void CS( void )
{ 
  CSBHIGH;
  delay_9854(20);
  CSBLOW;
}

void BreakOperation( void )//中断一次I/O操作
{
 IORESETHIGH;
 delay_9854(20);
 IORESETLOW;
}

void SPISendByte(uchar data) //发送一个字节数据
{
 uchar databuffer[9],i;
 SDIO_OUT;
 /******以下一段用来得到每次发送一位时的应发送的数据************************/
 for(i=8;i>0;i--)
   {
    if(data%2)
        {databuffer[i]=4;}
    else
        databuffer[i]=0;
    data = data>>1;
   }
 SCLKHIGH;
 for(i=1;i<9;i++)
  {
   SCLKLOW;
   if(databuffer[i])
       SDIOHIGH;
   else
       SDIOLOW;
   delay_9854(1);
   SCLKHIGH;
   delay_9854(1);
  }
  SCLKLOW;
}

uchar SPIRecieveByte( void ) //接收一个字节数据
{
 uchar databuffer,i;
 SDIO_IN;
 databuffer=0;
 for(i=1;i<9;i++)
  {
   databuffer=databuffer<<1;
   SCLKLOW;
   SCLKHIGH;
   if(SDIO_DATA)
      databuffer+=1;
  }
  SCLKLOW;
  delay_9854 ( 10 );
  return databuffer;
}

void Init9854 ( void )
{
   uchar k;
   HADEINIT;
   BreakOperation( );     
   MRST( );
   CS( );
   
   SPISendByte( 0x07 );                   // set Control Register addr.
   for( k = 0; k < 4; k++ )
   { 
     SPISendByte( CTRL_REG[k] );         // set Control Register
   }
   
   //IOUpdate( );
   delay_9854 ( 5000 );
}

#endif

#if( msp430 == 1 )
void InitSystemClock(void)  // 初始化系统时钟
{
  WDTCTL = WDTPW + WDTHOLD;              // Stop watchdog timer
  SCFI0 |= FN_4;
  SCFQCTL = 121;                        // 7.99MHz 120 * 32.768k
  FLL_CTL0 = DCOPLUS + OSCCAP1;
  P1DIR = 0x22;
  P1SEL = 0x22;
}
#endif

#if( msp430 == 0 )
void InitSystemClock(void)  // 初始化系统时钟
{
  unsigned char i;
  WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
  BCSCTL1 &= ~XT2OFF;                   // XT2on
  do 
  {
  IFG1 &= ~OFIFG;                       // Clear OSCFault flag
  for (i = 0xFF; i > 0; i--);           // Time for flag to set
  }
  while ((IFG1 & OFIFG));               // OSCFault flag still set?                

  BCSCTL2 |= SELM_2 + SELS; 
}
#endif
#if( parameter == 0 )
void main( void )
{
   uchar k,temp,readword;
   InitSystemClock ( );
   
   Init9854 ( );   
   MRST( );   
   Init9854 ( );
   SingleTone ( 200000, 0xFFF );
   temp = 0x1d;
   for ( k = 4; k; k-- )
   {
     readword = ParallelReadByte ( temp ++ );
   }    
    LPM0;
}  
#endif

#if( parameter == 1 )
void main( void )
{
   uchar k,temp;
   InitSystemClock ( );
   
   Init9854 ( );   
   MRST( );   
   while ( 1 )
   SPISendByte( 0xff );
   //it9854 ( );
   
   SPISendByte(0x02);                        // set Frequency 1 addr.
   SPISendByte(0x03);                        // set Frequency 1 NO.
   for(k=0;k<5;k++)
   { 
      SPISendByte(0x33);                      // set Frequency 1 NO.
   }  
    //IOUpdate( );
    delay_9854 ( 5000 );
    
    SPISendByte( 0x87 );
    for(k=0;k<4;k++)
    {
       temp = SPIRecieveByte( ); 
    }
    
    SPISendByte(0x82);                        // set Frequency 1 addr.
    
    for(k=0;k<6;k++)
   { 
      temp = SPIRecieveByte( );                // set Frequency 1 NO.
   }
    
    LPM0;
}
#endif

⌨️ 快捷键说明

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