HMC704配置

/*
*     主要功能:                                                              *
*             (1)通用I/O模拟实现SPI接口功能                                   *
*             (2)鉴相器ADF4002                                                *
*                a.参考频率:40MHz                                            *
*                b.鉴相频率: 40MHz  
*                c.输出频率:400MHz                       *
*             (3)鉴相器HMC704LP4E                                             *
*                a.参考频率:40MHz                                            *
*                b.鉴相频率: 40MHz       *
*                c.输出频率:1280MHz                          
*             (4)鉴相器HMC704LP4E  
*                a.参考频率:40MHz                                            *
*                b.鉴相频率: 40MHz
*                c.输出频率:1360MHz
*/


#include "C8051F330.h"
#define OPEN_MODE


sbit SCK_Pad  = P0^3;
sbit SDI_Pad  = P0^4;
sbit LE2_Pad  = P0^5;
sbit SDO2_Pad = P0^6;
sbit LE1_Pad  = P0^7;
sbit SDO3_Pad = P1^1;
sbit LE3_Pad  = P1^2;
sbit CEN_Pad  = P1^3;


void Oscillator_Init()
{
    OSCICN = 0x82;     // 使能内部H-F振荡器,SYSCLK为12.25MHz
            RSTSRC = 0x04;       // 使能时钟丢失检测器,检测到时钟丢失时触发复位
            CLKSEL = 0x00;       // 系统时钟取自内部高频振荡器,分频数由OSCICN寄存器中的IFCN位决定。
}


void PCA_Init()
{
    PCA0MD    &= ~0x40;  // 禁止看门狗定时器
            PCA0MD    = 0x00; // PCA计数器的时钟源为系统时钟的12分频
    PCA0H     = 0x00;
    PCA0L     = 0x00;
    PCA0CPL2  = 0xFF; // PCA捕捉模块2低字节置0xFF,超时间隔64.2ms 
    PCA0MD    |= 0x40; // PCA模块2用作看门狗定时器
    PCA0CN    = 0x40;    // 启动PCA计数器/定时器
}

void Port_IO_Init()
{
    P0MDIN  = 0xFF;
    P0MDOUT = 0xB8;
    P0SKIP  = 0x00;
    P1MDIN  = 0xFF;
    P1MDOUT = 0x0C;
    P1SKIP  = 0x00;
    XBR0    = 0x00;
    XBR1    = 0x40;
}

void delay(unsigned int time)
{
    CKCON |= 0x02;
    TMOD  |= 0x01;
    TH0    = 0xFE;
    TL0    = 0xFF;
    ET0    = 0x0;
    TR0    = 0x1;
    while(time)
    {
        TF0 = 0x0;
        while(!TF0)
        {
            PCA0CPH2 = 0x00;
        }
        TH0 = 0xFE;
        TL0 = 0xFE;
        time--;
    }
    TR0    = 0x0;
}

void ADF4002_Write(unsigned long value)
{
    unsigned char i;
    unsigned long send_data;
    unsigned char valueL,valueM,valueH;
    
    
    send_data = value;
    valueL = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    valueM = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    valueH = (unsigned char)(send_data & 0x000000FF);
    
    
    LE1_Pad = 0x0;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(valueH & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        valueH <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(valueM & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        valueM <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(valueL & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        valueL <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    LE1_Pad = 0x1;
}

void HMC704_ReadA(unsigned char addr,unsigned long *value)
{
    unsigned char i,j;
    unsigned char send_data;
    unsigned char receive_data;
#ifdef HMC_MODE
    SDI_Pad = 0x1;
    LE2_Pad = 0x1;
    
    
    send_data = addr;
    send_data <<= 1;
    send_data |= 0x80;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(send_data & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        send_data <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    *value = 0x00;
    for(j=0; j<3; j++)
    {
        send_data = 0x00;
        receive_data = 0x00;
        for(i=0; i<8; i++)
        {
            SCK_Pad = 0x0;
            receive_data <<= 1;
            if(SDO2_Pad)
            {
                receive_data |= 0x01;
            }
            if(send_data & 0x80)
            {
                SDI_Pad = 0x1;
            }
            else
            {
                SDI_Pad = 0x0;
            }
            send_data <<= 1;
            delay(1);
            SCK_Pad = 0x1;
            delay(1);
        }
        *value <<= 8;
        *value |= receive_data;
    }
    LE2_Pad = 0x0;
#endif
    
    
#ifdef OPEN_MODE
    LE2_Pad = 0x1;
    //First cycle
    for(j=0; j<2; j++)
    {
        send_data = 0x00;
        for(i=0; i<8; i++)
        {
            SCK_Pad = 0x0;
            if(send_data & 0x80)
            {
                SDI_Pad = 0x1;
            }
            else
            {
                SDI_Pad = 0x0;
            }
            send_data <<= 1;
            delay(1);
            SCK_Pad = 0x1;
            delay(1);
        }
    }
    send_data = addr & 0x1F;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(send_data & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        send_data <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    send_data = addr;
    send_data <<= 3;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(send_data & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        send_data <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
        if(i>4)
        {
            LE2_Pad = 0x0;
        }
    }
    //Second cycle
    *value = 0x00;
    LE2_Pad = 0x1;
    for(j=0; j<2; j++)
    {
        send_data = 0x00;
        receive_data = 0x00;
        for(i=0; i<8; i++)
        {
            SCK_Pad = 0x0;
            receive_data <<= 1;
            if(SDO2_Pad)
            {
                receive_data |= 0x01;
            }
            if(send_data & 0x80)
            {
                SDI_Pad = 0x1;
            }
            else
            {
                SDI_Pad = 0x0;
            }
            send_data <<= 1;
            delay(1);
            SCK_Pad = 0x1;
            delay(1);
        }
        *value <<= 8;
        *value |= receive_data;
    }
    *value &= 0x7FFF;
    send_data = addr & 0x1F;
    receive_data = 0x00;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        receive_data <<= 1;
        if(SDO2_Pad)
        {
            receive_data |= 0x01;
        }
        if(send_data & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        send_data <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    *value <<= 8;
    *value |= receive_data;
    send_data = addr;
    send_data <<= 3;
    receive_data = 0x00;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        receive_data <<= 1;
        if(SDO2_Pad)
        {
            receive_data |= 0x01;
        }
        if(send_data & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        send_data <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
        if(i>1)
        {
            LE2_Pad = 0x0;
        }
    }
    *value <<= 1;
    *value |= (receive_data >> 7);
#endif
}


void HMC704_ReadB(unsigned char addr,unsigned long *value)
{
    unsigned char i,j;
    unsigned char send_data;
    unsigned char receive_data;
#ifdef HMC_MODE
    SDI_Pad = 0x1;
    LE3_Pad = 0x1;
    
    
    send_data = addr;
    send_data <<= 1;
    send_data |= 0x80;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(send_data & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        send_data <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    *value = 0x00;
    for(j=0; j<3; j++)
    {
        send_data = 0x00;
        receive_data = 0x00;
        for(i=0; i<8; i++)
        {
            SCK_Pad = 0x0;
            receive_data <<= 1;
            if(SDO3_Pad)
            {
                receive_data |= 0x01;
            }
            if(send_data & 0x80)
            {
                SDI_Pad = 0x1;
            }
            else
            {
                SDI_Pad = 0x0;
            }
            send_data <<= 1;
            delay(1);
            SCK_Pad = 0x1;
            delay(1);
        }
        *value <<= 8;
        *value |= receive_data;
    }
    LE3_Pad = 0x0;
#endif
    
    
#ifdef OPEN_MODE
    LE3_Pad = 0x1;
    //First cycle
    for(j=0; j<2; j++)
    {
        send_data = 0x00;
        for(i=0; i<8; i++)
        {
            SCK_Pad = 0x0;
            if(send_data & 0x80)
            {
                SDI_Pad = 0x1;
            }
            else
            {
                SDI_Pad = 0x0;
            }
            send_data <<= 1;
            delay(1);
            SCK_Pad = 0x1;
            delay(1);
        }
    }
    send_data = addr & 0x1F;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(send_data & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        send_data <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    send_data = addr;
    send_data <<= 3;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(send_data & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        send_data <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
        if(i>4)
        {
            LE3_Pad = 0x0;
        }
    }
    //Second cycle
    *value = 0x00;
    LE3_Pad = 0x1;
    for(j=0; j<2; j++)
    {
        send_data = 0x00;
        receive_data = 0x00;
        for(i=0; i<8; i++)
        {
            SCK_Pad = 0x0;
            receive_data <<= 1;
            if(SDO3_Pad)
            {
                receive_data |= 0x01;
            }
            if(send_data & 0x80)
            {
                SDI_Pad = 0x1;
            }
            else
            {
                SDI_Pad = 0x0;
            }
            send_data <<= 1;
            delay(1);
            SCK_Pad = 0x1;
            delay(1);
        }
        *value <<= 8;
        *value |= receive_data;
    }
    *value &= 0x7FFF;
    send_data = addr & 0x1F;
    receive_data = 0x00;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        receive_data <<= 1;
        if(SDO3_Pad)
        {
            receive_data |= 0x01;
        }
        if(send_data & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        send_data <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    *value <<= 8;
    *value |= receive_data;
    send_data = addr;
    send_data <<= 3;
    receive_data = 0x00;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        receive_data <<= 1;
        if(SDO3_Pad)
        {
            receive_data |= 0x01;
        }
        if(send_data & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        send_data <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
        if(i>1)
        {
            LE3_Pad = 0x0;
        }
    }
    *value <<= 1;
    *value |= (receive_data >> 7);
#endif
}


void HMC704_WriteA(unsigned char addr,unsigned long value)
{
    unsigned char i;
    unsigned long send_data;
    unsigned char value1,value2,value3,value4;
#ifdef HMC_MODE
    send_data   = addr;
    send_data <<=24;
    send_data  |= (value & 0x00FFFFFF);
    send_data <<= 1; 
            value4 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value3 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value2 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value1 = (unsigned char)(send_data & 0x000000FF);
    
    SDI_Pad = 0x0;
    LE2_Pad = 0x1;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value1 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value1 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value2 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value2 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value3 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value3 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value4 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value4 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    LE2_Pad = 0x0;
#endif
    
    
#ifdef OPEN_MODE
    send_data   = (value & 0x00FFFFFF);
    send_data <<= 8;
    send_data  |= (addr << 3);
    value4 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value3 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value2 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value1 = (unsigned char)(send_data & 0x000000FF);
    LE2_Pad = 0x1;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value1 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value1 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value2 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value2 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value3 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value3 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value4 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value4 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
        if(i>4)
        {
            LE2_Pad = 0x0;
        }
    }
    LE2_Pad = 0x1;
    delay(1);
    LE2_Pad = 0x0;
#endif
}


void HMC704_WriteB(unsigned char addr,unsigned long value)
{
    unsigned char i;
    unsigned long send_data;
    unsigned char value1,value2,value3,value4;
#ifdef HMC_MODE
    send_data   = addr;
    send_data <<=24;
    send_data  |= (value & 0x00FFFFFF);
    send_data <<= 1; 
            value4 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value3 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value2 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value1 = (unsigned char)(send_data & 0x000000FF);
    
    SDI_Pad = 0x0;
    LE3_Pad = 0x1;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value1 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value1 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value2 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value2 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value3 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value3 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value4 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value4 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    LE3_Pad = 0x0;
#endif
    
#ifdef OPEN_MODE
    send_data   = (value & 0x00FFFFFF);
    send_data <<= 8;
    send_data  |= (addr << 3);
    value4 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value3 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value2 = (unsigned char)(send_data & 0x000000FF);
    send_data >>= 8;
    value1 = (unsigned char)(send_data & 0x000000FF);
    LE3_Pad = 0x1;
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value1 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value1 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value2 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value2 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value3 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value3 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
    }
    for(i=0; i<8; i++)
    {
        SCK_Pad = 0x0;
        if(value4 & 0x80)
        {
            SDI_Pad = 0x1;
        }
        else
        {
            SDI_Pad = 0x0;
        }
        value4 <<= 1;
        delay(1);
        SCK_Pad = 0x1;
        delay(1);
        if(i>4)
        {
            LE3_Pad = 0x0;
        }
    }
    LE3_Pad = 0x1;
    delay(1);
    LE3_Pad = 0x0;
#endif
}


unsigned long chip1_id;
unsigned long chip2_id;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main(void)
{
    PCA0MD &= ~0x40;
    Oscillator_Init();
    Port_IO_Init();
    PCA_Init();
    EA = 0x1;
    delay(1000);
    LE1_Pad = 0x1;
    LE2_Pad = 0x0;
    LE3_Pad = 0x0;
    SDI_Pad = 0x1;
    SCK_Pad = 0x1;
    CEN_Pad = 0x1;
    
    
    //400MHz
    ADF4002_Write(0x1FFE93);
    ADF4002_Write(0x1FFE92);
    ADF4002_Write(0x000004);
    ADF4002_Write(0x000A01);
    //1280MHz
    HMC704_ReadA(0x00,&chip1_id);
    HMC704_WriteA(0x01,0x000002);
    HMC704_WriteA(0x02,0x000001);
    HMC704_WriteA(0x09,0x4C0000 | ((60<<7) | 60));
    HMC704_WriteA(0x06,0x0003FA);
    HMC704_WriteA(0x03,0x000020);
    HMC704_WriteA(0x04,0x000000);
    //1360MHz
    HMC704_ReadB(0x00,&chip2_id);
    HMC704_WriteB(0x01,0x000002);
    HMC704_WriteB(0x02,0x000001);
    HMC704_WriteB(0x09,0x4C0000 | ((60<<7) | 60));
    HMC704_WriteA(0x06,0x0003FA);
    HMC704_WriteB(0x03,0x000022);
    HMC704_WriteB(0x04,0x000000);
    while(1)
    {
        PCA0CPH2 = 0x00;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值