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

📄 wireless.c

📁 基于 arm philiplpc2210 nrf905 c 程序
💻 C
字号:
////////////////////////////////////////////////////////////////////////////////////GRISHWORLD
#include <reg52.h>
#include <stdio.h>
#include <INTRINS.H>
#include <absacc.h>


#include <wireless.h> 

//#include "hotins.h"
/*---------------------*/

#define SIZE 32



void RF905_Config(void);
void nrf905_SetTxAddr(void);
void nrf905_Init(void);
void RFStandBy(void);
void RFRXModel(void);
void RFTXModel(void);
void DelayMs(unsigned char);
void nrf905_SetData();
void nrf905_WaitSended();
void nrf905_SendData();
void nrf905_SendAgain();
void nrf905_ReadData();
void nrf905_SpiTest();
void RfRecvProc();
void io_init();
void SPI_CS_ON(void);
void SPI_CS_OFF(void);
void DELAY_us(int);
void DELAY_ms(int);
void DELAY_s(int);
void X25045_Reset_Watchdog(void);





unsigned char SpiReadWrite(unsigned char);
#define _rlca_()          CY   = ACC & 0x80           //产生RLC A指令

	unsigned char TxBuf[SIZE],RxBuf[SIZE];


// 试验板上有14根线   以上8根   还有cd am gnd gnd +3 upclk 
//  nRF905板上的引脚定义
/*  VCC     1
	TXEN    2
	TRX_CE	3	
	PWR		4
	uCLK	5
	CD		6
	AM		7
	DR		8
	MISO	9	
	MOSI	10
	SCK		11
	CSN		12
	GND		13
	GND		14
*///对应单片机引脚


    sfr  WDT_CONTR  = 0xE1  ;

	sbit	CSN		= P2^1;
	sbit	SCK 	= P2^0;       	
	sbit    MOSI    = P2^3;
	sbit	MISO 	= P2^2;    
  	sbit    DR      = P2^4;
	sbit	PWR		= P2^6;
	sbit	CE 		= P2^5;
	sbit 	EN 		= P2^7;
 
///////////////////////////////////////
    sbit X25045_CS    = P1^4;
    sbit X25045_SO    = P1^5;
    sbit X25045_SCK   = P1^6; 
    sbit X25045_SI    = P1^7;



///////////////////////////////////


	sbit	LED0	=P0^0;      	
	sbit	LED1	=P0^1; 
	sbit	LED2	=P0^2;     
	sbit	LED3	=P0^3; 

 

	int counter=0;
/*		//UNUSED 
	sbit	LED4	=P0^4;   
	sbit	LED5	=P0^5;   
	sbit	LED6	=P0^6;   
	sbit	LED7	=P0^7;   
*/

/*		typedef  union { 
			word w;
			byte bh;
			byte bl;
		}  WordType;
		                  
		typedef  union { 
			dword dw;  
			word w[2];
			byte b[4];
		}  DwordType;

*/

void io_init(void)
{int ii;
	  IE = 0x00;//关闭中断
	  P2 = 0xff;//P2口初始化
	  P0 = 0xff;//P0口初始化
	  P1 = 0xff;//P1口初始化
	  P3 = 0xff;//P3口初始化


	CSN=	1;
	SCK	=	0;     	
	MISO 	= 1;    //SDO
//	CSN		= 1;
//  MOSI    = P1^5;///////////////////////////未知 


	LED0	=0;      	
	LED1	=1; 
	LED2	=1;     
	LED3	=1;  
		for(ii=0;ii<32;ii++)
	{
		TxBuf[ii]=0;
		RxBuf[ii]=0;
	}
}

////////////////////////////////////////////////////////////////////////////////END SPI  BY GRISHWORLD

void main()
{
   int i;
	io_init();
	LED0	=0;      	
	LED1	=0; 
	LED2	=1;     
	LED3	=1; 
	DELAY_ms(1);

 	nrf905_Init();
	DELAY_ms(1);
//	DELAY_s(10);

//	 nrf905_WaitSended();
//	 nrf905_SendAgain();
    WDT_CONTR  = 0X00; 

    RfRecvProc();
//RFStandBy();//待机
	for(;;)

	     {
//测试发送
//            X25045_Write_Status(0x00); //WD timeout is in 1.4S   
  	 
//    		X25045_Reset_Watchdog();
		RxBuf[0]=0x0;
//		for(i=0;i<32;i++)
  		 TxBuf[i]=0x55;
				DELAY_us(100);
		 nrf905_SendData();
			DELAY_us(100);
	 //  RFStandBy();
//		 RFRXModel();
			//	DELAY_us(100);

	//	 nrf905_SpiTest();//测试spi  读配制寄存器 通过

//测试接收	


	     //		RFRXModel();
			DELAY_ms(1);

		//		RfRecvProc();
	
			if(RxBuf[0]!=0)
				{
				RxBuf[0]=0x0;
					
					LED0	=0;      	
					LED1	=1; 
					LED2	=1;     
					LED3	=1; 
					
					DELAY_ms(1);
					LED0	=1;      	
					LED1	=0; 
					LED2	=1;     
					LED3	=1; 
					DELAY_ms(1);
					LED0	=1;      	
					LED1	=1; 
					LED2	=0;     
					LED3	=1; 
					
					DELAY_ms(1);
					LED0	=1;      	
					LED1	=1; 
					LED2	=1;     
					LED3	=0; 
					DELAY_ms(1);
					LED0	=0;      	
					LED1	=1; 
					LED2	=1;     
					LED3	=1; 
					RFRXModel();
				}


		  }


}
	 //	 RFRXModel();

	

	

////////////////////CONFIG nRF905

void RF905_Config(void)
{
		SPI_CS_ON();
	    SpiReadWrite(WC);                // Write config command
		SpiReadWrite(CH_NO_BYTE);                      //中心频率低8位                               //0x4c
		SpiReadWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0   //0x0c
		SpiReadWrite(TX_AFW_4BYTE | RX_AFW_4BYTE);     //接收地址宽度4字节,发送地址宽度4字节         //0x44      
		SpiReadWrite(RX_PW_32BYTE);                    //接收数据宽度32字节							//0x20
		SpiReadWrite(TX_PW_32BYTE);                    //发送数据宽度32字节                          //0x20        
		SpiReadWrite(RX_ADDRESS_0);                    //接收有效地址第1字节                         //0x12    
		SpiReadWrite(RX_ADDRESS_1);                    //接收有效地址第2字节						//0x34
		SpiReadWrite(RX_ADDRESS_2);                    //接收有效地址第3字节						//0x56
		SpiReadWrite(RX_ADDRESS_3);                    //接收有效地址第4字节						//0x78	
		SpiReadWrite(CRC16_EN | XOF_16MHz);            //CRC16模式使能,晶体振荡器频率16MHz			//0xD8
		SPI_CS_OFF();
}

void nrf905_SetTxAddr(void)
{
 	    SPI_CS_ON();              
 	    SpiReadWrite(WTA);  //写Tx地址  
	    SpiReadWrite(TX_ADDRESS_0);
	    SpiReadWrite(TX_ADDRESS_1);
	    SpiReadWrite(TX_ADDRESS_2);
	    SpiReadWrite(TX_ADDRESS_3);
   	    SPI_CS_OFF(); 
}

void nrf905_Init(void)
{
	    RFStandBy();
	    DELAY_ms(3);//!!!must >3ms
	    RF905_Config();
	    RFRXModel();
}

void RFStandBy(void)//待机
{
		PWR=1;
		CE=0;
		EN=0;
}
 
void RFRXModel(void)//   rx
{
		PWR=1;
		CE=1;
		EN=0;
}
 
void RFTXModel(void)//   tx
{
		PWR=1;
		CE=1;
		EN=1;

}

/*void DelayMs(unsigned char ms)
{
    int j=0;
	char i=0;
    for(i=0;i<ms;i++)
	{
 		for(j=0;j<12000;j++)		//指令周期=时钟周期时 12000     指令周期=时钟周期*12时 1000    
		{
		}
	}
}
*/

void nrf905_SetData()
{unsigned char i;

		SPI_CS_ON();
	
		SpiReadWrite(WTP);  //写TxPayload 
		  for (i=0;i<SIZE;i++)
		  { 
		    SpiReadWrite(TxBuf[i]);
		  }
		SPI_CS_OFF();  
}

//等待发送结束
void nrf905_WaitSended()
{
	   while (DR==0);//;//在发送结束时 DR=1;
}



//发送TxBuf中的数据
void nrf905_SendData()
{
	   //切换到发送模式
	   RFStandBy();
	   nrf905_SetTxAddr();//写发送地址
	   nrf905_SetData();//写数据
	   RFTXModel();
	   nrf905_WaitSended();//等待发送结束
   
}

//测试直接重新发送上次写入的数据
void nrf905_SendAgain()
{
	   nrf905_SendData();
}

//读出接收到的数据
void nrf905_ReadData()
{
	  unsigned char i;
	  
	  SPI_CS_ON();
	
	  SpiReadWrite(RRP);  //读RxPayload
 
	  for (i=0;i<SIZE;i++)
	  { 
    	    RxBuf[i]=SpiReadWrite(0xff);//read...
	  }

  	  SPI_CS_OFF();
}


//测试:通过读配置,判断SPI操作是否正确
void nrf905_SpiTest()
{
	  unsigned char i;

	  SPI_CS_ON();
	
	  SpiReadWrite(RC);  //读配置

	  for (i=0;i<10;i++)
	  { 
	    RxBuf[i]= SpiReadWrite(0xff);//read from nrf905
	  }

	  SPI_CS_OFF();

	}
	


void RfRecvProc()
{

 		unsigned char i;

	   //if ((PIND&(1<<AM))==0) return;//一般先AM=1指示地址匹配对
	   
	   if (DR==1) //DR=1时表示数据接收对而且Crc正确
	   {
		   //已经接收到数据
		   RFStandBy();
		
		    nrf905_ReadData();//读出...
		   for (i=0;i<32;i++)
		   { if (RxBuf[i]!=(i+i)) 
		        return;
		   }
	   }  
	   //从机回送数据包,这样双方都能指示是否收到有效数据包
}

unsigned char SpiReadWrite(unsigned char val)
{
		unsigned char i;

		  ACC = val;

		  for (i = 8; i > 0; i --)
		  {
			 CY = MISO;//取数据SO

			 _rlca_();
			//存数据ACC.0读数据ACC.7同时进行,acc循环左移,acc.7移入cy(出),cy(入)移到acc.0

			 MOSI = CY;//送数据SI

			 SCK = 1;//上升沿打入数据

    		 _nop_();

			 SCK  = 0;//下降沿读入数据(首次为假动作)
		  }

		  return ACC;
}

void SPI_CS_ON(void)
{
	CSN	= 0;

}

void SPI_CS_OFF(void)
{
	CSN = 1;

}


void DELAY_us(int us)
{
	unsigned int i,j;
	for(j=0;j<us;j++)
	{
		for(i=0;i<6;i++)
		{
		}
	}
}

void DELAY_ms(int ms)
{
	unsigned int j;
	for(j=0;j<ms;j++)
	{
       DELAY_us(1000);
	}
}

void DELAY_s(int s)
{
	unsigned int j;
	for(j=0;j<s;j++)
	{
       DELAY_ms(1000);
	}
}



void X25045_Reset_Watchdog(void)
{ X25045_CS=1; 
  X25045_CS=0;
  X25045_CS=1; 
}










































/*
				if(RxBuf[counter]!=0xff)
				{
					
					LED0	=1;      	
					LED1	=1; 
					LED2	=0;     
					LED3	=1; 
					
					DELAY_ms(3);
					LED0	=1;      	
					LED1	=0; 
					LED2	=1;     
					LED3	=1; 
					DELAY_ms(3);
				}
				else if(RxBuf[counter]==0)
				{
					
					LED0	=0;      	
					LED1	=0; 
					LED2	=0;     
					LED3	=0; 
					
					DELAY_ms(10);
				}
				else
				{

					LED0	=0;      	
					LED1	=0; 
					LED2	=0;     
					LED3	=0; 

					DELAY_ms(3);

				}
				
					LED0	=1;      	
					LED1	=1; 
					LED2	=1;     
					LED3	=1; 

					
					DELAY_ms(3);
					LED0	=1;      	
					LED1	=0; 
					LED2	=1;     
					LED3	=0; 
					DELAY_ms(3);


		  }
*/

⌨️ 快捷键说明

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