示例#1
0
 /*
 * 函数名: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;                    //没收到任何数据
    }
}
示例#2
0
 /*
 * 函数名:NRF_Tx_Dat
 * 描述  :用于向NRF的发送缓冲区中写入数据
 * 输入  :txBuf:存储了将要发送的数据的数组,外部定义	
 * 输出  :发送结果,成功返回TXDS,失败返回MAXRT或ERROR
 * 调用  :外部调用
 */ 
u8 NRF_Tx_Dat(u8 *txbuf,u32 len)
{
    u8 state;  
    u32 L;
    
    if( nrf_mode != TX_MODE)
    {
        NRF_TX_Mode();
    }
    
    L = (len+MAX_ONCE_TX_NUM-1) / MAX_ONCE_TX_NUM ; //进位取整
    
    while(L--)
    {
        state = NRF_TX_Dat_Once(txbuf);
        if( !(state & TX_DS))             //如果发送不成功,则结束
        {
            break;          //跳出while循环
        }
        txbuf += MAX_ONCE_TX_NUM;       //修正指向的位置
    }

#if IS_AUTO_RX_MODE     //自动进入接收模式
    NRF_RX_Mode();      
#endif
    
    return state;
} 
void NRF_FTLR( void ) // First Tx Last Rx
{
  u8 i = 0;
  u8 Sta = ERROR;

  static u8 FSM_STA = 0;

  switch(FSM_STA) {

    /************************** FSM Tx **************************************/
    case 0:
      // FSM_Tx
      // 資料寫入 TX BUF
      for(i=0; i<32; i++) {
        TxBuf[i] = RxBuf[i] + i;
        if(TxBuf[i]>220)
          TxBuf[i] = 0;
      }
      do {
        Sta = NRF_TxPacket(TxBuf);
      } while(Sta == NRF_STA_MAX_RT);
      // FSM_Tx End
      FSM_STA = 1;
      break;

    /************************** FSM Rx **************************************/
    case 1:
      // FSM_Rx
      NRF_RX_Mode();
      Sta = NRF_RxPacket(RxBuf);
      if(Sta == NRF_STA_RX_DR) {
        LED_B = !LED_B;
      }
      // FSM_Rx End
      FSM_STA = 2;
      break;

    /************************** FSM USART **************************************/
    case 2:
      // FSM_USART
      Delay_10ms(20);
      RS232_SendStr((u8*)"\f");
      RS232_SendStr((u8*)"***NRF_MODE_FTLR\r\n");
      for(i=0; i<32; i++) {
        RS232_SendStr((u8*)"RxBuf[");
        RS232_SendNum(Type_D, 2, i);
        RS232_SendStr((u8*)"] = ");
        RS232_SendNum(Type_D, 3, TxBuf[i]);
        RS232_SendStr((u8*)"\r\n");
      }
      RS232_SendStr((u8*)"\r\n");
      // FSM_USART End
      FSM_STA = 0;
      break;
  }
}
示例#4
0
int main(void)
{
    /* 串口1初始化 */
    USART1_Config();

    /*SPI接口初始化*/
    SPI_NRF_Init();

    printf("\r\n 这是一个 NRF24L01 无线传输实验 \r\n");
    printf("\r\n 这是无线传输 从机端 的反馈信息\r\n");
    printf("\r\n   正在检测NRF与MCU是否正常连接。。。\r\n");

    /*检测NRF模块与MCU的连接*/
    status = NRF_Check();
    if(status == SUCCESS)
        printf("\r\n      NRF与MCU连接成功\r\n");
    else
        printf("\r\n   正在检测NRF与MCU是否正常连接。。。\r\n");

    while(1)
    {
        printf("\r\n 从机端 进入接收模式\r\n");
        NRF_RX_Mode();

        /*等待接收数据*/
        status = NRF_Rx_Dat(rxbuf);

        /*判断接收状态*/
        if(status == RX_DR)
        {
            for(i=0; i<4; i++)
            {
                printf("\r\n 从机端 接收到 主机端 发送的数据为:%d \r\n",rxbuf[i]);
                /*把接收的数据+1后发送给主机*/
                rxbuf[i]+=1;
                txbuf[i] = rxbuf[i];
            }
        }
        printf("\r\n 从机端 进入自应答发送模式\r\n");
        NRF_TX_Mode();

        /*不断重发,直至发送成功*/
        do
        {
            status = NRF_Tx_Dat(txbuf);
        } while(status == MAX_RT);
    }
}
示例#5
0
/*
 * 函数名:NRF_Init
 * 描述  :SPI的 I/O配置
 * 输入  :无
 * 输出  :无
 * 调用  :外部调用
 */
