📄 drv1_cc1000.c
字号:
#include "config_GD61.h"
#include "include_GD61.h"
///////////////////////////////////////////////////////////////////////////
extern volatile uint16 mSecondTick; // for delay function
///////////////////////////////////////////////////////////////////////////
void InitCC1000Pin(void);
void WriteToCC1000RegWord(uint16 addranddata);
uint8 ReadFromCC1000Register(uint8 addr);
void WriteToCC1000Register(uint8 addr, uint8 data);
void RF_ResetFreqSynth(void);
void Reset_CC1000(void);
uint8 CalibrateCC1000(void);
uint8 SetupCC1000RX(uint8 RxCurrent,uint8 RF_RxPll);
uint8 SetupCC1000TX(uint8 TxCurrent, uint8 RF_TxPll);
void SetupCC1000PD(void);
void WakeUpCC1000ToRX(uint8 RxCurrent, uint8 RF_RxPll);
void WakeUpCC1000ToTX(uint8 TxCurrent, uint8 RF_TxPll);
void AverageManualLockCC1000(void);
void AverageFreeRunCC1000(void);
void AverageAutoLockCC1000(void);
void ReadCurrentCalibration(uint8 *val1, uint8 *val2);
void OverrideCurrentCalibration(uint8 val1, uint8 val2);
void StopOverridingCalibration(void);
//////////////////////////////////////////////////////////////////////////
void InitCC1000Pin(void)
{
IRQDisable();
#ifdef ENABLE_FR_AMPLIFER
IO0CLR = RF_AMP__P0_31; // set pin level to low
#endif
IO0SET = CC_PDAT_P0_18; // set pin level to high
IO0SET = CC_PCLK_P0_19; // set pin level to high
IO0SET = CC_PALE_P0_23; // set pin level to high
// IO0DIR = IO0DIR&(~CC_PDAT_P0_18); // PIN_ESAVE serve as input
IO0DIR = IO0DIR|CC_PDAT_P0_18; // PIN_ESAVE serve as output
IO0DIR = IO0DIR|CC_PCLK_P0_19; // PIN_HOLD serve as output
IO0DIR = IO0DIR|CC_PALE_P0_23; // PIN_ONOFF serve as output
#ifdef ENABLE_FR_AMPLIFER
IO0DIR = IO0DIR|RF_AMP__P0_31; // RF_AMP__P0_31 serve as output
IO0CLR = RF_AMP__P0_31; // set pin level to low
#endif
IO0SET = CC_PDAT_P0_18; // set pin level to high
IO0SET = CC_PCLK_P0_19; // set pin level to high
IO0SET = CC_PALE_P0_23; // set pin level to high
IRQEnable();
Uart0SendString("InitCC1000Pin");
}
/************************************************************************/
/* General I/O pin "bit-bashing" versions of configuration routines. */
/************************************************************************/
/****************************************************************************/
/* This routine writes to a single CC1000 register, with address and data */
/* given in the same variable */
/****************************************************************************/
void WriteToCC1000RegWord(uint16 addranddata)
{
uint8 BitCounter;
uint16 dataBuff;
IRQDisable();
// get ready;
// o_pclk=1;
// o_pale=1;
IO0SET = CC_PCLK_P0_19; // set pin level to high
IO0SET = CC_PCLK_P0_19; // set pin level to high
IO0SET = CC_PALE_P0_23; // set pin level to high
IO0SET = CC_PALE_P0_23; // set pin level to high
dataBuff = addranddata<<1; // pass the msb
// o_pale=0; //transmission starts
IO0CLR = CC_PALE_P0_23;
IO0CLR = CC_PALE_P0_23;
// Send address bits
for (BitCounter=0;BitCounter<7;BitCounter++)
{
// o_pclk = 1;
IO0SET = CC_PCLK_P0_19; // set pin level to high
IO0SET = CC_PCLK_P0_19; // set pin level to high
// o_pdata = wdun.W.MSB;
if((dataBuff&0x8000)==0x8000){
IO0SET = CC_PDAT_P0_18; // set pin level to high
IO0SET = CC_PDAT_P0_18; // set pin level to high
}else{
IO0CLR = CC_PDAT_P0_18; // set pin level to high
IO0CLR = CC_PDAT_P0_18; // set pin level to high
}
dataBuff = dataBuff<<1;
// o_pclk = 0;
IO0CLR = CC_PCLK_P0_19; // set pin level to high
IO0CLR = CC_PCLK_P0_19; // set pin level to high
}
// Send read/write bit, Ignore bit in data, always use 1
// o_pclk = 1;
// o_pdata = 1; wdun.Data = wdun.Data<<1; //pass the MSB
// o_pclk = 0;
IO0SET = CC_PCLK_P0_19;
IO0SET = CC_PCLK_P0_19;
IO0SET = CC_PDAT_P0_18;
IO0SET = CC_PDAT_P0_18;
IO0CLR = CC_PCLK_P0_19;
IO0CLR = CC_PCLK_P0_19;
// o_pclk = 1;
// o_pale = 1; //change to data sending
IO0SET = CC_PCLK_P0_19;
IO0SET = CC_PCLK_P0_19;
IO0SET = CC_PALE_P0_23;
IO0SET = CC_PALE_P0_23;
// Send data bits
for (BitCounter=0;BitCounter<8;BitCounter++)
{
// o_pclk = 1;
IO0SET = CC_PCLK_P0_19;
IO0SET = CC_PCLK_P0_19;
// o_pdata = wdun.W.MSB;
if((dataBuff&0x8000)==0x8000){
IO0SET = CC_PDAT_P0_18; // set pin level to high
IO0SET = CC_PDAT_P0_18; // set pin level to high
}else{
IO0CLR = CC_PDAT_P0_18; // set pin level to high
IO0CLR = CC_PDAT_P0_18; // set pin level to high
}
// wdun.Data = wdun.Data<<1;
dataBuff = dataBuff<<1;
// o_pclk = 0;
IO0CLR = CC_PCLK_P0_19;
IO0CLR = CC_PCLK_P0_19;
}
// o_pclk = 1; //transmission ends
IO0SET = CC_PCLK_P0_19;
IO0SET = CC_PCLK_P0_19;
IRQEnable();
}
//===========================================================================
//= This routine reads from a single CC1000 register =
// state:checked
//===========================================================================
uint8 ReadFromCC1000Register(uint8 addr)
{
uint8 BitCounter;
uint8 dataBuff;
IRQDisable();
//get ready
// o_pclk=1;
// o_pale=1;
IO0SET = CC_PCLK_P0_19; // set pin level to high
IO0SET = CC_PCLK_P0_19; // set pin level to high
IO0SET = CC_PALE_P0_23; // set pin level to high
IO0SET = CC_PALE_P0_23; // set pin level to high
dataBuff = addr<<1; // pass the MSB
// o_pale=0; //transmission begin
IO0CLR = CC_PALE_P0_23;
IO0CLR = CC_PALE_P0_23;
// Send address bits
for (BitCounter=0;BitCounter<7;BitCounter++)
{
// o_pclk=1;
IO0SET = CC_PCLK_P0_19; // set pin level to high
IO0SET = CC_PCLK_P0_19; // set pin level to high
// o_pdata=byun.B.MSB; byun.Data=byun.Data<<1;
if((dataBuff&0x80)==0x80){
IO0SET = CC_PDAT_P0_18; // set pin level to high
IO0SET = CC_PDAT_P0_18; // set pin level to high
}else{
IO0CLR = CC_PDAT_P0_18; // set pin level to high
IO0CLR = CC_PDAT_P0_18; // set pin level to high
}
dataBuff=dataBuff<<1;
// o_pclk=0;
IO0CLR = CC_PCLK_P0_19; // set pin level to high
IO0CLR = CC_PCLK_P0_19; // set pin level to high
}
// Send read/write bit , Ignore bit in data, always use 0
// o_pclk=1;
// o_pdata=0;
// o_pclk=0;
IO0SET = CC_PCLK_P0_19;
IO0SET = CC_PCLK_P0_19;
IO0CLR = CC_PDAT_P0_18;
IO0CLR = CC_PDAT_P0_18;
IO0CLR = CC_PCLK_P0_19;
IO0CLR = CC_PCLK_P0_19;
// o_pclk=1;
// o_pale=1; //change to data receiving
IO0SET = CC_PCLK_P0_19;
IO0SET = CC_PCLK_P0_19;
IO0SET = CC_PALE_P0_23;
IO0SET = CC_PALE_P0_23;
// Receive data bits
// o_pdata=1;
IO0SET = CC_PDAT_P0_18;
IO0SET = CC_PDAT_P0_18;
// TRISA |= MK2; // Set up o_pdata(RA2) as an input
IO0DIR = IO0DIR&~CC_PDAT_P0_18; // CC_PDAT_P0_18 serve as input
//
for (BitCounter=0;BitCounter<8;BitCounter++)
{
dataBuff=dataBuff<<1;
// o_pclk=0;
IO0CLR = CC_PCLK_P0_19;
IO0CLR = CC_PCLK_P0_19;
// byun.B.LSB=o_pdata;
if((IO0PIN&CC_PDAT_P0_18)==CC_PDAT_P0_18){
dataBuff=dataBuff|0x01;
}else{
dataBuff=dataBuff&(~0x01);
}
// o_pclk=1;
IO0SET = CC_PCLK_P0_19;
IO0SET = CC_PCLK_P0_19;
}
// TRISA &= ~MK2; // Set up o_pdata(RA2) as an output again
IO0DIR = IO0DIR|CC_PDAT_P0_18; // CC_PDAT_P0_18 serve as output
IRQEnable();
return dataBuff;
}
//=======================================================================
//= This routine writes to a single CC1000 register =
// state: checked
//=======================================================================
void WriteToCC1000Register(uint8 addr, uint8 data)
{
uint16 val;
val=(((uint16)addr)<<8)|(((uint16)data)&0x00FF);
WriteToCC1000RegWord(val);
}
/****************************************************************************/
/* This routine resets the CC1000 frequency synthesizer */
/****************************************************************************/
void RF_ResetFreqSynth(void)
{
uint8 modem1_value;
Uart0SendString("ResetFreqSynth");
modem1_value = ReadFromCC1000Register(CC1000_MODEM1)&~0x01;
WriteToCC1000Register(CC1000_MODEM1,modem1_value);
WriteToCC1000Register(CC1000_MODEM1,modem1_value|0x01);
}
/****************************************************************************/
/* This routine resets the CC1000, clearing all registers. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -