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

📄 main.c.bak

📁 基于MSP430单片机的测温系统及无线通信程序。
💻 BAK
字号:
//----------------------------------------------------------------------------
//  Demo Application for MSP430/CC1100-2500 Interface Code Library v1.0
//
//  K. Quiring
//  Texas Instruments, Inc.
//  July 2006
//  IAR Embedded Workbench v3.41
//08年7月29日,弄了Lpm3中断响应,TI_CC_RF_FREQ  2400还是只能接收一次,
//TI_CC_RF_FREQ 弄了Lpm3中断响应401还是能接收多次,不能保证每时都收到东西
//7月30日-wor状态成功,没有弄状态转换   
//----------------------------------------------------------------------------



#include "include.h"

unsigned char temperature;      //整数温度
#define _TRANSMITTER
//#define _SWOR
void CCxxx0ExitWorMode(void);
void CCxxx0EnWorMode(void);

extern char paTable[];        //功率能量
extern char paTableLen;

char txBuffer1[] = {0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; //第一个字节是发送的数据长度,第二个字节是地址
char txBuffer2[] = {0x08,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01}; //第一个字节是发送的数据长度,第二个字节是地址

static char rxBuffer[8];

char next;
unsigned int i;



void main (void)
{

   char  j = 0;
   char len1;    //Len of pkt to be RXed (only addr
   
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  
  TI_CC_GDO0_PxDIR &= ~TI_CC_GDO0_PIN;         //设GDOO为输入状
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO after random function
  DCOCTL = CALDCO_1MHZ;
  P2SEL &=0x00;
  IFG1 &= ~OFIFG;
  TI_CC_Wait(30);
  
  TI_CC_SPISetup();                         // Initialize SPI port -modify-

  TI_CC_PowerupResetCCxxxx();               // Reset CCxxxx,TI_CC_SPI.c
  writeRFSettings();                        // Write RF settings to config reg
  //设置功率
  TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, paTable, paTableLen);//Write PATABLE  memory locations:TI_CCxxx0_PATABLE=0x3f
  TI_CC_GDO0_PxDIR &= ~TI_CC_GDO0_PIN;       //设置GDO0为输入; 
  TI_CC_GDO0_PxSEL &= ~TI_CC_GDO0_PIN;       //设置P2.6脚为I/O端口; 
  TI_CC_GDO0_PxIES |= TI_CC_GDO0_PIN;       //下降沿触发中断; 
  TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN;      // 清除中断标志; 

  TI_CC_GDO0_PxIE |= TI_CC_GDO0_PIN;        // 使能中断总允许;
  TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);        ////设置芯片为空闲状态; 
  TI_CC_SPIStrobe(TI_CCxxx0_SPWD);        ////设置芯片为sleep状态;
  
  
  //TI_CC_LED_PxDIR = TI_CC_LED1 + TI_CC_LED2;                  //设定输出状态 
  
  


#ifdef _RECEIVER
  TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); 
  TI_CC_SPIStrobe(TI_CCxxx0_SRX);           // Initialize CCxxxx in RX mode. 
#endif 
  //如果接收到数据,则激活MCU                // When a pkt is received, it will 
                                            // signal on GDO0 and wake CPU 
  //_BIS_SR(LPM3_bits + GIE);                 //省电模式 Enter LPM3, enable interrupts 
#ifdef _SWOR
 
  CCxxx0EnWorMode();
#endif /* _SWOR */  
  
  //TI_CC_LED_PxDIR &= ~TI_CC_SW1; 
while(1)
{
   // Len of pkt to be RXed (only addr
                                          // plus data; size byte not incl b/c
     
   
#ifdef _TRANSMITTER
 //for(len1=0;len1<50;len1++)

  if(j) 
  {
   TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
   RFSendPacket(txBuffer1, 9);                 // Send value over RF
   //TI_CC_Wait(30000);
  
   TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
     RFSendPacket(txBuffer1, 9);                 // Send value over RF
  // TI_CC_Wait(30000);
   
   TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
     RFSendPacket(txBuffer1, 9);                 // Send value over RF
 //  TI_CC_Wait(30000);
  
  // TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
   
   
   
   j = 0;
  }
  else
    {

    RFSendPacket(txBuffer2, 9);                 // Send value over RF
      TI_CC_Wait(30000);
   TI_CC_Wait(30000);
    TI_CC_SPIStrobe(TI_CCxxx0_SFTX); 
    RFSendPacket(txBuffer2, 9);                 // Send value over RF
      TI_CC_Wait(30000);
   TI_CC_Wait(30000);
    TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
    RFSendPacket(txBuffer2, 9);                 // Send value over RF
      TI_CC_Wait(30000);
   TI_CC_Wait(30000);
    TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
    RFSendPacket(txBuffer2, 9);                 // Send value over RF
      TI_CC_Wait(30000);
   TI_CC_Wait(30000);
    TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
    RFSendPacket(txBuffer2, 9);                 // Send value over RF
      TI_CC_Wait(30000);
   TI_CC_Wait(30000);
    TI_CC_SPIStrobe(TI_CCxxx0_SFTX);

   
    j = 1;
    } 

   TI_CC_SPIStrobe(TI_CCxxx0_SFRX);//不能和RFReceivePacket()分得太远
  TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); 
  TI_CC_SPIStrobe(TI_CCxxx0_SRX);//后面的延时比较难调

   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
   TI_CC_Wait(30000);

   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
   TI_CC_Wait(30000);
  
  TI_CC_Wait(30000);    //要调的延时
  TI_CC_Wait(30000);
  _BIS_SR(LPM3_bits + GIE);
#endif 


#ifdef _SWOR
  if (RFReceivePacket(rxBuffer,&len1))       // Fetch packet from CCxxxx
      j++;//;  
           TI_CC_Wait(30000);    //要调的延时
      TI_CC_Wait(30000);    //要调的延时
      TI_CC_Wait(30000);    //要调的延时
      _BIS_SR(LPM3_bits + GIE);
#endif   
  
}
  
  
}





// The ISR assumes the int came from the pin attached to GDO0 and therefore
// does not check the other seven inputs.  Interprets this as a signal from
// CCxxxx indicating packet received.
//#ifdef _RECEIVER
#pragma vector=PORT2_VECTOR
__interrupt void port2_ISR (void)
{ 
                               // disEnable interrupts
  char len; // Len of pkt to be RXed (only addr
                                          // plus data; size byte not incl b/c
  next++;                                         // stripped away within RX function)
   
  ////CCxxx0ExitWorMode();
  //TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);
  //TI_CC_SPIStrobe(TI_CCxxx0_SRX);//后面的延时比较难调
  TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN;              // Clear flag 在这里才能在调试状态下不断进入中断
  if (RFReceivePacket(rxBuffer,&len))       // Fetch packet from CCxxxx
              // Toggle LEDs according to pkt data
  TI_CC_SPIStrobe(TI_CCxxx0_SFRX);//不能和RFReceivePacket()分得太远
  
  TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); 
  TI_CC_SPIStrobe(TI_CCxxx0_SRX);//后面的延时比较难调
  
  TI_CC_Wait(30000);    //要调的延时
  TI_CC_Wait(30000);    //要调的延时

  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  

  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  #ifdef _SWOR
  TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
  RFSendPacket(txBuffer1, 9);
  
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
  RFSendPacket(txBuffer1, 9);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
  RFSendPacket(txBuffer1, 9);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
  RFSendPacket(txBuffer1, 9);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  
  #endif 
  
  ////CCxxx0EnWorMode();
   
  //_BIC_SR_IRQ(LPM3_bits);
 //_DINT(); 
}
//#endif
void CCxxx0EnWorMode(void) 
{ 
// Set Event0 timeout = 300 ms (RX polling interval) 
// WOR_RES = 0 
// T_event0 = 750 / f_xosc * EVENT0 * 2^(5*WOR_RES) = 300 ms // Assuming f_xosc = 27 MHz 
// => EVENT0 = 10800 = 0x28A0 TI_CCxxx0_WOREVT1
  TI_CC_SPIWriteReg(TI_CCxxx0_WOREVT1,0x28 ); // WOR High byte Event Timeout. 0x32
  TI_CC_SPIWriteReg(TI_CCxxx0_WOREVT0, 0xa0); // WOR Low byte Event Timeout. 0xC8
// Enable automatic initial calibration of RCosc. 
// Set T_event1 ~ 345 us, enough for XOSC stabilize before starting calibration. 
// Enable RC oscillator before starting with WOR (or else it will not wake up). 
// Not using AUTO_SYNC function. 
  TI_CC_SPIWriteReg(TI_CCxxx0_WORCTRL, 0x38); // WOR control 电磁波激活控制0x79
// Setting Rx_timeout < 0.5 %. 
// => MCSM2.RX_TIME = 101b 
// => Rx_timeout = (EVENT0 * 0.1127) = (10800 * 0.1127) = 1.172 ms, i.e. 0.391% RX duty cycle 
  TI_CC_SPIWriteReg(TI_CCxxx0_MCSM2,0x00); // 主通道控制状态机配置
  TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1,0x30); //设置读取包后进入IDLE态 
  //TI_CC_SPIWriteReg(TI_CCxxx0_MCSM0,0x18); //主通道控制状态机配置calibrate when going from IDLE to RX 
  TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); 
  TI_CC_SPIStrobe(TI_CCxxx0_SWORRST); // Initialize CCxxxx WOR Timer.
  TI_CC_SPIStrobe(TI_CCxxx0_SWOR); // Start automatic RX polling sequence 
}


//************************************************************************************
//Returns : None 
//Parameters : None 
//Purpose : void CCxxx0ExitWorMode(void) 
// CC2500 退出WOR模式 要配置这些些寄存器
//功能描述:退出CCxxx0电磁波激活模式 
//注意事项:None
//************************************************************************************
void CCxxx0ExitWorMode(void)
{
  TI_CC_SPIWriteReg(TI_CCxxx0_MCSM2,0x07); 
//RX_TIME[2:0]=111 ,无工作暂停
  TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1,0x30); 
//CCA_MODE[5:4]=11,RXOFF_MODE[3:2]=00 , TXOFF_MODE[1:0]=00 
 // TI_CC_SPIWriteReg(TI_CCxxx0_MCSM0,0x18); 
//Enable automatic FS calibration when going from IDLE to RX/TX/FSTXON 
  TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -