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

📄 main.c

📁 基于 arm philiplpc2210 nrf905 c 程序
💻 C
字号:
#include "config.h"
#include "wireless.h"
#define SIZE 32

#define 	CSN  	(1<<29)//P0.29	
#define		DR		(1<<25)		//inputP0.25
#define		CE		(1<<24)// P0.24	
#define		PWR		(1<<23)	// P0.23
#define		EN		(1<<7)	//P0.7

#define		MSTR	(1<<5)
#define		CPOL	(1<<4)
#define		CPHA	(1<<3)
#define		LSBF	(1<<6)

	uint8 TxBuf[SIZE],RxBuf[SIZE];
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 MspiInit()
{
	S1PCCR=0x52;//256;
	S1PCR = 0x20;//MSTR|CPHA ;//|CPHA;//MASTER  CPHA=1;CPOL=0


}
uint8	MSendData(uint8 data)
{

	S0PSR&=~0x80;
	S1PDR = data;
	while(0==(S1PSR&0x80));	
	return (S1PDR);


}
////////////////////////////////////////////////////////////////////////////////END SPI  BY GRISHWORLD
void SetGpio0(uint32 GpioP0)
{
	IO0SET=IO0SET|GpioP0;
}

void ClrGpio0(uint32 GpioP0)
{
	IO0CLR=IO0CLR|GpioP0;
}

uint8 ReadGpio0(uint32 GpioP0)
{
	uint32 TempGpio0;
	TempGpio0=IO1PIN&GpioP0;
	if(TempGpio0==0)
		{
			return 0;
		}
	else
			return 1;
}

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

void SPI_CS_ON(void)
{
	IO0CLR=IO0CLR|CSN;//CSN	= 0;
}
void SPI_CS_OFF(void)
{
	IO0SET=IO0SET|CSN;	//CSN = 1;
}
void nrf905_ioinit(void)
{
	PINSEL1=0x000002A8;	//set GPIO&MSPI1
	IO0DIR=IO0DIR|CSN|CE|PWR|EN;
	IO0DIR=IO0DIR&(~DR);
}

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


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

void nrf905_SetData()
{unsigned char i;

		SPI_CS_ON();
	
		MSendData(WTP);  //写TxPayload 
		  for (i=0;i<SIZE;i++)
		  { 
		    MSendData(TxBuf[i]);
		  }
		SPI_CS_OFF();  
}
//发送TxBuf中的数据
void nrf905_SendData()
{
	   //切换到发送模式
	   RFStandBy();
	   nrf905_SetTxAddr();//写发送地址
	   nrf905_SetData();//写数据
	   RFTXModel();
	   nrf905_WaitSended();//等待发送结束
   
}
void nrf905_ReadData()
{
	  unsigned char i;
	  
	  SPI_CS_ON();
	
	  MSendData(RRP);  //读RxPayload
 
	  for (i=0;i<SIZE;i++)
	  { 
    	    RxBuf[i]=MSendData(0XFF);//read...
	  }

  	  SPI_CS_OFF();
}
void RfRecvProc()
{

 		unsigned char i;
	   if (ReadGpio0(DR)==1) //DR=1时表示数据接收对而且Crc正确
	   {
		   //已经接收到数据
		   RFStandBy();
		
		    nrf905_ReadData();//读出...
		   for (i=0;i<32;i++)
		   { if (RxBuf[i]!=(i+i)) 
		        return;
		   }
	   }  
	   //从机回送数据包,这样双方都能指示是否收到有效数据包
}
void nrf905_SpiTest()
{
	  unsigned char i;

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

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

	  SPI_CS_OFF();

	}
int main()
{
	nrf905_ioinit();
	MspiInit();
	DELAY_ms(1);
 	nrf905_Init();
	RFRXModel();
	for(;;)
{
		DELAY_ms(10);

//nrf905_SpiTest();
		RfRecvProc();
	     	
		DELAY_ms(1);
			//LED();
		if(RxBuf[0]!=0)
		{
			RFRXModel();
			DELAY_ms(1);
		  }
}
return 0;
}
//测试直接重新发送上次写入的数据
void nrf905_SendAgain()
{
	   nrf905_SendData();
}

⌨️ 快捷键说明

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