예제 #1
0
u8 xNRF_TxPacket(void *txbuf,u8 len,void *rxbuf,u8* rxlen)		//
{
	u8 sta;
	NRF_Write_Buf(WR_TX_PLOAD,txbuf,len);//写数据到TX FIFO
	NRF_CE=1; //启动发送
	while(NRF_IRQ == 1); //等待发送完成
	sta=NRF_Read_Reg(STATUS); //读取状态寄存器的值 
	NRF_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除 TX_DS或MAX_RT 中断标志
	
	if(sta&MAX_TX) //达到最大重发次数
	{
		NRF_Write_Reg(FLUSH_TX,0xff);//清除 TX FIFO 寄存器
		return MAX_TX;
	}
	if(sta&RX_OK)		//收到应答数据包
	{
		*rxlen = NRF_Read_Reg(R_RX_PL_WID);
		NRF_Read_Buf(RD_RX_PLOAD,rxbuf,*rxlen);//读取数据
		NRF_Write_Reg(FLUSH_RX,0xff);//清除 RX FIFO 寄存器 ???
		
		return RX_OK;
	}
	if(sta&TX_OK)//发送完成
	{
		return TX_OK;
	}
	return 0;//其他原因发送失败
}
예제 #2
0
void Nrf_Check_Event(void)
{
	u8 sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	if(sta & (1<<RX_DR))
	{	
		u8 rx_len = NRF_Read_Reg(R_RX_PL_WID);
		if(rx_len<33)
		{
			NRF_Read_Buf(RD_RX_PLOAD,NRF24L01_RXDATA,rx_len);// read receive payload from RX_FIFO buffer
			LED2_ON
			Data_Receive_Anl(NRF24L01_RXDATA,rx_len);
			
			Nrf_Erro = 0;
		}
		else
		{
			NRF_Write_Reg(FLUSH_RX,0xff);//Çå¿Õ»º³åÇø
		}
	}
	else
	{
		Nrf_Erro ++;
		if(Nrf_Erro>2000)	//³¬¹ý1sδ½ÓÊÕnrfÊý¾Ý £¬ÉÏËø
		{
			Nrf_Erro = 0;
			Rc_C.ARMED = 0;
		}
	}
	
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	if(sta & (1<<TX_DS))
	{
		//LED1_ONOFF();
	}
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	if(sta & (1<<MAX_RT))
	{
		if(sta & 0x01)	//TX FIFO FULL
		{
			NRF_Write_Reg(FLUSH_TX,0xff);
		}
	}
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	NRF_Write_Reg(NRF_WRITE_REG + NRFRegSTATUS, sta);
}
예제 #3
0
//接受数据时放入新数据包
u8 xNRF_RxPacket(void *rxbuf,u8* rxlen,void *txbuf,u8 txlen)
{
	u8 sta;
	
	sta=NRF_Read_Reg(STATUS); 						//读取状态寄存器的值
	NRF_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除 TX_DS 或MAX_RT 中断标志
	
	if(sta&RX_OK)//接收到数据
	{
		*rxlen = NRF_Read_Reg(R_RX_PL_WID);
		NRF_Read_Buf(RD_RX_PLOAD,rxbuf,*rxlen);//读取数据
		NRF_Write_Reg(FLUSH_RX,0xff);//清除 RX FIFO 寄存器
		NRF_Write_Buf(W_ACK_PAYLOAD,txbuf,txlen);	//写入应答时携带的数据包
		return 0;
	} 
	return 1;//没收到任何数据
}
//查询中断
void Nrf_Irq(void)
{
    uint8_t sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
    if(sta & (1<<RX_DR))//接收轮训标志位
    {
        NRF_Read_Buf(RD_RX_PLOAD,NRF24L01_RXDATA,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
        ReceiveDataFormNRF();      //自己做修改
    }
    NRF_Write_Reg(0x27, sta);//清除nrf的中断标志位
}
예제 #5
0
void Nrf_Check_Event(void)	//将2401接收到的数据返回串口
{
	u8 sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	if(sta & (1<<RX_DR))//接收中断
	{
		u8 rx_len = NRF_Read_Reg(R_RX_PL_WID);	//2401寄存器,值为0x60
		if(rx_len<33)
		{
			NRF_Read_Buf(RD_RX_PLOAD,NRF24L01_RXDATA,rx_len);// read receive payload from RX_FIFO buffer
			Uart1_Send_Buf(NRF24L01_RXDATA,rx_len);
		}
		else 
		{
			NRF_Write_Reg(FLUSH_RX,0xff);//清空缓冲区
		}
	}
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	if(sta & (1<<TX_DS))//发送中断
	{
		//PC_Debug_Show(1,2);
	}
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	if(sta & (1<<MAX_RT))//应该是缓存溢出中断
	{
		static u16 max_cnt = 0;
		max_cnt++;
		PC_Debug_Show(7,max_cnt);
		
		if(sta & 0x01)	//TX FIFO FULL
		{
			NRF_Write_Reg(FLUSH_TX,0xff);
		}
	}
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	NRF_Write_Reg(NRF_WRITE_REG + NRFRegSTATUS, sta);//??nrf??????
}
예제 #6
0
void Nrf_Check_Event(void)
{
	u8 sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	if(sta & (1<<RX_DR))
	{
		u8 rx_len = NRF_Read_Reg(R_RX_PL_WID);
		if(rx_len<33)
		{
			NRF_Read_Buf(RD_RX_PLOAD,NRF24L01_RXDATA,rx_len);// read receive payload from RX_FIFO buffer
			//LED1_ONOFF();
			Data_Receive_Anl(NRF24L01_RXDATA,rx_len);
		}
		else 
		{
			NRF_Write_Reg(FLUSH_RX,0xff);//Çå¿Õ»º³åÇø
		}
	}
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	if(sta & (1<<TX_DS))
	{
		Ledx_ONOFF(1);
	}
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	if(sta & (1<<MAX_RT))
	{
		if(1)//sta & 0x01)	//TX FIFO FULL
		{
			NRF_Write_Reg(FLUSH_TX,0);
		}
	}
	////////////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////////////
	NRF_Write_Reg(NRF_WRITE_REG + NRFRegSTATUS, sta);
}
예제 #7
0
u8 NRF_RxPacket(void *rxbuf)		//成功接收数据返回0
{
	u8 sta; 
	sta=NRF_Read_Reg(STATUS); //读取状态寄存器的值
	NRF_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除 TX_DS 或MAX_RT 中断标志
	
	if(sta&RX_OK)//接收到数据
	{
		NRF_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
		NRF_Write_Reg(FLUSH_RX,0xff);//清除 RX FIFO 寄存器
		return 0;
	} 
	return 1;//没收到任何数据
} 
//接收函数
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
	u8 sta;		    							   
        //SPI2_SetSpeed(SPI_SPEED_4); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   
	sta=NRF_Read_Reg(NRFRegSTATUS);  //读取状态寄存器的值    	 
	NRF_Write_Reg(NRF_WRITE_REG+NRFRegSTATUS,sta); //清除TX_DS或MAX_RT中断标志
	if(sta&RX_OK)//接收到数据
	{
		NRF_Write_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
		NRF_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 
		return 0; 
	}	   
	return 1;//没收到任何数据
}		
예제 #9
0
/*======================================================================*/
void NRF_IRQ(void)
{
	uint8_t sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
	if(sta & (1<<RX_DR))//接收中断
	{
	}
	if(sta & (1<<TX_DS))//发送完成并接收到应答信号中断
	{
		NRF_Write_Reg(0x27, 0xff);//清除nrf的中断标志位
	}
	if(sta & (1<<MAX_RT))//达到最大重发次数中断
	{
		NRF_Write_Reg(0x27, 0xff);//清除nrf的中断标志位
	}
}
예제 #10
0
u8 NRF_TxPacket(void *txbuf)
{
	u8 sta;
	NRF_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32 个字节
	
	while(NRF_IRQ == 1); //等待发送完成
	sta=NRF_Read_Reg(STATUS); //读取状态寄存器的值 
	NRF_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除 TX_DS 或MAX_RT 中断标志
	if(sta&TX_OK)//发送完成
	{
		return TX_OK;
	}
	
	if(sta&MAX_TX) //达到最大重发次数
	{
		NRF_Write_Reg(FLUSH_TX,0xff);//清除 TX FIFO 寄存器
		return MAX_TX;
	}
	return 0xff;//其他原因发送失败
}
void NRFmatching(void)
{
	static uint32_t nTs,nT;
	static uint32_t writeOvertime = 2 * 1000000;// unit :us
	
	LedC_on;   //led3 always on when 2.4G matching
	nTs = micros();
	
  do  
	{   
		  NRFMatched = 0;
		  nT = micros() - nTs;
		  
		  if(nT >= writeOvertime){
				RX_ADDRESS[4] = table.NRFaddr[4];
				break;	//exit when time out,and do not change original address
			}

			SetRX_Mode();                 // reset RX mode write RX panel address
			delay_ms(4);									// delay is needed after reset NRF
		  sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
      
		  if((sta & 0x0E )== 0x00){
				NRFMatched = 1;
			}else{
				RX_ADDRESS[4] ++;		//search the next RX_ADDRESS
				if(RX_ADDRESS[4] == 0xff ){
					RX_ADDRESS[4] = 0x00;
				}
			}

  }while((sta & 0x0E )== 0x0E); 
	
	SetRX_Mode();                 // reset RX mode
	
	if((NRFMatched == 1)&&(RX_ADDRESS[4]!= table.NRFaddr[4])){
		SaveParamsToEEPROM();			//write eeprom when current addr != original addr
	}
	
	LedC_off;		// matching end 
}
예제 #12
0
u8 Nrf_Get_FIFOSta(void)
{
	return NRF_Read_Reg(NRF_READ_REG + FIFO_STATUS);
}
예제 #13
0
u8 Nrf_Get_Sta(void)
{
    return NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
}