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

📄 drv1_cc1000.c

📁 CC1000 Rf modem C codes for philips sLpc213X ARM MCU.
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -