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

📄 main.c

📁 2.45GHZ有源标签的源代码
💻 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 + -