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

📄 接收.c

📁 利用msp430控制cc1101进行两个模块之间的通信
💻 C
字号:
#include  <msp430x14x.h>
#include <stdlib.h>
#include "CC1101_h.h"

#define CSn_PIN     BIT5
#define GDO0_PIN    BIT4
#define SPI_SOMI    BIT2  //(和GDO1为同一个脚)
#define SPI_CLK     BIT1 
#define SPI_SIMO    BIT0

//unsigned char txBuffer[LENGTH_ID];  
unsigned char rxBuffer[LENGTH+2];
unsigned char RxFlag;

//-----------------------------------------------------------------------------
unsigned char SPI_bitbang_out(unsigned char value)
{
     unsigned char i;
     unsigned char rTemp;
     for(i = 0; i < 8; i++)
     {  
         P1OUT &=~SPI_CLK;                    //CLK=0 Set clock low 
         if(value & 0x80)P1OUT |=  SPI_SIMO;  // SIMO=1 Set SIMO high...
         else P1OUT &= ~SPI_SIMO;             // SIMO=0 Set SIMO low...
         value = value << 1;       
         P1OUT |= SPI_CLK;                    //CLK=1 Set clock high
         rTemp <<= 1;
         if(P1IN & SPI_SOMI) rTemp |= 0x01; 
         else rTemp &= 0xfe; 
     }
     P1OUT &=~SPI_CLK;                        //CLK=0 Set clock low 
    return(rTemp);
}

//------------------------------------------------------------------------------------
// Input eight-bit value using selected bit-bang pins
unsigned char SPI_bitbang_in(void)
{ 
     unsigned char i;
     unsigned char rTemp;
     for(i = 8; i > 0; i--)
     {   
         P1OUT |= SPI_CLK;                    //CLK=1 Set clock high
         rTemp <<= 1;
         if(P1IN & SPI_SOMI)rTemp |= 0x01;
         else rTemp &= 0xfe;
         P1OUT &=~SPI_CLK;                    //CLK=0 Set clock low    
     }
     return(rTemp);
}

void SPIWriteReg(unsigned char addr, unsigned char value)
{
    P1OUT &=~CSn_PIN;                         //CS=0 CS enable
    while (P1IN & SPI_SOMI);                  // Wait for CCxxxx ready
    SPI_bitbang_out(addr);                    // Send address
    SPI_bitbang_out(value);                   // Send data
    P1OUT |= CSn_PIN;                         //CS=1 CS disable
}

void SPIWriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
{
     unsigned char i;
     P1OUT &=~CSn_PIN;                        //CS=0 CS enable
     while (P1IN & SPI_SOMI);                 // Wait for CCxxxx ready 
     SPI_bitbang_out(addr | CCxxx0_WRITE_BURST);   // Send address
     for (i = 0; i < count; i++)
     {
         SPI_bitbang_out(buffer[i]);          // Send data
     }
     P1OUT |= CSn_PIN;                        //CS=1 CS disable
}

//*******************************************************
unsigned char SPIRead(unsigned char addr, unsigned char falg_read)
{
      unsigned char rTemp;
      P1OUT &=~CSn_PIN;                       //CS=0 CS enable
      while (P1IN & SPI_SOMI);                // Wait for CCxxxx ready
      SPI_bitbang_out(addr | falg_read);      // Send address
      rTemp = SPI_bitbang_in();               // Read data
      P1OUT |= CSn_PIN;                       //CS=1 CS disable
      return ( rTemp );
}

void SPIReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
{
    unsigned char i;
     P1OUT &=~CSn_PIN;                        //CS=0 CS enable
     while (P1IN & SPI_SOMI);                 // Wait for CCxxxx ready
     SPI_bitbang_out(addr | CCxxx0_READ_BURST);    // Send address
     for (i = 0; i < count; i++)
     {
         buffer[i] = SPI_bitbang_in();        // Read data
     }
     P1OUT |= CSn_PIN;                        //CS=1 CS disable
}

unsigned char SPIStrobe(unsigned char strobe)
{
     unsigned char RxTxstatus;
     P1OUT &=~CSn_PIN;                        //CS=0 CS enable
     while (P1IN & SPI_SOMI);                 // Wait for CCxxxx ready
     RxTxstatus = SPI_bitbang_out(strobe);    // Send strobe
     P1OUT |= CSn_PIN;                        //CS=1 CS disable
     return(RxTxstatus);
}

void PowerupResetCCxxxx(void)
{
    P1OUT &=~SPI_CLK;                         //CLK=0 Set clock low 
    P1OUT &= ~SPI_SIMO;                       // SIMO=0 Set SIMO low...
    P1OUT |= CSn_PIN;                         //CS=1 CS disable
    _NOP();_NOP();_NOP();_NOP();_NOP();
     P1OUT &=~CSn_PIN;                        //CS=0 CS enable       
    _NOP();_NOP();_NOP();_NOP();_NOP();
    P1OUT |= CSn_PIN;                         //CS=1 CS disable
    _NOP();_NOP();_NOP();_NOP();_NOP();
    P1OUT &=~CSn_PIN;                         //CS=0 CS enable
    while (P1IN & SPI_SOMI);                  // Wait for CCxxxx ready
    SPI_bitbang_out(CCxxx0_SRES);
    while (P1IN & SPI_SOMI);                  // Wait for CCxxxx ready
    P1OUT |= CSn_PIN;                         //CS=1 CS disable
}
/*
void TxData(void)   //先采用查询发送
{
       P1IE &= ~GDO0_PIN;   //关闭GDO0中断      
       txBuffer[0] = 0;
       txBuffer[1] = 0x22;
       txBuffer[2] = 0x77;
       txBuffer[3] = 0xdd;
       SPIStrobe(CCxxx0_SFTX);                //刷新TX_FIFO
       SPIWriteBurstReg(CCxxx0_TXFIFO, txBuffer, LENGTH_ID ); // Write TX data;    LENGTH_ID == 4
       SPIStrobe(CCxxx0_STX);      // Change state to TX, initiatingdata transfer
       while (!( P1IN& GDO0_PIN));    // Wait GDO0 to go hi -> sync TX'ed                                   
       while ( P1IN& GDO0_PIN);       // Wait GDO0 to clear -> end of pkt
       P1IFG &= ~GDO0_PIN;                  // After pkt TX, this flag is set, Clear it.
       P1IE |= GDO0_PIN;   //开GDO0中断            
}*/

const unsigned char ConfigurationCCxxx0_433[47]=
{
 //Data	:Reg:       Name (x = non-default)
0x29, //00	        IOCFG2 (x)
0x2E,   //01	        IOCFG1
0x06,	//02            IOCFG0D (x) 

0x47,   //03		FIFOTHR (x)
0xD3,   //04     	SYNC1
0x91,   //05     	SYNC0

LENGTH,   //06		PKTLEN (x) //最大长度  PKTLEN (x) 
0x06,	//07    	PKTCTRL1 (x)   //有地址,广播地址为0x00
0x05,   //08	 	PKTCTRL0 (x)    //  CRC calculation in TX and CRC check in RX enabled  
                                       //可变长度
                              
0x00,   //09		ADDR (x)  //设自己的地址
0x00,   //0A	        CHANNR (x)

0x06,	//0B	        FSCTRL1 (x)  //*电流与灵敏度有关     IF Frequency -> FREQ_IF[4:0] => 152.34 kHz
0x00,   //0C		FSCTRL0 (x)

0x10,   //0D		FREQ2 (x)     
0xa7,   //0E		FREQ1 (x)     //f = 432.999817@0x10a762
0x62,   //0F		FREQ0 (x)     

0xCA,   //10		MDMCFG4 (x)
0x83,   //11		MDMCFG3 (x)
0x12,   //12    	MDMCFG2 (x)    " 12 == 16/16 sync word bits detected  "
0x22,   //13		MDMCFG1 (x)    "  Number of preamble bytes == 4"
0xF8,   //14		MDMCFG0 (x)
0x34,   //15		DEVIATN (x)
//**************************************************************************************************************************************************************
0x07, //0x13,//0x1E,   //16		MCSM2     
   //*低功耗有关   2008-05-24  改为0x13
  // "bit4(RX_TIME_RSSI) ==1  is Direct RX termination based on RSSI measurement (carrier sense)."
           // ==1  :使能载波检测,即没有载波信号时,立即退出RX状态
           // ==0 : 直到RX_TIME溢出,退出RX状态
  // "bit3(RX_TIME_QUAL) ==1  is When the RX_TIME timer expires,the chip checks if either sync word is found or PQI is set.
                      // ==0  is .............................., the chip checks if sync word is found.
          //==1: RX_TIME溢出时如果收到 sync word 或者PQI is set,则继续接收 ,否则退出接收状态
          //==0: RX_TIME溢出时如果收到 sync word,则继续接收 ,否则退出接收状态  2008-05-24改为0
  // "bit2--0 == 6 :  0.195% @ WOR_RES=0"
   // "bit2--0 == 3 :  2.441ppm @ WOR_RES=1"
//*************************************************************************************************************
0x30,   //17		MCSM1           //接收和发射后进入空闲状态
                                    
0x18,   //18           MCSM0 (x)     // 0x18  == Calibration from IDLE to TX/Rx
0x16,   //19		FOCCFG (x)
0x6C,   //1A		BSCFG (x)
//****************************************************************************************************
0x43,   //1B		AGCCTRL2 (x)
      //bit7-6 ( MAX_DVGA_GAIN[1:0] ) == 01:  The highest gain setting can not be used
      //bit5-3 ( MAX_LNA_GAIN[2:0] ) == 000:   Maximum possible LNA + LNA 2 gain
      //bit2-0 ( MAGN_TARGET[2:0] )  == 011:  33 dB  == Target amplitude from channel filter
//******************************************************************************************************
0x40,//0x43,   //1C		AGCCTRL1 (x)
   //bit7  == 0:   固定为0
   //bit6  == 1:   固定为1
   //bit5-4 ( CARRIER_SENSE_REL_THR[1:0] ) == 00 :   Relative carrier sense threshold disabled
   //bit3-0 ( CARRIER_SENSE_ABS_THR[3:0] ) == 011 :   3 dB above MAGN_TARGET setting
                //当大于 " MAGN_TARGET setting " 3dB 时 ,表示有载波
   //2008-05-20改为0x10  先测试
//****************************************************************************************************
0x91,   //1D		AGCCTRL0 (x)

0x0a,//0xff,   //1E		WOREVT1   //  t_E0 = (750/26000000)*EVT0  = 1890.4ms
0x94,//0xff,   //1F		WOREVT0   //  t_E0 = (750/26000000)*EVT0 *32 = 2500ms  2008-05-24
//**************************************************************************************************
0x39,//0x38,   //20		WORCTRL    
    //bit7 ==0: 使能RC, When written to 0, automatic initial  calibration will be performed,
    //bit6-4:   EVENT1[]= 3  is  12  
    //bit3 ==1:  Enables the RC oscillator calibration.
    //bit2-0 == 0:   WOR_RES=0
    //bit2-0 == 1:   WOR_RES=1   2008-05-24
//*************************************************************************************************
0x56,   //21		FREND1 (x)
0x10,   //22		FREND0 (x)   //选择功率使用的pdat值//!!!出错会引起输出功率为0

0xE9,   //23		FSCAL3 (x)
0x2A,   //24		FSCAL2 (x)
0x00,   //25		FSCAL1 (x)
0x1F,   //26		FSCAL0 (x)

0x41,   //27		RCCTRL1
0x00,   //28		RCCTRL0
0x59,   //29		FSTEST (x)
0x7F,   //2A		PTEST

0x3F,   //2B		AGCTST
0x81,   //2C		TEST2 (x)
0x35,   //2D		TEST1 (x)
0x09    //2E		TEST0 (x)

};
void writeRFSettings(void)
{
  unsigned char i;
  for(i=0; i<47; i++)
  {
      SPIWriteReg(i,ConfigurationCCxxx0_433[i]);
  }
}

unsigned int temp;

void main (void)
{
	
    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
    P1SEL = 0;
    P1DIR |= SPI_SIMO + SPI_CLK + CSn_PIN  ;  //为输出
    P1DIR &= ~( SPI_SOMI +GDO0_PIN );         //为输入   
    P1OUT &= ~(SPI_SIMO  + SPI_CLK );
    P1OUT |= CSn_PIN;
    P4DIR |= BIT7;
    //****************************************************************************** 
    PowerupResetCCxxxx();               // Reset CCxxxx
    writeRFSettings();                        // Write RF settings to config reg
    SPIWriteReg(CCxxx0_PATABLE , PA_VALE);  //Write PATABLE,设置输出功率
    //*********************************************************************
    P1IES |= GDO0_PIN;       //使能GDO0中断发生在下降沿
    P1IFG = 0x00;
    P1IE |= GDO0_PIN;
    _EINT();                     //使能全局中断
    SPIStrobe(CCxxx0_SIDLE);     //cc1101退出SWOR
    SPIStrobe(CCxxx0_SFTX);
    SPIStrobe(CCxxx0_SRX);      //进入接收
    while(1)
    {
        if(RxFlag == 99)
        {
            RxFlag = 0;       //表示收到数据,数据在 rxBuffer 
            for(temp=0; temp<0xffe; temp++);
            for(temp=0; temp<0x3c; temp++)
            {
                rxBuffer[temp] = 0;
            }
            P4OUT &= ~BIT7;
            SPIStrobe(CCxxx0_SIDLE);//cc1101退出SWOR
            SPIStrobe(CCxxx0_SFTX);
            SPIStrobe(CCxxx0_SRX);     //进入接收
        }
        
        _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
    }
}

//***********************************************
interrupt[PORT1_VECTOR] void p1_ISR (void)
{
    unsigned int length;
    unsigned int getlen;
    unsigned char addr;
    unsigned char *status;
    if(P1IFG & GDO0_PIN)
    {
	      RxFlag = 11;  
	      while( SPIRead(CCxxx0_RXBYTES, READ_STATUS) & CCxxx0_NUM_RXBYTES)   // 判断CCxxx0_RXBYTES 是否为空
	      {
	          length = SPIRead(CCxxx0_RXFIFO ,CCxxx0_READ_SINGLE);              //长度=地址(1)+数据(20) 
	          _NOP();   
	          if(length == 21)                                
	          {
	            //  addr = SPIRead(CCxxx0_RXFIFO ,READ_REG );	      		//接收 地址
	            //  getlen = length-1;
	            //  _NOP();
	              SPIReadBurstReg(CCxxx0_RXFIFO, rxBuffer, length);   // Pull data(数据-地址)
	            //  if(rxBuffer[length] & CCxxx0_CRC_OK )               // CCxxx0_CRC_OK  ==  0x80 (第22个字节RSSI的最高位)
	            
		            SPIReadBurstReg(CCxxx0_PKTSTATUS,status,1);
		            if(*status & CCxxx0_CRC_OK )
	              {
	                RxFlag = 99; 				      //收到crc效验正确的数据
	                P4OUT ^= BIT7;
	                break;
	              }
	          }
	      }
          
    }
    _NOP();
    P1IFG  = 0;
}

⌨️ 快捷键说明

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