void NRF_Init(void)
{
    //配置NRF管脚复用
    spi_init(NRF_SPI,MASTER);               //初始化SPI,主机模式
    
    gpio_init(PORTE,28, GPO,LOW);           //初始化CE,默认进入待机模式
    //gpio_init(PORTE,27, GPI,LOW);           //初始化IRQ管脚为输入 
    gpio_init(PORTA,14, GPO,HIGH);          //初始化PCSN管脚为输出,低电平选中  
    
#if IS_USE_ISR
    exti_init(PORTE,27, falling_up);        //初始化IRQ管脚为 :下降沿触发,内部上拉
#else
    gpio_init(PORTE,27, GPI,LOW);           //初始化IRQ管脚为输入     
#endif
    
    //配置NRF寄存器
    NRF_CE_LOW();	
    
    NRF_WriteReg(NRF_WRITE_REG+SETUP_AW,ADR_WIDTH - 2);     //设置地址长度为 TX_ADR_WIDTH
    
    NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);               //设置RF通道为CHANAL
 
    NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);              //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 
    
    NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);                 //使能通道0的自动应答  
    
    NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);             //使能通道0的接收地址    
    
    //RX模式配置
    //NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址

    NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);    //选择通道0的有效数据宽度   
    
    //TX模式配置
    //NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);    //写TX节点地址 ,主要为了使能ACK   

    NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x0F);            //设置自动重发间隔时间:250us + 86us;最大自动重发次数:15次
    
#if IS_AUTO_RX_MODE
    NRF_RX_Mode();          //默认进入接收模式
#endif
    NRF_CE_HIGH();

    while(NRF_Check() == 0);                            //检测无线模块是否插入:如果卡在这里,说明没检测到无线模块
    
}
示例#6
0
u8  NRF_ISR_Rx_Dat(u8 *rxbuf)
{
    
    if( nrf_mode != RX_MODE)
    {
        NRF_RX_Mode();
    }
    else
    {
        NRF_CE_HIGH();	 //进入接收状态
    }
    
    if(re_flag == QUEUE_EMPTY)   //空,直接返回0
    {
        return 0;
    }

    //复制数据
    nrf_cpy(rxbuf,(u8 *)&(RX_ISR_FIFO[front]),MAX_ONCE_TX_NUM);
    
    NRF_CE_LOW();  	 //进入待机状态
    
    front++;                //由于非空,所以可以直接出队列
    
    if(front >= RX_ISR_FIFO_PACKET)
    {
        front=0;            //重头开始
    }
    
    if(front == rear)       //追到屁股了,接收队列空
    {
        re_flag = QUEUE_EMPTY;
//        front=0;            //重头开始(可以省掉)
//        rear=0;
    }
    
    NRF_CE_HIGH();  	 //进入接收模式
    
    return RX_DR;
    
}
示例#7
0
 /**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)                  
{   
  SPI_NRF_Init();

  /* 串口1初始化 */
  USART1_Config();

  printf("\r\n 这是一个 NRF24L01 无线传输实验 \r\n");
  printf("\r\n 这是无线传输 主机端 的反馈信息\r\n");
  printf("\r\n   正在检测NRF与MCU是否正常连接。。。\r\n");

  /*检测NRF模块与MCU的连接*/
  status = NRF_Check(); 

  /*判断连接状态*/  
  if(status == SUCCESS)	   
    printf("\r\n      NRF与MCU连接成功!\r\n");  
  else	  
    printf("\r\n  NRF与MCU连接失败,请重新检查接线。\r\n");

  while(1)
  {
    printf("\r\n 主机端 进入自应答发送模式\r\n"); 
    NRF_TX_Mode();

    /*开始发送数据*/	
    status = NRF_Tx_Dat(txbuf);	  

    /*判断发送状态*/
    switch(status)
    {
      case MAX_RT:
        printf("\r\n 主机端 没接收到应答信号,发送次数超过限定值,发送失败。 \r\n");
      break;

      case ERROR:
        printf("\r\n 未知原因导致发送失败。 \r\n");
      break;

      case TX_DS:
        printf("\r\n 主机端 接收到 从机端 的应答信号,发送成功! \r\n");	 		
      break;  								
    }			   	

    printf("\r\n 主机端 进入接收模式。 \r\n");	
    NRF_RX_Mode();

    /*等待接收数据*/
    status = NRF_Rx_Dat(rxbuf);

    /*判断接收状态*/
    switch(status)
    {
      case RX_DR:
      for(i=0;i<4;i++)
      {					
        printf("\r\n 主机端 接收到 从机端 发送的数据为:%d \r\n",rxbuf[i]);
        txbuf[i] =rxbuf[i];
      }
      break;

      case ERROR:
        printf("\r\n 主机端 接收出错。   \r\n");
      break;  		
    }
  }// while(1)
}