当前位置:C++技术网 > 资讯 > nRF24l01学习笔记——接收和发送无线消息

nRF24l01学习笔记——接收和发送无线消息

更新时间:2016-06-05 10:42:00浏览次数:1+次

说明一点:

nRF24l01的操作函数:


byte SPI_RW(unsigned char Byte)
{
  byte i;
  for(i=0;i<8;i++)              
  {
    if(Byte&0x80)
    {
      digitalWrite(_MOSI, 1);   
    }
    else
    {
      digitalWrite(_MOSI, 0);
    }
    digitalWrite(_SCK, 1);                   
    Byte <<= 1;                       
    if(digitalRead(_MISO) == 1)
    {
      Byte |= 1;       	             
    }
    digitalWrite(_SCK, 0);         	
  }
  return(Byte);           	    
}

/**************************************************/
byte SPI_RW_Reg(unsigned char reg, unsigned char value)
{
  byte status;

  digitalWrite(CSN, 0);              
  status = SPI_RW(reg);                
  SPI_RW(value);                         
  digitalWrite(CSN, 1);                  
  return(status);            
}



/**************************************************/
byte SPI_Read(unsigned char reg)
{
  byte reg_val;

  digitalWrite(CSN, 0);           
  SPI_RW(reg);                
  reg_val = SPI_RW(0);        
  digitalWrite(CSN, 1);         

  return(reg_val);            
}



/**************************************************/
byte SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
  byte status,i;

  digitalWrite(CSN, 0);              
  status = SPI_RW(reg);       	    

  for(i=0;i<bytes;i++)
  {
    pBuf[i] = SPI_RW(0);    
  }

  digitalWrite(CSN, 1);                  

  return(status);                 
}



/**************************************************/
byte SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
  byte status,i;

  digitalWrite(CSN, 0);                
  status = SPI_RW(reg);            
  for(i=0;i<bytes; i++)             
  {
    SPI_RW(*pBuf++);
  }
  digitalWrite(CSN, 1);                 
  return(status);                  
}
以上为设备的信息接收和发送函数。


但是应该如何使用呢?

我们引入一个封装的函数:

/********发送信息(无线发出的的)****************************************/
void TX_DATA()
{
    byte status;
    status=SPI_Read(STATUS);
    if(status&TX_DS)
    {
        SPI_RW_Reg(FLUSH_TX,0);
        SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
    }
    if(status&MAX_RT)
    {
        SPI_RW_Reg(FLUSH_TX,0);
        SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
    }
    SPI_RW_Reg(WRITE_REG+STATUS,status);
   delay(20);
}
/******************接收消息(无线传递过来的)******************************/
void RX_DATA()
{
    byte status;
    status = SPI_Read(STATUS);                      
    if(status&RX_DR)                                            
    {
      SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);          
      SPI_RW_Reg(FLUSH_RX,0);       
    }
      SPI_RW_Reg(WRITE_REG+STATUS,status);    
}
如何封装为我们自己直接用的呢?



byte rxBuf[32];/*我也不知道为啥是32,反正32是够大了,毕竟是个协议而已,据说最大可扩展到256,刚接触这个,不了解*/
byte txBuf[32];
void loop() 
{ 
  //------开始接收消息-----------------------
  RX_DATA();/*执行完这句之后,数据就放进了rxBuf中,然后你就会问我,它咋放进去的?我会告诉你:去检查RX_DATA() 函数,里面有一句话:SPI_Read_Buf(RD_RX_PLOAD, rxBuf, TX_PLOAD_WIDTH);就这样子放进去了,注意 rxBuf一定是全部变量啊!!! */
  delay(500);//等待500微秒
  //------然后我们开始发送-------------------
 txBuf[1] = 11;
 txBuf[2] = 22;
 txBuf[3] = 33;
 txBuf[0] = 3;/*因为我要发送的数据总量是3个,所以在第0位,写上3,你的数据是4个就写4*/
 TX_DATA();/*执行完这个,你的消息就出去了~~~别问为啥,和RX_DATA的原理一样,因为一句话:在TX_DATA中:PI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);*/
 delay(500);//等待500微秒
} 


so。。。到这里,你就可以随心所欲的干你想干的事了。附带一个下配置:

//****************************************************
#define READ_REG        0x00  
#define WRITE_REG       0x20  
#define RD_RX_PLOAD     0x61  
#define WR_TX_PLOAD     0xA0  
#define FLUSH_TX        0xE1  
#define FLUSH_RX        0xE2  
#define REUSE_TX_PL     0xE3  
#define NOP             0xFF  
//***************************************************
#define RX_DR    0x40
#define TX_DS    0x20
#define MAX_RT   0x10
//***************************************************
#define CONFIG          0x00
#define EN_AA           0x01  
#define EN_RXADDR       0x02  
#define SETUP_AW        0x03  
#define SETUP_RETR      0x04  
#define RF_CH           0x05  
#define RF_SETUP        0x06  
#define STATUS          0x07  
#define OBSERVE_TX      0x08  
#define CD              0x09
#define RX_ADDR_P0      0x0A  
#define RX_ADDR_P1      0x0B  
#define RX_ADDR_P2      0x0C  
#define RX_ADDR_P3      0x0D  
#define RX_ADDR_P4      0x0E
#define RX_ADDR_P5      0x0F  
#define TX_ADDR         0x10  
#define RX_PW_P0        0x11  
#define RX_PW_P1        0x12  
#define RX_PW_P2        0x13  
#define RX_PW_P3        0x14
#define RX_PW_P4        0x15  
#define RX_PW_P5        0x16  
#define FIFO_STATUS     0x17
 
//-----引脚配置--------------
#define IRQ       8
#define CE        9
#define CSN       10
#define _SCK      13
#define _MOSI     11
#define _MISO     12

我就知道引脚是啥,别的不了解。。另请高明吧!