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

📄 main.c

📁 这个程序是用MSP430写的chipcon公司的无线收发芯片CC1100的驱动程序。
💻 C
字号:
/******************************************************************
	CC1100:433MHZ
  	MCU: msp430f2012
	crystal:DCO
	Date :	2007-11-15
	Author:xiaotanlan
******************************************************************/
#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;

/******************************************************************
初始化各端口方向及初值
******************************************************************/
void init_msp430f2012(void)
{
	WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
	P1DIR &= ~(P_GDO0+P_GDO2+P_SO+KEY_PRESS);  //输入口线
	P1DIR |= LED+P_CSn+P_SCLK+P_SI;	//输出口线
	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)
{
	POWER_UP_RESET_CCxxx0();

	halRfWriteRfSettings_CC1100();


	halSpiWriteBurstReg(CCxxx0_PATABLE, paTable_CC1100, sizeof(paTable_CC1100));

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



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



/******************************************************************
 TX OPTION CC1100发射数据
******************************************************************/
void TxCC1100()
{
	unsigned char i;
	halSpiWriteReg(CCxxx0_FREND0, 0x10);//CC1100:POWER=10dbm
	for(i=0;i<4;i++)
	{
		//LED_ON();//*
		Dly1mS(30);
  		halRfSendPacket(txBuffer_CCxx00, (txBuffer_CCxx00[0]+1));
	}
	halSpiWriteReg(CCxxx0_FREND0, 0x15);//CC1100太近会收不到,将发射功率降低到-10DBM,再发一次
	Dly1mS(10);
	halRfSendPacket(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;
			halSpiStrobe(CCxxx0_SIDLE);
			Dly1mS(500);
			TxCC1100();		//回传数据给对方
		}
		else			//是由对方返回的信息
			if(rxBuffer_CCxx00[1]==0x07) Dly1mS(150);
		LED_OFF();
	}
}


/******************************************************************
	main program 主程序
******************************************************************/
void main()
{
	unsigned char temp;
	init_msp430f2012();			//mcu initializtion
	//LED_ON();
	do
	{							//check system if OK
		//SetupSPI();				//setup mcu spi for initialize RF module
		SetupCC1100();
	}while(systemerr);

	LED_ON();
	Dly1mS(10);		//delay ? ms
	LED_OFF();

	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;
		}
	}
}
//=================================================================
// END
//=================================================================

⌨️ 快捷键说明

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