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

📄 f905luointv.c

📁 430f1121与rf905接口
💻 C
字号:
/*饱含文件*********************************************/
#include "msp430x11x1.h"
/*缩写定义*********************************************/
#define uchar unsigned char
#define uint  unsigned int
#define ulint unsigned long int
/*常数定义***********************************************/
//#define wdt_time250 0x5a15
//#define wdt_close 	0x5a95
#define WC		0x00			// Write configuration register command
#define RC		0x10 			// Read  configuration register command
#define WTP		0x20 			// Write TX Payload  command
#define RTP		0x21			// Read  TX Payload  command
#define WTA		0x22			// Write TX Address  command
#define RTA		0x23			// Read  TX Address  command
#define RRP		0x24			// Read  RX Payload  command

#define chushi_time 0x2000	//2s
#define time_n          2
#define cishu_n		3

#define TX_EN1	P2OUT|=0x20;
#define TX_EN0	P2OUT&=0xdf;//p2.5
	
#define TRX_CE1	P2OUT|=0x02;
#define TRX_CE0	P2OUT&=0xfd;//p2.1

#define PWR_UP1 P2OUT|=0x04;
#define PWR_UP0 P2OUT&=0xfb;//p2.2

#define MOSI1	P2OUT|=0x01;
#define MOSI0	P2OUT&=0xfe;//p2.0

#define SCK1	P1OUT|=0x04;
#define SCK0 	P1OUT&=0xfb;//p1.2

#define CSN1	P1OUT|=0x08;
#define CSN0	P1OUT&=0xf7;//p1.3

#define led11  P1OUT|=0x20;
#define led10  P1OUT&=0xdf;//p1.5

#define led21  P1OUT|=0x80;
#define led20  P1OUT&=0x7f;//p1.7

#define led31  P1OUT|=0x10;
#define led30  P1OUT&=0xef;//p1.4

#define MISO	(P1IN&0x02)//p1.1
//#define AM	(P1IN&0x04) 
#define DR	(P1IN&0x01)  //p1.0
#define CD  (P1IN&0x40)  //p1.6

typedef struct RFConfig
{
	char n;
	char buf[10];
}RFConfig;

const RFConfig RxTxConf =
{
	0x0a,
	0x01, 0x0c, 0x44, 0x02, 0x02, 0xaa, 0xaa, 0xaa,0xaa, 0x58	
};
//0x01,0x00,//-10db
//0x01,0x10,//-10db 低功耗


const uchar Tx_address[4]={0xcc,0xcc,0xcc,0xcc};//rf905卡公共地址
const uchar  address[2]={0x00,0x02};

uchar  RxBuf[2];
uchar  no_rec_n;		//
uchar  time_dingshi;
uint   shijian;
uchar  start_flag;
float  vcc_value;
uchar  led_bit;
uchar  led_bit1=0;

void InitIO(void);	//初始化IO
void Initt905(void);			// Initialize t905
void SetTxMode(void);	//将905置成发射模式		// Set nRF905 in Tx mode
void SetRxMode(void);	//将905置成接收模式		// Set nRF905 in Rx mode
void TxPacket(void);	//将发送缓冲区TxBuf[]中(32BYTE)的数据发送出去		// Send data by nRF905
void RxPacket(void);	//将接收的数据放入接收缓冲区RxBuf[](32BYTE)		// Recive data by nRF905
void SpiWrite(uchar byte);	//将1字节数据通过IO发送出去			// Write data to nRF905
char SpiRead(void);	//接收1字节数据		// Read data to nRF905
void Delay(uchar n);			// Delay 100us
void init_cpu(void);
void init_ram(void);
void measure_vcc(void);		//电池电压检测

void init_ram(void)
{no_rec_n=0;
 time_dingshi=time_n;
 RxBuf[1]=time_n;
 RxBuf[0]=0;
 vcc_value=3.0;
 led_bit=0xb0;
 led11
 led21
 led31
}
void init_cpu(void)
{ WDTCTL=WDTPW+WDTHOLD;	//关闭看门狗定时器
 TACTL=TASSEL0+TACLR+ID0+ID1;		//ACLK,清TAR,1/8,
 CCTL0=CCIE;										//CCR0中断允许
 CCR0=chushi_time;							//定时时间5s
 TACTL|=MC0;										//增计数
 _EINT();												//中断允许
 LPM3;
}

void InitIO(void)
{P1DIR=0xbc;			
 P2DIR=0x27;			
	WDTCTL=WDTPW+WDTHOLD;	//关闭看门狗定时器
	Delay(200);
	Delay(200);	
	Delay(200);
	Delay(200);	
	Delay(200);
	Delay(200);	
	Delay(200);
	Delay(200);	
	Delay(200);
	Delay(200);	
	MOSI1
	SCK1
	CSN1
	SCK0	
	PWR_UP1										// nRF905 power on
	TRX_CE0										// Set nRF905 in standby mode
	TX_EN0 						        // set radio in Rx mode	
}

void Config905(void)
{
	char i;					
	CSN0	          						// Spi enable for write a spi command
	SpiWrite(WC);								// Write config command
	for (i=0;i<RxTxConf.n;i++)	// Write configration words
	{
		SpiWrite(RxTxConf.buf[i]);
	}
	CSN1	      								// Disable Spi
}


void Initt905(void)			// Initialize t905
{ InitIO();					//Set nRF905 in standby mode
	Config905();			//Config nRF905 module
	SetRxMode();			//Set nRF905 in Rx mode
}

void Delay(uchar n)
{	uchar i;
	while(n--)
	for(i=0;i<72;i++)
	    {;
	    }
}

void SpiWrite(uchar  byte)
{
	char i;	
	for (i=0;i<8;i++)			// Setup byte circulation bits
	{	
		
		if ((byte&0x80)==0x80)//if(flag)				// Put DATA_BUF.7 on data line
			MOSI1			
		else
			MOSI0				
		SCK1							// Set clock line high
		byte=byte<<1;			// Shift DATA_BUF
		SCK0							// Set clock line low 
	}	
}

char SpiRead(void)
{
	char i,j;	
	for (i=0;i<8;i++)			  // Setup byte circulation bits
	{	
		j=j<<1;								// Right shift DATA_BUF
		SCK1							    // Set clock line high
		if (MISO)
			j=j|0x01;						// Read data
		else
			j=j&0xfe;		
		SCK0									// Set clock line low
	}
	return(j);			  // Return function parameter
}

void TxPacket(void)
{
	uchar i;
	SetTxMode();
	//Config905();
	CSN0					// Spi enable for write a spi command
	SpiWrite(WTP);				// Write payload command
	//for(i=0;i<2;i++)
	//     {SpiWrite(0xaa);
	//     }
	SpiWrite(address[0]);		// Write 32 bytes Tx data
	SpiWrite(address[1]);
	//address[0]++;
	CSN1					// Spi disable
	Delay(1);
	CSN0					// Spi enable for write a spi command
	SpiWrite(WTA);				// Write address command
	for (i=0;i<4;i++)			// Write 4 bytes address
	{
		SpiWrite(Tx_address[i]);
	}
	CSN1					// Spi disable
	TRX_CE1				// Set TRX_CE high,start Tx data transmission
	Delay(1);				// while (DR!=1);
	TRX_CE0	
	PWR_UP1		// Set TRX_CE low
	SetRxMode();
}

void RxPacket(void)
{ //uint i;

	TRX_CE0									// Set nRF905 in standby mode
	CSN0										// Spi enable for write a spi command
	SpiWrite(RRP);					// Read payload command
	RxBuf[0]=SpiRead();
	RxBuf[1]=SpiRead();		
	CSN1										// Disable spi
	/*for(i=0;i<0xb000;i++)
	    {if(DR||AM)
	    	   _NOP();
	     else
	         break;
	    }										//接受完以后处于standby mode*/
/*	while(DR||AM)
	     {;}
	TRX_CE1	*/				//RxMode
	no_rec_n=0;
  if(RxBuf[1]!=0x00)
       time_dingshi=RxBuf[1];
  else
       {time_dingshi=time_n;
        RxBuf[1]=time_n;
       }
  if((RxBuf[0]&0x01)!=0x01)
      led_bit=led_bit|0x80;
  else
      led_bit=led_bit&0x7f;
  if((RxBuf[0]&0x02)!=0x02)
      led_bit=led_bit|0x10;
  else
      led_bit=led_bit&0xef;
}

void SetTxMode(void)
{
	TX_EN1
	TRX_CE0
	Delay(1); 				// delay for mode change(>=650us)
}


void SetRxMode(void)
{
	TX_EN0 
	TRX_CE1
	Delay(1); // delay for mode change(>=650us)				
}

void init(void)
{init_ram();
 Initt905();
 init_cpu();
}

interrupt[TIMERA0_VECTOR] void Timer_A(void)
{uint i;
 time_dingshi--;
 if((time_dingshi==0)&&(vcc_value>=2.0))
   {    PWR_UP1
   	Delay(5);
   	SetRxMode();						//启动接受模式
   // for(i=0;i<0x1000;i++)
   //     {if(!CD)						//判断CD信号
   //  	      {
    	       TxPacket();		  //发送数据
   // 	       break;
   // 	      }
   //     }
    if(i!=0x1000)
        {for(i=0;i<0x1000;i++)
    	     { if(DR)
    	  	     {RxPacket();
    	  	      break;
    	  	     }	//等待接受数据    	  	   
    	     }
        }
    TRX_CE0										//Set nRF905 in standby mode
    PWR_UP0
    if(i==0x1000)
          {no_rec_n++;
   	       if(no_rec_n>=cishu_n)
   	            {no_rec_n=0;
   	             time_dingshi=time_n;
   	             led_bit=0xb0;
   	             RxBuf[1]=time_n;
   	            }
   	       else
   	            time_dingshi=RxBuf[1];
   	      }
   }
  shijian++;
  if(shijian>=3600)
     {
      shijian=0;
      measure_vcc();
     }
  if(led_bit1)
        {led_bit1=0;
         P1OUT=(P1OUT&0x4f)|led_bit;
        }
  else
        {led_bit1=1;
         P1OUT=P1OUT|0xb0;
        } 
}

void measure_vcc(void)		//电池电压检测
{uint i,value;
 CACTL1=CAON;							//比较器打开,上升沿中断允许
 CACTL2=P2CA0+P2CA1;			//CA0,CA1均与外部连接
 P2DIR|=BIT0;
 P2OUT&=~BIT0;
 P2OUT|=BIT0;
 for(i=0;i<1000;i++)
     ;						//关闭比较器中断
 value=0;
 for(i=0;i<5000;i++)
     {if((CACTL2&CAOUT)==1)
     	     P2OUT&=~BIT0;
      else
          {P2OUT|=BIT0;
           value++;
          }
     }
 CACTL1=0x00;
 CACTL2=0x00;
 vcc_value=1.23*5000/(float)value;
 if(vcc_value<2.2)
       led_bit=led_bit&0xdf;
 else if(vcc_value>2.3)
       led_bit=led_bit|0x20;
}



main(void)
{
 init();
 while(1)
    {;}
}
	










⌨️ 快捷键说明

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