📄 main.c
字号:
/**************************************************************************************************/
#include "msp430x20x3.h"
#include "stdlib.h"
#include "hardware.h"
#include "cc2500.h"
#include "timer.h"
#include "spi.h"
/********************************变量定义**************************************
*******************************************************************************/
extern unsigned char paTable[];
extern unsigned char paTableLen;
unsigned char txBuffer[4],rxBuffer[4];
/*****标签数据数据格式定义******/
const unsigned int TagId = 0x003F;
const unsigned char TagIdH = 0x00;
const unsigned char TagIdL = 0x01;
#define Flag_WaitForRx 0
#define Flag_ReadPacket_RF 1
#define Flag_SendPacket_RF 2
#define Flag_GotoPowerDown_RF 3
#define Killed 0
#define UnKilled 1
#define Active 0x55
#define Query 0xAA
#define Kill 0x5A
unsigned char Mode_CCxx00;
unsigned char Tag_Status;
/**************************************************************************************************
**函数名称:void main (void)
**入口参数:无
**出口参数:无
**功能描述:主循环函数
**************************************************************************************************/
void main (void)
{
unsigned char length;
//TagChannel = (unsigned char)(TagId & 0x3F);
//TagChannel = (TagIdL & 0x3F);
//unsigned char TagChannel = 5;
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
BCSCTL1 = CALBC1_8MHZ; // DCO = 8MHZ
DCOCTL = CALDCO_8MHZ;
IFG1 &= ~OFIFG; // 清除晶振失效标志
P1DIR |= 0xf1;
//srand(TagId); //产生随机延时的种子
TI_CC_SPISetup(); // 初始化 SPI 接口
TI_CC_PowerupResetCCxxxx(); // 复位 CC2500
writeRFSettings(); // 写配置寄存器
TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, paTable, paTableLen);
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); //转换CC2500为空闲状态
//InitWDTTimer();
InitTimerA0();
_EINT();
LED_OFF;
//SwitchChannel(TagChannel);//切换到标签信道
//TI_CC_SPIStrobe(TI_CCxxx0_SWOR);//enter wor mode
//P1IFG = 0x00; //enable rx interrupt
//P1IE |= TI_CC_GDO0_PIN ;
Mode_CCxx00 = Flag_GotoPowerDown_RF;
Tag_Status = Killed;
while(1)
{
switch(Mode_CCxx00)
{
case Flag_ReadPacket_RF:
{
length = 16;
if(RFReceivePacket(rxBuffer, &length))
{
switch(rxBuffer[0])
{
case Active://收到激活命令
{
LED_ON;
Tag_Status = UnKilled;//置激活标志
TI_CC_SPIStrobe(TI_CCxxx0_SRX); //enter rx mode
P1IFG = 0x00; //enable rx interrupt
P1IE |= TI_CC_GDO0_PIN;
StartTimerA0();//启动定时器,如果指定的时间内没有收到任何信息则进入低功耗模式
Mode_CCxx00 = Flag_WaitForRx:
break;
}
case Query://收到查询命令,只能由中断进入
{
Mode_CCxx00 = Flag_SendPacket_RF;//准备发送标签信息,此时接收中断已关,只能进入发射模式
break;
}
case Kill://收到灭活命令,只能由中断进入
{
if((rxBuffer[1]==TagIdH) && (rxBuffer[2]==TagIdL))
{
Tag_Status = Killed;//置位灭活标志
StartTimerA0();
Mode_CCxx00 = Flag_GotoPowerDown_RF;//进入低功耗模式
}
break;
}
default:
{
Mode_CCxx00 = Flag_GotoPowerDown_RF;//接收出错进入低功耗模式
break;
}
}
break;
}
}
case Flag_WaitForRx:
break;
case Flag_SendPacket_RF:
{
while(!(TI_CC_GDO2_PxIN & TI_CC_GDO2_PIN));//等待信道空闲
RFSendPacket(txBuffer,5); //发送标签信息
TI_CC_SPIStrobe(TI_CCxxx0_SRX); //enter rx mode
P1IFG = 0x00; //enable rx interrupt
P1IE |= TI_CC_GDO0_PIN;
break;
}
case Flag_GotoPowerDown_RF:
{
LED_OFF;
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);
TI_CC_SPIStrobe(TI_CCxxx0_SWOR);//CCxx00 enter wor mode
P1IFG = 0x00; //enable interrupt
P1IE |= TI_CC_GDO0_PIN;
_BIS_SR(LPM3_bits+GIE);
break;
}
default: break;
}
}
}
#pragma vector=PORT1_VECTOR //该中断在电磁波激活后使能,收到数据包触发中断,进入数据读取模式
__interrupt void port1_ISR (void)
{
Mode_CCxx00 = Flag_ReadPacket_RF;//进入读取模式
P1IE &= ~TI_CC_GDO0_PIN;//关中断
P1IFG = 0x00;
}
#pragma vector = TIMERA0_VECTOR //ccr0中断服务,
__interrupt void timera0_isr(void)
{
TACTL &= (~MC1); //停止定时器
Mode_CCxx00 = Flag_GotoPowerDown_RF; //超时进入低功耗模式
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -