Example #1
0
//传输一次,数据最长为 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;
}
Example #2
0
/*
 * 函数名:NRF_RX_Mode
 * 描述  :配置并进入接收模式
 * 输入  :无	
 * 输出  :无
 * 调用  :外部调用
 */
void NRF_RX_Mode(void)
{
	NRF_CE_LOW();	
    
    NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);             //使能通道0的自动应答  
    
    NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);         //使能通道0的接收地址 
    
    NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
    
    
    NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0B | (IS_CRC16<<2));           //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 

#if 1
    /* 清除中断标志*/      
	NRF_WriteReg(NRF_WRITE_REG+STATUS,0xff);
    
    NRF_WriteReg(FLUSH_RX,NOP);                     //清除RX FIFO寄存器
#endif    
    
    /*CE拉高,进入接收模式*/	
    NRF_CE_HIGH();
    
    nrf_mode = RX_MODE;
}    
/*=====================================================================================================*/
static void NRF_TxData( u8 *TxBuf )
{
  NRF_CE = 0;
  NRF_SetAddr(NRF_TX_ADDR, TX_ADDRESS);         // 設定 TX 地址
  NRF_WriteReg(CMD_W_REG | NRF_CONFIG, 0x0E);   // Power UP,Enable 16bit CRC,TX Mode,no mask
  NRF_WriteBuf(CMD_W_TX_PLOAD, TxBuf, NRF_TX_PL_WIDTH); // 寫入資料
  NRF_CE = 1;
  Delay_10us(1);  // A high pulse on CE starts the transmission. The minimum pulse width on CE is 10μs.
}
Example #4
0
/*
 * 函数名:NRF_TX_Mode
 * 描述  :配置发送模式
 * 输入  :无	
 * 输出  :无
 * 调用  :外部调用
 */
void NRF_TX_Mode(void)
{  
    u32 i;

	NRF_CE_LOW();		
    
    NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);    //写TX节点地址 

    NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置RX节点地址 ,主要为了使能ACK   
    
    NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0A | (IS_CRC16<<2));    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断

    /*CE拉高,进入发送模式*/
    NRF_CE_HIGH();

    i=0xffff;
    while(i--);         //CE要拉高一段时间才进入发送模式
    //DELAY_MS(1); 

    nrf_mode = TX_MODE;
}
/*=====================================================================================================*/
static u8 NRF_Check( void )
{
  u8 i;
  u8 buf[5] = {0};

  NRF_WriteBuf(CMD_W_REG | NRF_TX_ADDR, TX_ADDRESS, 5);
  NRF_ReadBuf(CMD_R_REG | NRF_TX_ADDR, buf, 5);

  for(i=0; i<5; i++)
    if(buf[i]!=TX_ADDRESS[i])
      return ERROR;

  return SUCCESS;
}
Example #6
0
void SetRxMode(void)
{
	SPI_CE_L;
	NRF_WriteReg(FLUSH_RX, 0xff);//清除TX FIFO寄存器	
	NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//写RX节点地址
	NRF_WriteReg(NRF_WRITE_REG+EN_AA, 0x01);//使能通道0的自动应答 
	NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR, 0x01);//使能通道0的接收地址 
	NRF_WriteReg(NRF_WRITE_REG+RF_CH, 40);//设置RF通信频率		
	NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0, RX_PLOAD_WIDTH);//选择通道0的有效数据宽度 
	NRF_WriteReg(NRF_WRITE_REG+RF_SETUP, 0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启  
	NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 
	SPI_CE_H;
	printf("nrf24l01 work on rx..\r\n");
}
/*=====================================================================================================*/
u8 NRF_Check( void )
{
  u8 i;
  u8 SendBuf[5] = {0xc2, 0xb5, 0x81, 0xd0, 0xa9};
  u8 RecvBuf[5] = {0};

  NRF_WriteBuf(CMD_W_REG | NRF_TX_ADDR, SendBuf, 5);
  NRF_ReadBuf(CMD_R_REG | NRF_TX_ADDR, RecvBuf, 5);

  for(i=0; i<5; i++)
    if(RecvBuf[i]!=SendBuf[i])
      return ERROR;

  return SUCCESS;
}
Example #8
0
//中断发送函数,仅仅发送一次,就等待中断发送
void NRF_ISR_Tx_Dat_Once(void)
{
    if(isr_L > 0)
    {
        /*ce为低,进入待机模式1*/
        NRF_CE_LOW();

        /*写数据到TX BUF 最大 32个字节*/						
        NRF_WriteBuf(WR_TX_PLOAD,(u8 *)isr_addr,MAX_ONCE_TX_NUM);

        /*CE为高,txbuf非空,发送数据包 */   
        NRF_CE_HIGH();

        isr_L--;
    }
}
Example #9
0
//判断SPI接口是否接入NRF芯片是否可用
uint8_t NRF24L01_Check(void)
{
	uint8_t buf[5] = {0xC2,0xC2,0xC2,0xC2,0xC2};
	uint8_t buf1[5] = {0};
	uint8_t i;
	NRF_WriteBuf(NRF_WRITE_REG + TX_ADDR, buf, 5);
	NRF_ReadBuf(TX_ADDR, buf1, 5);

	for (i=0;i<5;i++) 
	{ 
		if (buf1[i]!=0xC2) 
			break; 
	} 

	if (i==5)   {printf("NRF24L01 is working...\r\n");return 1 ;}        //MCU 与NRF 成功连接 
	else        {printf("NRF24L01 wrong...\r\n");return 0 ;}        //MCU与NRF不正常连接 

}
/*=====================================================================================================*/
static void NRF_SetAddr( u8 RegAddr, u8 *Address )
{
  u8 PipeLen = 0;

  switch(RegAddr) {
    case NRF_TX_ADDR:
    case NRF_RX_ADDR_P0:
    case NRF_RX_ADDR_P1:
      PipeLen = NRF_PIPE_WIDTH;
      break;
    case NRF_RX_ADDR_P2:
    case NRF_RX_ADDR_P3:
    case NRF_RX_ADDR_P4:
    case NRF_RX_ADDR_P5:
      PipeLen = 1;
      break;
  }

  NRF_WriteBuf(CMD_W_REG | RegAddr, Address, PipeLen);
}
Example #11
0
/*
 * 函数名:NRF_Check
 * 描述  :主要用于NRF与MCU是否正常连接
 * 输入  :无	
 * 输出  :SUCCESS/ERROR 连接正常/连接失败
 * 调用  :外部调用
 */
u8 NRF_Check(void)
{
#define NRF_CHECH_DATA  0xC2
	u8 buf[5]={NRF_CHECH_DATA,NRF_CHECH_DATA,NRF_CHECH_DATA,NRF_CHECH_DATA,NRF_CHECH_DATA};
	u8 buf1[5];
	u8 i; 

	/*写入5个字节的地址.  */ 
    NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,buf,5);
    
	/*读出写入的地址 */
	NRF_ReadBuf(TX_ADDR,buf1,5); 
	
	/*比较*/
	for(i=0;i<5;i++)
	{
		if(buf1[i] != NRF_CHECH_DATA)
        {
            return 0 ;        //MCU与NRF不正常连接
        }
	} 
	return 1 ;             //MCU与NRF成功连接 	
}
Example #12
0
void NRF_TxPacket(uint8_t *txbuf, uint8_t len)
{
	SPI_CE_L;////StandBy I模式	
	NRF_WriteBuf(WR_TX_PLOAD, txbuf, len);
	SPI_CE_H;//置高CE,激发数据发送
}