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

📄 drv2_cc1000.c

📁 CC1000 multi-frequence driver codes for Lpc213X
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "config_60_61.h"
#include "config_GD61.h"
#include "include_GD61.h"			// ANSI standard header file
#include "include_GD60.h"			// ANSI standard header file

////////////////////////////////////////////////////////////////
extern volatile uint8  CC1000Mode;
extern volatile uint8  RF_RxSynSemaphore;
extern volatile uint16 RF_TxCounter;
extern volatile uint8  RF_TxBitCounter;

extern volatile uint16 mSecondTick;

extern volatile uint8  RF_BufferFlag;
extern volatile uint8  RF_Tx_Buf[TX_BUFFER_LEN];	// UART1 sending buffer
extern volatile uint16 RFt_inp,RFt_outp,RF_TxCounter;
extern volatile uint8  RF_TxBitCounter;				// bit pointer of data_byte in sending

extern volatile uint8  RF_Rx_Buf[RX_BUFFER_LEN];	// UART1 receiving buffer
extern volatile uint16 RFr_inp,RFr_outp,RF_RxCounter;

extern uint16 RF_ModuleAddress;
extern uint16 PowerLine_ID;							//number of line
extern uint8  Comm_Src_Addr;

extern volatile uint8   r_BufferFlag0;
extern volatile uint8 	r_buf0[RX_BUFFER_LEN];		// UART0 receiving buffer
extern volatile uint16  r_inp0,r_outp0,r_count0;

extern volatile uint8   r_BufferFlag1;
extern volatile uint8 	r_buf1[RX_BUFFER_LEN];		// UART1 receiving buffer
extern volatile uint16  r_inp1,r_outp1,r_count1;


// The configuration data for CC1000 is stored in the EEPROM data memory
// This allows the configuration to persist even when power is shut off,
// and also prevents this data from cluttering up the SRAM data memory.
char EEPROMCC1000Config[32];
char EEPROM_TxCurrent;
char EEPROM_RxCurrent; 
char EEPROM_TxPll;
char EEPROM_RxPll;

// RAM variables that mirror the EEPROM variables above
char TxCurrent;
char RxCurrent;
char RF_TxPll;
char RF_RxPll;

char RF_ModemState;
uint16 RF_ChannelID;

// Default RF setups, stored in Flash
   
// Output power is set to 0 dBm so that use with 100% duty cycle is legal in most European countries
// Some countries allow +10 dBm without a restriction on duty cycle
// Also, if 10% duty cycle can be guaranteed, output power can be increased to +10 dBm

//429.483164MHz
const char DefaultConfig429_5[35] = {0x50,0x00,0x00,0x41,0x67,0x70,0x02,0x80,0x44,0x12,0x0F,0x58,0x10,0x26,0x8E,0x69,
  								     0x47,0x70,0x01,0x1C,0x16,0x10,0x0A,0x06,0x03,0x01,0x02,0x00,0x00,0x00,0x3F,0x00};
const char DefaultTXPLL429_5 	= 	 0x48;
const char DefaultRXPLL429_5 	= 	 0x58;

//430.875231MHz
const char DefaultConfig431[35] = {0x5E,0xE0,0x00,0x41,0x9D,0xD0,0x02,0x80,0x44,0x12,0x0F,0x68,0x10,0x26,0x8E,0x69,
  								   0x47,0x70,0x01,0x1C,0x16,0x10,0x0A,0x06,0x03,0x01,0x02,0x00,0x00,0x00,0x3F,0x00};    
const char DefaultTXPLL431 		=  0x48;
const char DefaultRXPLL431 		=  0x68;

//432.009508MHz
const char DefaultConfig432[35] = {0x5F,0x20,0x00,0x41,0xCA,0x1F,0x02,0x80,0x44,0x12,0x0F,0x68,0x10,0x26,0x8E,0x69,
  								   0x47,0x70,0x01,0x1C,0x16,0x10,0x0A,0x06,0x03,0x01,0x02,0x00,0x00,0x00,0x3F,0x00};
const char DefaultTXPLL432 		=  0x48;
const char DefaultRXPLL432 		=  0x68;  								   	

//keep the old config:433.27 MHz, 0 dBm output (Europe) 
const char DefaultConfig433_3[35] = {0x66,0xC0,0x00,0x41,0xFB,0x2D,0x02,0x80,0x44,0x12,0x0F,0x70,0x10,0x26,0x8E,0x69,
  								   	 0x47,0x70,0x01,0x1C,0x16,0x10,0x0A,0x06,0x03,0x01,0x02,0x00,0x00,0x00,0x3F,0x00};
const char DefaultTXPLL433_3 	= 	 0x48;
const char DefaultRXPLL433_3 	= 	 0x70;										

//434.845200MHz
const char DefaultConfig434_6[35] = {0x42,0x40,0x00,0x42,0x38,0xE4,0x02,0x80,0x44,0x12,0x0F,0x48,0x10,0x26,0x8E,0x69,
  								   	 0x47,0x70,0x01,0x1C,0x16,0x10,0x0A,0x06,0x03,0x01,0x02,0x00,0x00,0x00,0x3F,0x00};
const char DefaultTXPLL434_6 	= 	 0x48;
const char DefaultRXPLL434_6 	= 	 0x48;  								   	
  								   	
//435.979477MHz	
const char DefaultConfig436[35] = {0x60,0x00,0x00,0x42,0x65,0x33,0x02,0x80,0x44,0x12,0x0F,0x68,0x10,0x26,0x8E,0x69,
  								   0x47,0x70,0x01,0x1C,0x16,0x10,0x0A,0x06,0x03,0x01,0x02,0x00,0x00,0x00,0x3F,0x00};  								   	 								     								   	
const char DefaultTXPLL436		=  0x48;
const char DefaultRXPLL436 		=  0x68;

// 433.27 MHz, 0 dBm output (Europe)      
const char DefaultConfig433[] 	= {	0x66,0xC0,0x00,0x41,0xFB,0x2D,0x02,0x80,0x44,0x12,0x0F,0x70,0x10,0x26,0x8E,0x69,
  									0x47,0x70,0x01,0x1C,0x16,0x10,0x0A,0x06,0x03,0x01,0x02,0x00,0x00,0x00,0x3F,0x00 };
const char DefaultTXPLL433 		=  	0x48;
const char DefaultRXPLL433 		=  	0x70;

void WriteStr(char *str);
void WriteHEX(int hexval);
void RFtoTXmode(void);
void RFtoRXmode(void);
void DumpCC1000Regs(void);
void SetRFDataRate(void);
void SetupCC1000All(void);
void DefaultSettings(void);
void DisplayConfigMenu(void);
void HandleConfigMenu(char inputvalue);
void RF_ManualConfig(void);
void PrintRF_Mode(void);
void RF_makeSynFlag(void);
void RF_SendOver(void);
void RF_SendChar(char *send_pt,uint8 send_cnt);
void RF_SendString(char *send_pt);
void RF_SendAddCrc(uint8 send_cnt);
void RF_SendAdd_Crc(uint8 *send_pt,uint8 send_cnt);
void RF_SendEnter(void);
void Uart0ToRF(void);
void RFtoUart0(void);
void RF_StartCC1000(void);

/***********************************************************************/
/* This routine outputs a string                                       */
/***********************************************************************/
void WriteStr(char *str)
{
  while(*str!='\0') {
    _putchar(*str++);
  }
}

/*************************************************************************/
/* This routine outputs an int (in hexadecimal)  */
/*************************************************************************/
void WriteHEX(int hexval)
{
  char i;
  int temp;
  char val;
  
  _putchar('0');
  _putchar('x');
  
  temp=hexval;
  
  for(i=0;i<4;i++) {
	val=(temp&0xF000)>>12;
	if (val<=9) {
		_putchar(val+0x30);
    } 
    else{
		_putchar(val+0x41-0xA);
    }
	temp=(temp<<4);
  }
}

///////////////////////////////////////////////////////////////
void RFtoTXmode(void)
{
//uint32 TimeOutCnt;

	if(RF_ModemState!=ENABLE_FLAG) return;
	
	if(CC1000Mode!=RFinTX_MODE){
//		while(RF_RxSynSemaphore!=WAIT_SYN_F);
		WatchDogClear();				//clr watchdog
		mSecondTick=WHILE_DELAY_TIME;
		while((RF_RxSynSemaphore!=WAIT_SYN_F)&&(mSecondTick>1));
		if(mSecondTick<=1) DB_SendString("waitting time overflow in RFtoTXmode() function.");
		WatchDogClear();				//clr watchdog
		
		IRQDisable();
				
		PINSEL1  = PINSEL1	& 0xfffffffc; 	// set p0.16 as GPIO
		PINSEL1  = PINSEL1	| 0x00000001;   // 设置管脚连接,P0.16为EINT0
		EXTMODE  = EXTMODE  | 0x00000001;	// 设置EINT0为 edge 触发.
		EXTPOLAR = EXTPOLAR & 0xfffffffe;	// set falling edge interrupt trigger edge

#ifdef ENABLE_FR_AMP
		IO0SET   = CC_ENAMP_P0o;				// AMP enable signal, set pin level to high		
#endif
		IRQEnable();
		
		SetupCC1000TX(TxCurrent,RF_TxPll);
		CC1000Mode=RFinTX_MODE;
	}
}

///////////////////////////////////////////////////////////////
void RFtoRXmode(void)
{
//uint32 TimeOutCnt;

	if(RF_ModemState!=ENABLE_FLAG) return;

	if(CC1000Mode!=RFinRX_MODE){
//		while((RF_TxCounter|RF_TxBitCounter)!=0);
		WatchDogClear();				//clr watchdog
		mSecondTick=WHILE_DELAY_TIME;
		while(((RF_TxCounter|RF_TxBitCounter)!=0)&&(mSecondTick>1));
		if(mSecondTick<=1) DB_SendString("time overflow in RFtoRXmode() function.");
		WatchDogClear();				//clr watchdog

		IRQDisable();

		PINSEL1  = PINSEL1	& 0xfffffffc; 	// set p0.16 as GPIO
		PINSEL1  = PINSEL1	| 0x00000001;   // 设置管脚连接,P0.16为EINT0
		EXTMODE  = EXTMODE  | 0x00000001;	// 设置EINT0为 edge 触发.
		EXTPOLAR = EXTPOLAR | 0x00000001;	// set raising edge interrupt trigger edge

#ifdef ENABLE_FR_AMP
		IO0CLR   = CC_ENAMP_P0o;				// AMP disable, set pin level to low
#endif
		IRQEnable();
		
		SetupCC1000RX(RxCurrent,RF_RxPll);
		CC1000Mode=RFinRX_MODE;
	}
}

///////////////////////////////////////////////////////////////////
void DumpCC1000Regs(void)
{
}
/*
{
char RegCounter;
    WriteStr("Register dump:\r\n");
//  for(RegCounter=0x00;RegCounter<=0x1C;RegCounter++) {
  for(RegCounter=CC1000_MAIN;RegCounter<=CC1000_PRESCALER;RegCounter++) {
    WriteStr("Addr. ");	WriteHEX(RegCounter);	WriteStr(" : ");
    WriteHEX(ReadFromCC1000Register(RegCounter));
    DB_SendString("");
  }
  
//  for(RegCounter=0x40;RegCounter<=0x46;RegCounter++) {
  for(RegCounter=CC1000_TEST6;RegCounter<=CC1000_TEST0;RegCounter++) {
    WriteStr("Addr. ");	WriteHEX(RegCounter);	WriteStr(" : ");
    WriteHEX(ReadFromCC1000Register(RegCounter));
    DB_SendString("");
  }
}
*/
//////////////////////////////////////////////////////////////////
// Lets the user select the RF data rate
void SetRFDataRate(void)
{
int i;
char regvalue;
char PLLvalue;

//  i=_getchar();
  	i='8';

  switch(toupper(i)) {
/*
    case '0' :
      regvalue=0x07;
      PLLvalue=0x25;
      break;
    case '1' :
      regvalue=0x03;
      PLLvalue=0x25;
      break;
    case '2' :
      regvalue=0x17;
      PLLvalue=0x25;
      break;
    case '3' :
      regvalue=0x13;
      PLLvalue=0x25;
      break;
    case '4' :
      regvalue=0x27;
      PLLvalue=0x25;
      break;
    case '5' :
      regvalue=0x23;
      PLLvalue=0x25;
      break;
    case '6' :
      regvalue=0x37;
      PLLvalue=0x25;
      break;
    case '7' :
      regvalue=0x33;
      PLLvalue=0x25;
      break;
*/
    case '8' :
      regvalue=0x47;
      PLLvalue=0x3F;
      break;
/*
    case '9' :
      regvalue=0x43;
      PLLvalue=0x3F;
      break;
    case 'A' :
      regvalue=0x57;
      PLLvalue=0x3F;
      break;
    case 'B' :
      regvalue=0x53;
      PLLvalue=0x3F;
      break;
    case 'C' :
      regvalue=0x55;
      PLLvalue=0x3F;
      break;
    case 'D' :
      regvalue=0x51;
      PLLvalue=0x3F;
      break;
    case 'E' :
      regvalue=0x54;
      PLLvalue=0x3F;
      break;
    case 'F' :
      regvalue=0x50;
      PLLvalue=0x3F;
      break;
*/
  }
  
  WriteToCC1000Register(CC1000_MODEM0,regvalue);
  WriteToCC1000Register(CC1000_TEST4, PLLvalue);
}

///////////////////////////////////////////////////////////////////////////////
// Configures all the CC1000 registers according to the values stored in EEPROM
void SetupCC1000All(void)
{ 
char counter;
char value;

//  DB_SendString("SetupCC1000All");

//  for (counter=0x01;counter<=0x1C;counter++) {
  for(counter=CC1000_FREQ_2A;counter<=CC1000_PRESCALER;counter++){
    value=EEPROMCC1000Config[counter-CC1000_FREQ_2A];
    WriteToCC1000Register(counter,value);
  }
  
//  for (counter=0x40;counter<=0x44;counter++) {
  for(counter=CC1000_TEST6;counter<=CC1000_TEST2;counter++){
    value=EEPROMCC1000Config[counter-CC1000_TEST6+CC1000_PRESCALER];
    WriteToCC1000Register(counter,value);
  }

  TxCurrent	= EEPROM_TxCurrent;		//be used in sending mode 
  RF_TxPll	= EEPROM_TxPll;			//

  RxCurrent	= EEPROM_RxCurrent;		//be used in receiving mode
  RF_RxPll	= EEPROM_RxPll;			//
}

/////////////////////////////////////////////////
// Lets the user select one of the default setups
void DefaultSettings(void)
{
char i;

#ifdef EN_MULTI_RF_FREQUENCE
	RF_ChannelID = Xr_IntRead(MODULE_ID_ADDR);	//get RF channel id
	i			 = RF_ChannelID % MAX_RF_CHANNELS;  
#else
	i=3;
#endif

  switch (i) {
  
  	case 0:
        for(i=0;i<33;i++) {
          EEPROMCC1000Config[i]=DefaultConfig429_5[i];
        }
        EEPROM_TxCurrent	=TX_CURRENT_433;
        EEPROM_RxCurrent	=RX_CURRENT_433;
        EEPROM_TxPll		=DefaultTXPLL429_5;
        EEPROM_RxPll		=DefaultRXPLL429_5;
//        DB_SendString("RF_ch0 run in 429.483164MHz");
        break;
        
    case 1:
        for(i=0;i<33;i++) {
          EEPROMCC1000Config[i]=DefaultConfig431[i];
        }
        EEPROM_TxCurrent	=TX_CURRENT_433;
        EEPROM_RxCurrent	=RX_CURRENT_433;
        EEPROM_TxPll		=DefaultTXPLL431;
        EEPROM_RxPll		=DefaultRXPLL431;
//        DB_SendString("RF_ch1 run in 430.875231MHz");
        break;
        
    case 2:
        for(i=0;i<33;i++) {
          EEPROMCC1000Config[i]=DefaultConfig432[i];
        }
        EEPROM_TxCurrent	=TX_CURRENT_433;
        EEPROM_RxCurrent	=RX_CURRENT_433;
        EEPROM_TxPll		=DefaultTXPLL432;
        EEPROM_RxPll		=DefaultRXPLL432;
//        DB_SendString("RF_ch2 run in 432.009508MHz");
        break;
/*
    case 3:
        for(i=0;i<33;i++) {
          EEPROMCC1000Config[i]=DefaultConfig433_3[i];
        }
        EEPROM_TxCurrent	=TX_CURRENT_433;
        EEPROM_RxCurrent	=RX_CURRENT_433;
        EEPROM_TxPll		=DefaultTXPLL433_3;
        EEPROM_RxPll		=DefaultRXPLL433_3;

⌨️ 快捷键说明

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