/*
 * 函数名:NRF_Rx_Dat
 * 描述  :用于从NRF的接收缓冲区中读出数据
 * 输入  :rxBuf:用于接收该数据的数组,外部定义	
 * 输出  :接收结果,
 * 调用  :外部调用
 */ 
u8 NRF_Rx_Dat(u8 *rxbuf)
{
	u8 state; 
    
    if( nrf_mode != RX_MODE)
    {
        NRF_RX_Mode();
    }
    
	NRF_CE_HIGH();	 //进入接收状态
	 /*等待接收中断*/
	while(NRF_Read_IRQ()!=0); 
	
	NRF_CE_LOW();  	 //进入待机状态
	/*读取status寄存器的值  */               
	state=NRF_ReadReg(STATUS);
	 
	/* 清除中断标志*/      
	NRF_WriteReg(NRF_WRITE_REG+STATUS,state);

	/*判断是否接收到数据*/
	if(state & RX_DR)                                 //接收到数据
	{
	    NRF_ReadBuf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
	    NRF_WriteReg(FLUSH_RX,NOP);                     //清除RX FIFO寄存器
	    return RX_DR; 
	}
	else
    {
		return ERROR;                    //没收到任何数据
    }
}
//传输一次,数据最长为 32字节
static u8 NRF_TX_Dat_Once(u8 *txbuf)
{
	u8 state;

    /*ce为低,进入待机模式1*/
	NRF_CE_LOW();
    
	/*写数据到TX BUF 最大 32个字节*/						
    NRF_WriteBuf(WR_TX_PLOAD,txbuf,MAX_ONCE_TX_NUM);

    /*CE为高,txbuf非空,发送数据包 */   
    NRF_CE_HIGH();
	
	/*等待发送完成中断 */                            
	while(NRF_Read_IRQ()!=0);
	
	/*读取状态寄存器的值 */                              
	state = NRF_ReadReg(STATUS);

	 /*清除TX_DS或MAX_RT中断标志*/                  
	NRF_WriteReg(NRF_WRITE_REG+STATUS,state); 	

	NRF_WriteReg(FLUSH_TX,NOP);    //清除TX FIFO寄存器 

	 /*判断中断类型*/   
    return state;
}
//由中断服务函数调用
void NRF_ISR_Tx_Handler(void)
{
    if(isr_addr == NULL)
    {
        return;         //无效
    }
    
    //检测发送结果                
	isr_state = NRF_ReadReg(STATUS);                    /*读取状态寄存器的值 */  

	NRF_WriteReg(NRF_WRITE_REG+STATUS,isr_state); 	    /*清除TX_DS或MAX_RT中断标志*/    

	NRF_WriteReg(FLUSH_TX,NOP);                         //清除TX FIFO寄存器 
    
    if( (!(isr_state & TX_DS) ) || (isr_L==0) )         //如果发送不成功,或者已经发送完成,则结束
    {
        isr_addr = NULL;                                //通过判断 isr_addr 就知道是否发送完毕。
        isr_L    = 0;                                   //isr_L就不一定了
        return;                                         //通过 isr_state 判断状态
    }
    
    //还没发送完成,就继续发送
    isr_addr += MAX_ONCE_TX_NUM;       //指向下一个地址
    
    NRF_ISR_Tx_Dat_Once();
}
Beispiel #4
0
uint8_t NRF24L01_RxPacket(uint8_t *rxbuf)
{
	uint8_t sta;//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz) 
	sta= NRF_ReadReg(NRFRegSTATUS);//读取状态寄存器的值 
	NRF_WriteReg(NRF_WRITE_REG+NRFRegSTATUS, sta);//清除TX_DS或MAX_RT中断标志
	if (sta & RX_OK)
	{
		NRF_ReadBuf(RD_RX_PLOAD, rxbuf, RX_PLOAD_WIDTH);//读取数据
		NRF_WriteReg(FLUSH_RX, 0xff);//清除RX FIFO寄存器 
		return 1;
	}
	return 0;//没收到任何数据
}
//由中断服务函数调用
void NRF_ISR_Rx_Handler(void)
{
    u8 state;
    
	NRF_CE_LOW();  	 //进入待机状态
    
	/*读取status寄存器的值  */               
	state=NRF_ReadReg(STATUS);
	 
	/* 清除中断标志*/      
	NRF_WriteReg(NRF_WRITE_REG+STATUS,state);
    
    if(re_flag == QUEUE_FULL)       //满了就直接清FIFO,退出
    {
        NRF_WriteReg(FLUSH_RX,NOP);                     //清除RX FIFO寄存器
        NRF_CE_HIGH();  	 //进入接收模式
        return;       //接收队列满了,不进行处理
    }
    
    //还没满,则继续接收

	/*判断是否接收到数据*/
	if(state & RX_DR)                                 //接收到数据
	{
	    NRF_ReadBuf(RD_RX_PLOAD,(u8 *)&(RX_ISR_FIFO[rear]),RX_PLOAD_WIDTH);  //读取数据
	    NRF_WriteReg(FLUSH_RX,NOP);                     //清除RX FIFO寄存器

        rear++;
        
        if(rear >= RX_ISR_FIFO_PACKET)
        {
            rear=0;                         //重头开始
        }
        
        if(rear == front)                   //追到屁股了,满了
        {
            re_flag = QUEUE_FULL;   
        }
        else
        {
            re_flag = QUEUE_NORMAL;
        } 
	}
	else    
    {
		                  //没收到任何数据
    }
    
    NRF_CE_HIGH();  	 //进入接收模式

}
/*=====================================================================================================*/
u8 NRF_RxPacket( u8 *RxBuf )
{
  u8 Status;

  NRF_CE = 1;
  while(NRF_IRQ!=0);
  NRF_CE = 0;

  Status = NRF_ReadReg(CMD_R_REG | NRF_STATUS);
  NRF_WriteReg(CMD_W_REG | NRF_STATUS, Status);

  if(Status&NRF_STA_RX_DR) {
    NRF_RxData(RxBuf);
    return NRF_STA_RX_DR;
  }
  else
    return ERROR;
}
/*=====================================================================================================*/
u8 NRF_TxPacket( u8 *TxBuf )
{
  u8 Status;

  NRF_TxData(TxBuf);

  while(NRF_IRQ!=0);
  Status = NRF_ReadReg(CMD_R_REG | NRF_STATUS);
  NRF_WriteReg(CMD_W_REG | NRF_STATUS, Status);
  NRF_FlushTxFIFO();

  if(Status&NRF_STA_MAX_RT)
    return NRF_STA_MAX_RT;
  else if(Status&NRF_STA_TX_DS)
    return NRF_STA_TX_DS;
  else
    return ERROR;
}
Beispiel #8
0
/**
  * @brief  Enable of disable interrupt masks.
  * @note   
	* @param  Pointer to nRF24L01P_Object
  * @param  Interrupt mask, can be combination of @ref NRF_InterruptMask.
	* @param	NewState. ENABLE of DISABLE 
  * @retval STATUS register in nRF24L01P.
  */
uint8_t NRF_INT_MASK_Cmd(nRF24L01P_Object* nrf, uint8_t NRF_InterruptMask,	FunctionalState NewState)
{
	uint8_t config; //Content of NRF_CONFIG register
	
	/* Parameter check */
	assert_param(IS_NRF_INT_MASK(NRF_InterruptMask));
	
	/* Read original NRF_CONFIG register */
	config = NRF_ReadReg(nrf, NRF_CONFIG);
	
	/* Compute the new value */
	if(NewState == ENABLE)
		config = config | NRF_InterruptMask;
	else
		config = config & ~NRF_InterruptMask;
	
	/* Write new value into NRF_CONFIG register */
	return NRF_WriteReg(nrf, NRF_CONFIG, config);	 
}
Beispiel #9
0
uint8_t NRF_PowerDown(nRF24L01P_Object* nrf)
{
	uint8_t config;
	config = NRF_ReadReg(nrf, NRF_CONFIG) & (~NRF_PWR_UP);
	return NRF_WriteReg(nrf, NRF_CONFIG, config);
}