📄 cc1020hs.c
字号:
//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 + -