📄 rfmodem_main.c
字号:
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;
AverageFreeRunCC1000();
//打开全局中断
_EINT();
while(1)
{
/* If state change, handle it */
if (State!=NextState)
{
ChangeState();
}
if (UnlockAverage)
{
UnlockAverage=0;
AverageFreeRunCC1000();
}
if (LockAverage)
{
LockAverage=0;
AverageManualLockCC1000();
}
if(RecOver)
{
uint rcrc,ccrc;
uchar rlen;
#ifdef CRC16
rcrc = RXBuffer[RXBufferWriteIndex-2];
rcrc = (rcrc << 8) | RXBuffer[RXBufferWriteIndex-1];
ccrc = Cal_CRC16(RXBuffer,BytesToReceive-2);
rlen = 2;
#else
rcrc = RXBuffer[RXBufferWriteIndex-1];
ccrc = Cal_CRC8(RXBuffer,BytesToReceive-1);
rlen = 1;
#endif
if(ccrc == rcrc)
{
/* If data in receive buffer, write it to the serial port */
while (RXBufferReadIndex < (RXBufferWriteIndex - rlen))
{
#ifdef CRY1602
if(pX == 0x10)
{
pX = 0;
if(pY)
{
LcdWriteCommand(0x01, 1); //显示清屏
}
pY ^= 1;
}
Disp1Char(pX++,pY,RXBuffer[RXBufferReadIndex]);
#endif
putchar(RXBuffer[RXBufferReadIndex++]);
}
RXBufferReadIndex = 0;
}
else
{
writeln("CRC Error");
}
RXBufferWriteIndex = 0;
RecOver = 0;
}
if (IFG1 & URXIFG0) // UART receive interrupt. PC has sent data to us.
{
if (State==IDLE_STATE) // Only handle data if idle
{
TBCTL |= TBCLR; // Reset time-out timer
TBCTL |= TBSSEL_1 + MC_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) // TimerB interrupt. TX timer has timed out.
{
TBCTL = 0x00;
NextState=TX_STATE;
}
/*
if(TACTL & TAIFG) // TimerA interrut ,check the keys
{
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;
}
*/
}
}
// This routine initialises the TX buffer at startup
void InitializeTXBuffer(void)
{
uchar i;
// Put preamble into buffer
for (i=0;i<PREAMBLE_LENGTH;i++)
{
TXBuffer[i]=0xAA;
}
TXBuffer[PREAMBLE_LENGTH]=UI1; // First byte of unique identifier
TXBuffer[PREAMBLE_LENGTH+1]=UI2; // Second byte of unique identifier
TXBuffer[PREAMBLE_LENGTH+2]=UnitAddress; // Unit address
TXBuffer[PREAMBLE_LENGTH+3]=0x00; // Default : no data
}
// This routine handles setup needed when changing states
void ChangeState(void)
{
uchar crclen;
uint crcval;
switch (NextState)
{
case RX_STATE:
if(State == TX_STATE)
{
DCLK_INT_UP; /* INT on rising edge */
DIO_IN; /* Set DIO as input */
SetupCC1000RX(RXCurrent,RXPLL);
}
State=RX_STATE;
SET_RXLED(ON);
SET_TXLED(OFF);
//初始化接收状态需要的变量
PreambleEnd = 0;
PreambleNextbit = 1;
BitCounter=0;
ByteCounter=0;
break;
case TX_STATE:
if(State != TX_STATE)
{
DCLK_INT_DN; /* INT on falling edge */
DIO_OUT; /* Set DIO as output */
SetupCC1000TX(TXCurrent,TXPLL);
}
State=TX_STATE;
SET_RXLED(OFF);
SET_TXLED(ON);
ME1 &= ~URXE0; // 禁止UART接收
crclen = TXBufferIndex - HEADER_SIZE - PREAMBLE_LENGTH;
#ifdef CRC16
crcval = Cal_CRC16(&TXBuffer[HEADER_SIZE+PREAMBLE_LENGTH],crclen);
TXBuffer[TXBufferIndex++] = crcval >> 8; //高8位
TXBuffer[TXBufferIndex++] = crcval & 0x00ff; //低8位
#else
crcval = Cal_CRC8(&TXBuffer[HEADER_SIZE+PREAMBLE_LENGTH],crclen);
TXBuffer[TXBufferIndex++] = crcval;
#endif
BytesToSend=TXBufferIndex; // Number of bytes to send
TXBuffer[PREAMBLE_LENGTH+3]=BytesToSend-HEADER_SIZE-PREAMBLE_LENGTH;
//初始化发射状态需要的变量
TXBufferIndex=0;
BitCounter=0;
ShiftReg=TXBuffer[TXBufferIndex++];
break;
case IDLE_STATE:
if(State==TX_STATE)
{
DCLK_INT_UP; /* INT on rising edge */
DIO_IN; /* Set DIO as input */
SetupCC1000RX(RXCurrent,RXPLL);
}
State=IDLE_STATE;
SET_RXLED(OFF);
SET_TXLED(OFF);
ME1 |= URXE0; // 使能UART接收
//初始化空闲状态需要的变量
TXBufferIndex=HEADER_SIZE+PREAMBLE_LENGTH;
PreambleNextbit = 1;
BitCounter = 0;
UnlockAverage=1;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -