📄 drv2_cc1000.c
字号:
#include "config_GD61.h"
#include "include_GD61.h" // ANSI standard header file
#include <ctype.h>
////////////////////////////////////////////////////////////////////////
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_ActiveFlag;
extern volatile uint8 RF_Tx_Buffer[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_Buffer[RX_BUFFER_LEN]; // UART1 receiving buffer
extern volatile uint16 RFr_inp,RFr_outp,RF_RxCounter;
extern volatile uint8 r_ActiveFlag0;
extern volatile uint8 r_buf0[RX_BUFFER_LEN]; // UART0 receiving buffer
extern volatile uint16 r_inp0,r_outp0,r_count0;
// 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[33];
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;
// 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;
/*
// 869.850 MHz, +5 dBm output (Europe)
const char DefaultConfig868[35] = {0x58,0x60,0x00,0x58,0x5B,0x43,0x01,0xAB,0x8C,0x32,0xFF,0x30,0x10,0x26,0x90,0x69,
0x47,0x10,0x01,0x1C,0x16,0x10,0x0A,0x06,0x03,0x01,0x0F,0x00,0x00,0x00,0x3F,0x00};
const char DefaultTXPLL868 = 0x30;
const char DefaultRXPLL868 = 0x30;
// 905.002985 MHz, +5 dBm output (US)
const char DefaultConfig905[35] = {0xC7,0x60,0x00,0x5B,0xEE,0xF4,0x01,0xAB,0x8C,0x32,0xFF,0x68,0x10,0x26,0x91,0x69,
0x47,0x10,0x01,0x1C,0x16,0x10,0x0A,0x06,0x03,0x01,0x06,0x00,0x00,0x00,0x3F,0x00};
const char DefaultTXPLL905 = 0x30;
const char DefaultRXPLL905 = 0x68;
*/
void WriteStr(char *str);
void WriteLine(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_SendingOver(void);
void RF_SendChar(char *send_pt,uint8 send_cnt);
//void RF_SendString(char *send_pt);
void RF_SendAddCrc(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 a string, and also outputs trailing new-line and*/
/* carrage return characters */
/************************************************************************/
void WriteLine(char *str)
{
while(*str!='\0') {
_putchar(*str++);
}
_putchar('\r');
_putchar('\n');
}
/*************************************************************************/
/* This routine converts an ASCII hexadecimal digit to the corresponding */
/* integer value */
/*************************************************************************/
/*
char hexdigit2int(char val)
{
if ((val>=0x30)&&(val<=0x39)) return val-0x30;
if ((toupper(val)>=0x41)&&(toupper(val)<=0x46)) return val-0x41+10;
return 0x00;
}
*/
/************************************************/
/* This routine outputs a long value in decimal */
/************************************************/
/*
void writelong(int longval)
{
char i;
int divider;
divider=1000000000;
for (i=10;i>0;i--) {
_putchar((longval/divider)+0x30);
divider/=10;
}
}
*/
/*************************************************/
/* 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) Uart0SendString("Time overflow in RFtoTXmode");
WatchDogClear(); //clr watchdog
#ifdef INCLUDE_RF_INFORMATION
Uart0SendString("RF to TXmode"); // Uart0SendEnter();
// DelayMS(1); // finish sending last bit
#endif
IO1CLR = LED2; // LED1点亮
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_AMPLIFER
IO0SET = RF_AMP__P0_31; // 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) Uart0SendString("Time overflow in RFtoRXmode");
WatchDogClear(); //clr watchdog
#ifdef INCLUDE_RF_INFORMATION
Uart0SendString("RF to RXmode"); // Uart0SendEnter();
// DelayMS(1); // finish sending last bit
#endif
IO1SET = LED2; // LED2熄灭
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_AMPLIFER
IO0CLR = RF_AMP__P0_31; // AMP disable, set pin level to low
#endif
IRQEnable();
SetupCC1000RX(RxCurrent,RF_RxPll);
CC1000Mode=RFinRX_MODE;
}
}
////////////////////////////////////////////////////////////////////
// Dumps the values of all the registers of the CC1000 to the screen
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));
WriteLine("");
}
// for(RegCounter=0x40;RegCounter<=0x46;RegCounter++) {
for(RegCounter=CC1000_TEST6;RegCounter<=CC1000_TEST0;RegCounter++) {
WriteStr("Addr. "); WriteHEX(RegCounter); WriteStr(" : ");
WriteHEX(ReadFromCC1000Register(RegCounter));
WriteLine("");
}
}
*/
//////////////////////////////////////////////////////////////////
// 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -