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

📄 wireless_api.c

📁 菜鸟,详细NRF24E1运用,程序,电路
💻 C
字号:

#include "reg24le1.h"
#include "wireless_api.h"
#include "rf24le1.h"

#define CSN_LOW()  	RFCSN = 0; 	
#define CSN_HIGH()  RFCSN = 1; 
#define CE_LOW()  	RFCE = 0;Timer_10Us(1); 
#define CE_HIGH()  	RFCE = 1; 
#define CE_PULSE() 	CE_HIGH();Timer_10Us(2);CE_LOW();

idata unsigned char radio_status;  
static unsigned char gnDataPipeNumber;
code const address[]={0x12,37,0x55,0x79,0x97};


static unsigned char Rf24L01_Reg_RW(unsigned char byte)
{
  	SPIRDAT = byte;	//write spi 
  	RFSPIF = 0;                   		
  	while(!RFSPIF);  //wait untill the spi ready again   
  	return SPIRDAT;   //return the state
	return 0;
}

unsigned char Rf24L01_WriteByte(unsigned char reg, unsigned char value)
{
	unsigned char status;

	CSN_LOW();

	status = Rf24L01_Reg_RW(reg);          // select register

	Rf24L01_Reg_RW(value);                 // ..and write value to it..

	CSN_HIGH();

	return(status);                        // return nRF24L01 status byte
}


unsigned char Rf24L01_WriteMultiByte(unsigned char reg, unsigned char *pBuf, unsigned char len)
{
	unsigned char status,i;

	CSN_LOW();

	status = Rf24L01_Reg_RW(reg);               // Select register to write to and read status byte

	for(i=0; i<len; i++)                        // then write all byte in buffer(*pBuf)
	{
		Rf24L01_Reg_RW(*pBuf++);
	}

	CSN_HIGH();

	return(status);                             // return nRF24L01 status byte
}


unsigned char Rf24L01_Clear_IRQ(unsigned char irq_flag)
{
	return Rf24L01_WriteByte(WRITE_REG + STATUS, irq_flag);
}

void Rf24L01_Flush_TX(void)
{
	Rf24L01_WriteByte(FLUSH_TX,0);
}


void Rf24L01_Flush_RX(void)
{
	Rf24L01_WriteByte(FLUSH_RX,0);
}


unsigned char Rf24L01_ReadByte(unsigned char reg)
{
	unsigned char reg_val;

	CSN_LOW();

	Rf24L01_Reg_RW(reg);                    // Select register to read from..

	reg_val = Rf24L01_Reg_RW(0);            // ..then read registervalue

	CSN_HIGH();

	return(reg_val);                        // return register value
}

void Rf24L01_RxTx_Switch(unsigned char bMode)
{
	unsigned char bConfig;

	CE_LOW();

	Rf24L01_Flush_RX();                //set TX/RX FIFO to be empty
	Rf24L01_Flush_TX();                //
	Rf24L01_Clear_IRQ(MASK_IRQ_FLAGS); //clear IRQ STATUS register

	bConfig = Rf24L01_ReadByte(CONFIG);

	if(bMode == PRX)
	{
		if((bConfig&0x01))
		{
			CE_HIGH();
			return;
		}

		bConfig &= 0xfe;
		bConfig |= 0x01;

		Rf24L01_WriteByte(WRITE_REG + CONFIG, bConfig);

		CE_HIGH();
	}
	else if(bMode == PTX)
	{
		if(!(bConfig&0x01))
		{
			return;
		}

		bConfig &= 0xfe;

		Rf24L01_WriteByte(WRITE_REG + CONFIG, bConfig);
	}
}


static unsigned char Rf24L01_ReadMultiByte(unsigned char reg, unsigned char *pBuf, unsigned char len)
{
	unsigned char status,i;

	CSN_LOW();

	status = Rf24L01_Reg_RW(reg);           // Select register to write to and read status byte

	for (i=0;i<len;i++)
	{
		pBuf[i] = Rf24L01_Reg_RW(0);        // Perform Rf24L01_Reg_RW to read byte from nRF24L01
	}
	pBuf[i]='\0';

	CSN_HIGH();

	return(status);                         // return nRF24L01 status byte
}

//-----------------------------------------------------------------------------
//
// Used in RX mode.
//
//-----------------------------------------------------------------------------

static void Rf24L01_RX(unsigned char *prx_buf)
{ 
	unsigned char gnRF_RecvLen;
	gnRF_RecvLen=Rf24L01_ReadByte(READ_PAYLAODLEN);	// READ_PAYLAODLEN	is a cmd to get the rx payload length
		
	if (prx_buf != NULL) Rf24L01_ReadMultiByte(RD_RX_PLOAD, prx_buf, gnRF_RecvLen); //read data from rd_rx_plo
}

//-----------------------------------------------------------------------------



//-----------------------------------------------------------------------------

void Rf24L01_TX(unsigned char *ptx_buf,unsigned char nLen)
{

//	Rf24L01_RxTx_Switch(PTX);  //转换到发送模式

	Rf24L01_Flush_TX();		//clear 24L01 tx buffer

	//Rf24L01_WriteMultiByte(WR_TX_PLOAD, ptx_buf, nLen);	 //连续写入要发送的数据
    Rf24L01_WriteByte(WR_TX_PLOAD,*ptx_buf);
	CE_PULSE();		 //20us的高脉冲
} 


void Rf24L01_TXABYTE(unsigned char x)
{

	Rf24L01_RxTx_Switch(PTX);  //转换到发送模式

	Rf24L01_Flush_TX();		//clear 24L01 tx buffer

	Rf24L01_WriteByte(WR_TX_PLOAD, x);	 //写入要发送的数据
//	Rf24L01_WriteByte(unsigned char reg, unsigned char value)

	CE_PULSE();		 //20us的高脉冲
} 



//-----------------------------------------------------------------------------
//
//  Function: Rf24L01_Polling_IRQ
//
//  Description:
//  Deal with IQR event with polling mode
//
//-----------------------------------------------------------------------------	 

static void rf_rdy_ov_interrupt(void) interrupt INTERRUPT_RFRDY {}	//SPI ready

//---------------------------------------------------------------------------
static void rfirq_ov_interrupt(void) interrupt INTERRUPT_RFIRQ
{
	radio_status =0xFF;
}
//---------------------------------------------------------------------------

unsigned char Rf24L01_Polling_IRQ(unsigned char * rev_buf)
{
    unsigned char irq_status;

	if(radio_status == 0x00) 
	{
		if(Rf24L01_ReadByte(FIFO_STATUS) & MASK_RX_EMPTY) return IDLE;	  //当前FIFO为空

        Rf24L01_RX(rev_buf); //将收到的有效数据存到revbuf指针当中
        
        irq_status=Rf24L01_ReadByte(STATUS);  //读取SPI状态寄存器

        gnDataPipeNumber=(irq_status>>1)&0x7;	 //取当前收到数据的通道号

        return (unsigned char)RX_DR;  //成功的接收到数据
	}

	radio_status = 0x00;

    irq_status=Rf24L01_ReadByte(STATUS);//read state word

    switch(irq_status&MASK_IRQ_FLAGS)	//取4 5 6 bit
    {
        case MASK_RX_DR_FLAG:			//rf receive data
        {
            if(Rf24L01_ReadByte(FIFO_STATUS) & MASK_RX_EMPTY)//empty fifo
            {
                irq_status =IDLE;
            }
            else
            { 				
                Rf24L01_RX(rev_buf);
                gnDataPipeNumber=(irq_status>>1)&0x7;
                irq_status = (unsigned char)RX_DR;
            }

            break;
        }



        case MASK_TX_DS_FLAG: 			//send rf data success (with ack response)
        {
            irq_status = (unsigned char)TX_DS;            
            break;
        }

        case MASK_MAX_RT_FLAG:			//Maximum number of TX retries interrupt  If MAX_RT is set it must be cleared to enable further communication.
        {
            irq_status = (unsigned char)MAX_RT;	
            break;
        }

        case IDLE:
        {
            irq_status = (unsigned char)IDLE;
            break;
        }

	}

    if(Rf24L01_ReadByte(FIFO_STATUS) & MASK_RX_EMPTY)	// if empty clear interrupt	 RQ
        Rf24L01_Clear_IRQ(MASK_IRQ_FLAGS);

    return irq_status;

}


//-----------------------------------------------------------------------------

unsigned char Rf24L01_Set_Init(SetupData *drc)
{
    	unsigned char btemp; 	

	RFCKEN = 1;                                     // enable L01 clock
  	RF = 0;										  //rf中断清零
	CE_LOW();										//选中RF芯片

	Rf24L01_Flush_RX();                				//flush TX/RX FIFO to be empty
	Rf24L01_Flush_TX();                				//
	Rf24L01_Clear_IRQ(MASK_IRQ_FLAGS); 				//clear IRQ STATUS register

	//------------------------------------------------------
	//1 set config
	//------------------------------------------------------  
		//'comm config' default value:0000 1000
    	//bit7 must be 0;
   		//bit6,0--enable,RX interrupt enable,IRQ pin active low
    	//bit5,0--enable TX Succeed interrupt enable,IRQ pin active low
      	//bit4,0--eanble TX time over interrupt enable,IRQ pin active low
    	//bit3,CRC enable,if EN_AA be set,this bit will be forced to high
      	//bit2,CRC width,0--one byte,1--two bytes
       	//bit1,RF POWER ON/OFF,1--ON, 0--OFF
      	//bit0,transmmit mode: 1--PTX,0--PRX
	btemp =0x0e;	
	if (drc->nOn == Dev_Normal) btemp +=0x01; 		
	Rf24L01_WriteByte(WRITE_REG + CONFIG, btemp);

	//------------------------------------------------------
	//2 set ee_aa
	//------------------------------------------------------	
		//'Enable Auto Acknowledgment'
		// bit76 must be 00;
		// bit 5-0 response to Pip5-0; bit: 1-en, 0-disen
		// bit0 = 1;only enble pipe0   	
		// Enable Auto.Ack:Pipe0  

	Rf24L01_WriteByte(WRITE_REG + EN_AA, drc->nAutoAck);            

	//------------------------------------------------------
	//3 set en_rxaddr
	//------------------------------------------------------ 		  
		//'Enabled RX addresses', default 0000 0011
      	//bit76 must be 00;
   		//bit 5-0 response to Pip5-0, bit: 1-en, 0-disen
		//pipe rx enble,bit0 = 1,only enable pipe0 RX
	Rf24L01_WriteByte(WRITE_REG + EN_RXADDR, drc->nRecvAddr);  

	//------------------------------------------------------
	//4 set setup_aw
	//------------------------------------------------------
		//'address width',default 0000 0011
    	//bit765432 must be 000000;
      	//bit10,value must be 1~3, 1--3Bytes width,2--4Bytes,3--5Bytes
		//address width is 5 bytes;bit10: 00--illegal,01--3bytes,10--4bytes,11--5bytes
	Rf24L01_WriteByte(WRITE_REG + SETUP_AW, 0x03);

	//------------------------------------------------------
	//5 set setup_retr
	//------------------------------------------------------  
		//'Auto. Retransmite delay time and count', default 0000 0011
       	//delay time(bit7~3):(bit7~3+1)*250+86us;
     	//retran count(bit2~0):0--disenable retran,otherwise 1~15 times
		//0x10;    
		//retran delay time:250us+86us
		//drc->Retran;
	btemp = (drc->nART_Factor&0x0f)<<4;	 		
	btemp += (drc->nRetran > 15 ? 15 : drc->nRetran);
	btemp=0x17;//self 			
	Rf24L01_WriteByte(WRITE_REG + SETUP_RETR, btemp);

	//------------------------------------------------------
	//6 set rf_ch
	//------------------------------------------------------  
		//'rf frequency channel' 2400+rf_ch,default:0000 0010
		// bit7 must be 0
     	// bit6~0 rf frequency channel,one step deputy 1MHZ
    	// we use frequency at less than 2.49GHZ,beause WLAN use frequency band 2.4G~2.4835Ghz
      	// we choice rf_ch = 100; thats 2.5GHZ
		// default we choice frequency range 2.495GHz~2.513GHZ  channel
	if (drc->nChannel>122)
	{
		drc->nChannel = 0;
	} 	
		
 	Rf24L01_WriteByte(WRITE_REG + RF_CH, drc->nChannel);

	//------------------------------------------------------
	//7 set rf_setup
	//------------------------------------------------------ 
		//'RF setup' default 0000 1111
    	// bit7~4 must be 00000
      	// bit 3 data rate :0--1Mbps,1--2Mbps;
       	// bit 2~1 rf power:00,-18dbm,,01,-12dbm,,10,-6dbm,,11,0dbm
      	// bit 0 must be 1
	btemp =((drc->nPower&0x0f)>3 ? 3:(drc->nPower&0x0f))<<1;  
	btemp +=0x01;
	if((drc->nPower&0xf0)>0) btemp += 0x08;
	
	//btemp |= 0x20;
	btemp=0x0e;	 //self
	Rf24L01_WriteByte(WRITE_REG + RF_SETUP, btemp);

	//------------------------------------------------------
	//8 set rx_addr_p0
	//------------------------------------------------------ 
		//pipe0 rx address buf 

	Rf24L01_WriteMultiByte(WRITE_REG + RX_ADDR_P0,drc->aAddr1,5);

	//------------------------------------------------------
	//9 set rx_addr_p1
	//------------------------------------------------------ 
		//'pipe1 rx payload width' 		
		//'pipe0 rx payload width' 00000000
     	//bit76 must be 00
      	//bit5~0,at less than must be one byte
     	//the most width is 32 bytes 
	if (drc->nLen>32)
	{
		drc->nLen = 32;
	}
	else if (drc->nLen == 0)
	{
		drc->nLen = 1;
	} 

	Rf24L01_WriteByte(WRITE_REG + RX_PW_P0, drc->nLen);	  

	btemp = drc->nRecvAddr;
	btemp = btemp>>1;
	if (btemp&1)
	{
		//81 get rx_addr_p1
		Rf24L01_WriteMultiByte(WRITE_REG + RX_ADDR_P1,drc->aAddr2,5);

		//91 get rx_pw_p1
		Rf24L01_WriteByte(WRITE_REG + RX_PW_P1, drc->nLen);
	}

	//------------------------------------------------------
	//10 set tx_addr
	//------------------------------------------------------ 
		//tx address buf	
	Rf24L01_WriteMultiByte(WRITE_REG + TX_ADDR,drc->aAddr1,5);

	
	//------------------------------------------------------
	//11 ACTIVATE
	//------------------------------------------------------ 
 //	Rf24L01_WriteByte(ACTIVATE, 0x73); 

	//------------------------------------------------------
	//12 get FEATURE 
	//------------------------------------------------------
	Rf24L01_WriteByte(WRITE_REG + FEATURE, 0x05); 
	
	//------------------------------------------------------
	//13 get DYNPD
	//------------------------------------------------------
	Rf24L01_WriteByte(WRITE_REG + DYNPD, drc->nRecvAddr);


	RF = 1;	
	if(drc->nOn == Dev_Normal) 
	{
		CE_HIGH();
	}	

	return 0;
}

void wireless_init(void)
{
 	SetupData	mSetup;	

	memset(&mSetup,0,sizeof(SetupData));	//chu shi hua wei 0
	mSetup.nChannel=20;
	mSetup.nPower=3;	   //0dbm
	mSetup.nRecvAddr=0x01;
	mSetup.nAutoAck=0x01;
	mSetup.nLen=32;                                 
	mSetup.nRetran=8;
	mSetup.nOn=1;

	memcpy(mSetup.aAddr1,address,5); 		//copy the address	
	mSetup.nOn=1;
		
	Rf24L01_Set_Init((SetupData *)&mSetup);

}

⌨️ 快捷键说明

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