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

📄 rfmodem_main.c

📁 用MSP430F149控制普通射频芯片CC1000的双向通信程序(串口、液晶显示)
💻 C
📖 第 1 页 / 共 2 页
字号:
      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 + -