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

📄 cc1020hs.c

📁 高频通讯CC1020,PIC控制,源代码全
💻 C
📖 第 1 页 / 共 2 页
字号:
    
    //b_Txonly=YES;b_Rxonly=NO;
    
    b_Rxonly=YES;b_Txonly=NO;
    
    o_pass = LOW; 
    for(Temp1=8; ; )
    {
        CLRWDT();
        Dly1000(100);
    	if(--Temp1==0) break;
    }
    o_pass = HIGH; 
    PIR1   = 0;

    CC1020Init();

}



//===========================================================
//=                                                         =
//===========================================================
void Dly5(INT8U i) 
{
    for( ; --i!=0 ; );
}

void Dly1000(INT8U i) 
{
    while(1)
    {
		NOP();
        Dly5(198);
        if (--i == 0) break;
    }
}



//===========================================================
//= 以下为CC1020的库函数:10个                               =
//===========================================================

//===========================================================
//= 写单个CC1020寄存器(地址,数据)                          =
//===========================================================
void WriteToCC1020Register(INT8U addr, INT8U data)
{
    INT16U val;
  
    val = (((INT16U)(addr&0x7F) << 9) | 0x0100) | (INT16U)data;
    WriteToCC1020RegisterWord(val);
}


//===========================================================
//= 写单个CC1020寄存器(地址:数据)                           =
//===========================================================
void WriteToCC1020RegisterWord(INT16U addranddata)
{
    INT8U BitCounter;

    o_pale = 1;
	NOP();
    o_pale = 0;

    for (BitCounter=16; ; )
    {
        addranddata <<= 1;
        o_pclk = 0;
        if (CARRY == HIGH)
		{
			NOP();
			o_pdi = HIGH;
		}
        else
		{
			o_pdi = LOW;
			NOP();
			NOP();
		}
        o_pclk=1; 
        if (--BitCounter==0) break;
    }
    
    NOP();NOP();NOP();NOP();
    o_pclk = 0;
	NOP();
	o_pdi  = 0;
	NOP();
    o_pale = 1;
}

//===========================================================
//= 读单个CC1020寄存器(地址)                                =
//===========================================================
INT8U ReadFromCC1020Register(INT8U addr)
{
    INT8U BitCounter;
    INT8U Byte;

    o_pale = HIGH;
    addr <<= 1;
    o_pale = LOW;
    
    // Send address bits
    for (BitCounter=8; ; )
    {
        addr <<= 1; NOP();
        o_pclk = LOW;
        if (CARRY == HIGH) 
		{
			NOP();
			o_pdi = HIGH;
		}
        else 
		{
			o_pdi = LOW;
			NOP();
			NOP();
		}
        o_pclk = HIGH; //上升沿移入
        if (--BitCounter==0) break;
    }
    o_pdi  = HIGH;
    o_pclk = LOW;
    for (BitCounter=8; ; )
    {
		NOP(); NOP(); NOP();
        o_pclk = HIGH;
        Byte <<= 1;
        if (i_pdo==HIGH) 
		{
			Byte |= MK0;
		}
        else 
		{
			Byte &= ~MK0;
			NOP();
		}
        o_pclk = LOW;
        if (--BitCounter==0) break;
    }
    o_pale = HIGH;
    return Byte;
}


//===========================================================
//= 复位CC1020,清除所有寄存器                              =
//===========================================================
void ResetCC1020(void)
{
    WriteToCC1020Register(CC1020_MAIN, 0x0F&~0x01); // Reset CC1020
    WriteToCC1020Register(CC1020_MAIN, 0x1F);       // Bring CC1020 out of reset
}


//===========================================================
//= 校准CC1020,如果失败返回0,否则非0。                    =
//===========================================================
INT8U CalibrateCC1020(INT8U PA_POWER)
{
    volatile INT16U TimeOutCounter;

    WriteToCC1020Register(CC1020_PA_POWER,0x00);  // Turn off PA to avoid spurs during calibration in TX mode
    WriteToCC1020Register(CC1020_CALIBRATE,0xB5); // Start calibration
  
    // Monitor calibration
    for(TimeOutCounter=CAL_TIMEOUT; ((ReadFromCC1020Register(CC1020_STATUS)&0x80)==0)&&(TimeOutCounter>0); TimeOutCounter--);

    // Monitor lock
    for(TimeOutCounter=LOCK_TIMEOUT; ((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0)&&(TimeOutCounter>0); TimeOutCounter--);

    // Restore PA setting
    WriteToCC1020Register(CC1020_PA_POWER,PA_POWER);

    // Return state of LOCK_CONTINUOUS bit
    return ((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10);
}

//===========================================================
//= 将CC1020从TX切换到RX,若从PD到RX,须先调WakeupC1020ToRX =
//===========================================================
INT8U SetupCC1020RX(INT8U RXANALOG, INT8U PA_POWER)
{
    volatile INT16U TimeOutCounter;
    INT8U           lock_status;

    WriteToCC1020Register(CC1020_MAIN,0x11);       // Switch into RX, switch to freq. reg A
    WriteToCC1020Register(CC1020_ANALOG,RXANALOG); // Setup bias current adjustment
    for(TimeOutCounter=LOCK_TIMEOUT;((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0)&&(TimeOutCounter>0);TimeOutCounter--); // Monitor LOCK

    if((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10) // If PLL in lock
    {
        lock_status = LOCK_OK; // Indicate PLL in LOCK
  
    }
    else // Else (PLL out of LOCK)
    { 
        if(CalibrateCC1020(PA_POWER)) // If recalibration ok
        {
            lock_status = LOCK_RECAL_OK; // Indicate PLL in LOCK
        }
        else // Else (recalibration failed)
        {
            lock_status = LOCK_NOK; // Indicate PLL out of LOCK
        }
    }
    WriteToCC1020Register(CC1020_MAIN,0x01); // Switch RX part of CC1020 on
    return (lock_status); // Return LOCK status to application
}

//===========================================================
//= 将CC1020从RX切换到TX,若从PD到TX,须先调WakeupCC1020ToTX=
//===========================================================
INT8U SetupCC1020TX(INT8U TXANALOG, INT8U PA_POWER)
{
    volatile INT16U TimeOutCounter;
    INT8U           lock_status;

    WriteToCC1020Register(CC1020_PA_POWER,0x00);   // Turn off PA to avoid frequency splatter
    WriteToCC1020Register(CC1020_ANALOG,TXANALOG); // Setup bias current adjustment
    WriteToCC1020Register(CC1020_MAIN,0xC1);       // Switch into TX, switch to freq. reg B
    for(TimeOutCounter=LOCK_TIMEOUT; ((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0)&&(TimeOutCounter>0); TimeOutCounter--); // Monitor LOCK
  
    if((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10) // If PLL in lock
    {
        lock_status = LOCK_OK; // Indicate PLL in LOCK
    }
    else // Else (PLL out of LOCK)
    {
        if(CalibrateCC1020(PA_POWER)) // If recalibration ok
        {
            lock_status = LOCK_RECAL_OK; // Indicate PLL in LOCK
    
        }
        else // Else (recalibration failed)
        {
            lock_status = LOCK_NOK; // Indicate PLL out of LOCK
        }
    }

    WriteToCC1020Register(CC1020_PA_POWER,PA_POWER); // Restore PA setting
    WriteToCC1020Register(CC1020_INTERFACE,ReadFromCC1020Register(CC1020_INTERFACE)&~0x10); // Turn OFF DCLK squelch in TX
    return (lock_status); // Return LOCK status to application
}

//===========================================================
//= 将CC1020切换到PD                                        =
//===========================================================
void SetupCC1020PD(void)
{
    WriteToCC1020Register(CC1020_MAIN,0x1F);     // Put CC1020 into power-down
    WriteToCC1020Register(CC1020_PA_POWER,0x00); // Turn off PA to minimise current draw
}

//===========================================================
//= 将CC1020从PD唤醒到RX                                    =
//===========================================================
void WakeUpCC1020ToRX(INT8U RXANALOG)
{
    volatile INT16U i;
  
    WriteToCC1020Register(CC1020_MAIN,0x1B);        // Turn on xtal oscillator core
    WriteToCC1020Register(CC1020_ANALOG,RXANALOG);  // Setup bias current adjustment
    for (i=0; i < 455; i++);                        // 等待晶振稳定,典型地花费2~5ms。(5.103ms)
    WriteToCC1020Register(CC1020_MAIN,0x19);        // Turn on bias generator
    for (i=0; i < 16; i++);                         // Wait for 150 usec(202uS)
    WriteToCC1020Register(CC1020_MAIN,0x11);        // Turn on frequency synthesiser
}

//===========================================================
//= 将CC1020从PD唤醒到TX                                    =
//===========================================================
void WakeUpCC1020ToTX(INT8U TXANALOG)
{
    volatile INT16U i;
    
    WriteToCC1020Register(CC1020_MAIN,0xDB);        // Turn on xtal oscillator core
    WriteToCC1020Register(CC1020_ANALOG,TXANALOG);  // Setup bias current adjustment
    for (i=0; i < 455; i++);                        // 等待晶振稳定,典型地花费2~5ms。
    WriteToCC1020Register(CC1020_MAIN,0xD9);        // Turn on bias generator
    for (i=0; i < 16; i++);                         // Wait for 150 usec (actual 202uS)
    WriteToCC1020Register(CC1020_MAIN,0xD1);        // Turn on frequency synthesiser
}


//===========================================================
//= CC1020初始化                                            =
//===========================================================
void CC1020Init(void)
{
	//Add your code at here.
		
  SetupCC1020PD();
  ResetCC1020();

  SetupCC1020All();
	
  WakeUpCC1020ToTX(TXDL);
  OPTION=0x80;        // INT on falling edge
//  TRISC&=~(0x02);     // Set DIO as output
	TRISA&=~0X01;
//  TRISA0=0;
  CalibrateCC1020(PA_VALUE);
//  SetupCC1020TX(TXDL,PA_VALUE);

  WakeUpCC1020ToRX(RXDL);
  OPTION=0xC0;        // INT on rising edge
//  TRISC|=0x02;        // Set DIO as input
	TRISA|=0X01;
//  TRISA0=1;
  CalibrateCC1020(PA_VALUE);
  SetupCC1020RX(RXDL,PA_VALUE);
}

const INT8U DefaultConfig433[32] =
{
    0x0F,  // 0x01, INTERFACE
    0xFF,  // 0x02, RESET
    0x8F,  // 0x03, SEQUENCING
    0x3A,  // 0x04, FREQ_2A
    0x10,  // 0x05, FREQ_1A
    0x01,  // 0x06, FREQ_0A
    0x3A,  // 0x07, CLOCK_A
    0x3A,  // 0x08, FREQ_2B
    0x1A,  // 0x09, FREQ_1B
    0xAB,  // 0x0A, FREQ_0B
    0x3A,  // 0x0B, CLOCK_B
    0x44,  // 0x0C, VCO
    0x51,  // 0x0D, MODEM
    0x9B,  // 0x0E, DEVIATION
    0xC6,  // 0x0F, AFC_CONTROL           //0x87
    0x2F,  // 0x10, FILTER
    0x61,  // 0x11, VGA1                  //0x65
    0x55,  // 0x12, VGA2                  //0x57
    0x2F,  // 0x13, VGA3
    0x2D,  // 0x14, VGA4
    0x21,  // 0x15, LOCK
    0x78,  // 0x16, FRONTEND
    0x47,  // 0x17, ANALOG, RX=46/TX=46   //0x46
    0x54,  // 0x18, BUFF_SWING            //0x54
    0x22,  // 0x19, BUFF_CURRENT
    0xAE,  // 0x1A, PLL_BW
    0x35,  // 0x1B, CALIBRATE             //0x35
    0xF0,  // 0x1C, PA_POWER              //0x0E
    0x00,  // 0x1D, MATCH
    0x00,  // 0x1E, PHASE_COMP
    0x00,  // 0x1F, GAIN_COMP
    0x00   // 0x20, POWERDOWN
};


//===========================================================
//= 配置CC1020所有寄存器                                    =
//===========================================================
void SetupCC1020All(void)
{ 
    INT8U counter;
    INT8U value;

    for(counter=0x01; counter<=0x20; counter++)
    {
        value = DefaultConfig433[counter-1];
        WriteToCC1020Register(counter,value);
    }
}


⌨️ 快捷键说明

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