📄 rfmodem_cc1000.c
字号:
// PALE_1; //PALE=1;
RXBufferReadIndex=0;
RXBufferWriteIndex=0;
SetupCC1000PD();
ResetCC1000();
SetupCC1000All();
WakeUpCC1000ToTX(TXCurrent,TXPLL);
SetupCC1000TX(TXCurrent,TXPLL);
if (!CalibrateCC1000())
{
writeln("TX Calibration failed");
}
// Calibration data is stored in the chip indexed by the selected frequency register
SetupCC1000RX(RXCurrent,RXPLL); // TRISC|=0x02; // Set DIO as input
if (!CalibrateCC1000())
{
writeln("RX Calibration failed");
}
// Now the CC1000 is calibrated for both RX and TX, we do not need to recalibrate
// unless the frequency is changed, the temperature changes by 40 degrees C
// or if the supply voltage changes by more than 0.5V
// Force update 强制发生一次状态转换
State=TX_STATE;
NextState=IDLE_STATE;
InitializeTXBuffer();
if(BUTTON1==0)
{
_NOP();
}
if(BUTTON2==0)
{
_NOP();
}
if(BUTTON3==0)
{
_NOP();
}
if(BUTTON4==0) //调用配置菜单
{
ConfigurationMode();
}
//补写PA_POW寄存器,保证以正确的功率输出
WriteToCC1000Register(CC1000_PA_POW,PA_Power);
LockAverage=0;
UnlockAverage=0;
/* Startup message */
writeln("RF Modem ready");
writestr("Compiled ");
writestr(__DATE__);
writestr(" ");
writestr(__TIME__);
writeln("");
dummy=ReadFromCC1000Register(CC1000_MODEM0);
switch(dummy)
{
case 0x07:
writestr("0.6kbit/s Manchester");
break;
case 0x03:
writestr("0.6kbit/s NRZ");
break;
case 0x17:
writestr("1.2kbit/s Manchester");
break;
case 0x13:
writestr("1.2kbit/s NRZ");
break;
case 0x27:
writestr("2.4kbit/s Manchester");
break;
case 0x23:
writestr("2.4kbit/s NRZ");
break;
case 0x37:
writestr("4.8kbit/s Manchester");
break;
case 0x33:
writestr("4.8kbit/s NRZ");
break;
case 0x47:
writestr("9.6kbit/s Manchester");
break;
case 0x43:
writestr("9.6kbit/s NRZ");
break;
case 0x57:
writestr("19.2kbit/s Manchester");
break;
case 0x53:
writestr("19.2kbit/s NRZ");
break;
case 0x55:
writestr("38.4kbit/s Manchester");
break;
case 0x51:
writestr("38.4kbit/s NRZ");
break;
case 0x50:
writestr("76.8kbit/s NRZ");
break;
default:
writestr("Invalid data rate");
break;
}
writeln("");
dummy=ReadFromCC1000Register(CC1000_PA_POW);
switch(dummy)
{
case 0x01:
writestr("-20/-19 dBm");
break;
case 0x02:
writestr("-18/-17/-16 dBm");
break;
case 0x03:
writestr("-15/-14/-13 dBm");
break;
case 0x04:
writestr("-12/-11 dBm");
break;
case 0x05:
writestr("-10/-9/-8 dBm");
break;
case 0x06:
writestr("-8 dBm");
break;
case 0x07:
writestr("-7 dBm");
break;
case 0x08:
writestr("-6 dBm");
break;
case 0x09:
writestr("-5 dBm");
break;
case 0x0A:
writestr("-4 dBm");
break;
case 0x0B:
writestr("-3 dBm");
break;
case 0x0C:
writestr("-2 dBm");
break;
case 0x0E:
writestr("-1 dBm");
break;
case 0x0F:
writestr(" 0 dBm");
break;
case 0x40:
writestr(" 1 dBm");
break;
case 0x50:
writestr(" 2/3 dBm");
break;
case 0x60:
writestr(" 4 dBm");
break;
case 0x70:
writestr(" 5 dBm");
break;
case 0x80:
writestr(" 6 dBm");
break;
case 0x90:
writestr(" 7 dBm");
break;
case 0xc0:
writestr(" 8 dBm");
break;
case 0xe0:
writestr(" 9 dBm");
break;
case 0xff:
writestr("10 dBm");
break;
default:
writestr("Not typical setting!");
break;
}
writeln("");
//蜂鸣器鸣叫一声,提示开始运行
P6DIR |= BIT7;
P6OUT &= ~BIT7;
for(i = 255;i > 0;i--)
{
dummy = 255;
while(dummy > 0)dummy--;
}
P6OUT |= BIT7;
// DumpCC1000Regs();
AverageFreeRunCC1000();
_EINT(); //INTCON=0x90;
while(1)
{
/* If state change, handle it */
if (State!=NextState)
{
// _DINT();
ChangeState();
// _EINT();
}
if (UnlockAverage)
{
UnlockAverage=0;
AverageFreeRunCC1000();
}
if (LockAverage)
{
LockAverage=0;
AverageManualLockCC1000();
}
/* If data in receive buffer, write it to the serial port */
if (RXBufferReadIndex!=RXBufferWriteIndex)
{
putchar(RXBuffer[RXBufferReadIndex++]);
RXBufferReadIndex &= 0x3F;
}
if (IFG1 & URXIFG0)
{
// UART receive interrupt. PC has sent data to us.
if (State==IDLE_STATE) // Only handle data if idle
{
TBCTL |= TBCLR; // 复位定时器// TMR2=0; // Reset time-out timer
TBCTL |= TBSSEL_1 + MC_1; // TMR2ON=1; // Start time-out timer
TBCCR0 = 328;
TXBuffer[TXBufferIndex++]=RXBUF0;
// IMPORTANT : We may have another interrupt or two occur before we can change mode
// Therefore, leave safety margin!
if (TXBufferIndex>=(TX_BUFFER_SIZE-3)) // Change mode early to have safety margin
{
NextState=TX_STATE;
}
}
else //进行一次哑读操作,消除中断标志
{
dummy = RXBUF0;
}
}
if (TBCTL & TBIFG)
{
// Timer 2 interrupt. TX timer has timed out.
TBCTL = 0x00;
NextState=TX_STATE;
}
if(TACTL & TAIFG)
{
if(BUTTON1==0)
{
TXBuffer[TXBufferIndex++]=Button1Char;
NextState=TX_STATE;
}
if(BUTTON2==0)
{
TXBuffer[TXBufferIndex++]=Button2Char;
NextState=TX_STATE;
}
if(BUTTON3==0)
{
TXBuffer[TXBufferIndex++]=Button3Char;
NextState=TX_STATE;
}
if(BUTTON4==0)
{
TXBuffer[TXBufferIndex++]=Button4Char;
NextState=TX_STATE;
}
TACTL &= ~TAIFG; // TMR1IF=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -