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

📄 main.c

📁 MSP430F2232和CC1100通信的源代码,采用硬件SPI通信.
💻 C
字号:
/******************************************************************
    CC1100:433MHZ
    MCU: msp430f2232
    crystal:DCO
    Date :  2008-2-14
    Author: ruangf
******************************************************************/
#include  "main.h"

static unsigned char paTable_CC1100[] = {0xc0, 0xc8, 0x84, 0x51, 0x3f, 0x34, 0x1c, 0x6c };  //CC1100发射功率表
unsigned char txBuffer_CCxx00[0x05] = {0x02, 1, 1,1,0x01};  //发射缓冲
                                    //LENGTH,KEYCODE,FLAG,DATA0,DATA1.....
unsigned char rxBuffer_CCxx00[0x04];            //接收缓冲
unsigned char systemerr=0;
unsigned char dpynum=0;

//unsigned char par;
//unsigned char ver;
unsigned char temp;

/******************************************************************
初始化各端口方向及初值
******************************************************************/
void init_msp430f2232(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT    
    
    BCSCTL1 = CALBC1_1MHZ;                    // Set DCO after random function
    DCOCTL = CALDCO_1MHZ;
  
    BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO
    TACCTL0 = CCIE;                           // TACCR0 interrupt enabled
    TACCR0 = 12000;                           // ~ 1 sec
    TACTL = TASSEL_1 + MC_1;                  // ACLK, upmode      

    P1DIR &= ~KEY_PRESS;  //输入口线
    P1DIR |= LED; //输出口线
    
    P1REN |= KEY_PRESS;
    P1OUT |= KEY_PRESS;     //按键输入带上拉         
       
    _EINT();
    Initial_timerA0();
}

void Initial_timerA0(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
    CCTL0 = CCIE;                             // CCR0 interrupt enabled
    CCR0 = 50000;
    TACTL = TASSEL_2 + MC_3;                  // SMCLK,up and down mode,
}
/******************************************************************

******************************************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
    CCR0 = 50000;
    WaitRxEndtime++;
    //P1OUT ^= 0X01;
}


/*****************************************************************************************
    初始化cc1100,并切换到接收状态
*****************************************************************************************/
void SetupCC1100(void)
{
    CC_PowerupReset();

    systemerr = CC_WriteRfSettings();


    CC_SPIWriteBurstReg(CCxxx0_PATABLE, paTable_CC1100, sizeof(paTable_CC1100));

    CC_SPIStrobe(CCxxx0_SCAL);
    Dly1mS(2);
    CC_SPIStrobe(CCxxx0_SRX);
}



/***************************************************************
  判断CC1100 是否接收到数据,如果有,将其存放至缓冲
****************************************************************/
unsigned char RxCCxx00(void)
{
    unsigned char   length;
    length = sizeof(rxBuffer_CCxx00);
    if (CC_ReceivePacket(rxBuffer_CCxx00, length))
    {
        return 1;
    }
    else
        return 0;
}


/******************************************************************
 TX OPTION CC1100发射数据
******************************************************************/
void TxCC1100()
{
    unsigned char i;
    CC_SPIWriteReg(CCxxx0_FREND0, 0x10);//CC1100:POWER=10dbm
    for(i=0;i<4;i++)
    {
        //LED_ON();//
        Dly1mS(30);
        CC_SendPacket(txBuffer_CCxx00, (txBuffer_CCxx00[0]+1));
    }
    CC_SPIWriteReg(CCxxx0_FREND0, 0x15);//CC1100太近会收不到,将发射功率降低到-10DBM,再发一次
    Dly1mS(10);
    CC_SendPacket(txBuffer_CCxx00, (txBuffer_CCxx00[0]+1));
    //LED_OFF();//
}

/******************************************************************
data receive  CC1100接收数据
******************************************************************/
void RXCC1100(void)
{
    unsigned char j;
    if(RxCCxx00())              //是否收到数据?
    {
        dpynum = rxBuffer_CCxx00[0];    //dpynum为从对方接收的需要用LED灯显示的数据.
        LED_ON();
        if(rxBuffer_CCxx00[1]==0x01) //是对方发来的信息
    	{
                            			//则返回收到的信息
            for(j=0;j<PacketLength;j++)	//save
    	    {
                txBuffer_CCxx00[j+1]=rxBuffer_CCxx00[j];
    	    }
            txBuffer_CCxx00[2]=0x07;    //SLAVE FLAG  将接收到的数据回传给对方
            txBuffer_CCxx00[0]=PacketLength;
            CC_SPIStrobe(CCxxx0_SIDLE);
            Dly1mS(500);
            TxCC1100();     //回传数据给对方
    	}
        else            //是由对方返回的信息
            if(rxBuffer_CCxx00[1]==0x07) Dly1mS(150);
        LED_OFF();
    }
}


/******************************************************************
    main program 主程序
******************************************************************/
void main()
{
   volatile unsigned int i;

   init_msp430f2232();         //mcu initializtion
   LED_ON();    
    
    do
    {                           //check system if OK
        CC_SPISetup();          //setup mcu spi for initialize RF module
        SetupCC1100();
    }while(systemerr);

    Dly1mS(10);     //delay ? ms
    LED_OFF();   
        
       // CC_SPIStrobe(CCxxx0_SRES);        
        
       // par = CC_SPIReadStatus(CCxxx0_PARTNUM);
       // ver = CC_SPIReadStatus(CCxxx0_VERSION);        

    while(1)
    {
       
        if((P1IN & KEY_PRESS)==0)   //判断是否有键按下
    	{
            txBuffer_CCxx00[1]=8;

            LED_ON();       			//led on
            Dly1mS(50);
            txBuffer_CCxx00[2]=0x01;    //MAIN FALG
            TxCC1100();         		//发射信息

            LED_OFF();                  //send end, led off
    	}
        else
    	{
            RXCC1100();
            temp=dpynum;
            while (temp)
            {
                temp--;
                Dly1mS(100);
                LED_ON();
                Dly1mS(100);
                LED_OFF();
            }
            dpynum=0;
    	}
    }
}

/*
#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{
 // USICTL1 &= ~USIIFG;
  USICTL1 &= ~USIIE;
  temp=USISRL;
 // USISRL = P1IN;
 // USICNT = 8;                           // re-load counter
}
*/

//=================================================================
// END
//=================================================================

⌨️ 快捷键说明

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