930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 8378|回复: 0

nRF24L01P无线通信知识点4:nRF24L01P寄存器程序设计

[复制链接]

101

主题

333

帖子

7428

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7428
发表于 2019-6-10 10:11:32 | 显示全部楼层 |阅读模式
本帖最后由 正是河豚 于 2019-6-10 10:12 编辑
    1、模式配置函数:MCU可通过SPI总线配置nRF24L01P寄存器使其工作在发送还是接收模式,配置函数如下。
    1)初始化NRF24L01到接收模式,配置相关参数。
  • /***************************************************************************
  • * 描  述 : 初始化NRF24L01到接收模式,配置相关参数
  • * 入  参 : 无
  • * 返回值 : 无
  • **************************************************************************/  
  • void Set_RxMode_MB(void)  
  • {  
  •     CE_MB_LOW;      
  •   //写RX节点地址  
  •   NRF24L01_WriteBuf_MB(SPI_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS_MB,RX_ADDR_WIDTH);  
  •   //使能通道0的自动应答      
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+EN_AA,0x01);      
  •   //使能通道0的接收地址         
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+EN_RXADDR,0x01);  
  •   //设置RF通道工作频率         
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+RF_CH,55);        
  •   //选择通道0的有效数据宽度         
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);  
  •   //设置TX发射参数,0db增益,250Kbps,低噪声增益开启   
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+RF_SETUP,0x26);  
  •   //设置为接收模式PRX,使能PWR_UP、EN_CRC,使能CRC为2字节,开启RX_DR、TX_DS、MAX_RT中断引脚   
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+CONFIG, 0x0f);   
  •   //CE为高,进入接收模式   
  •   CE_MB_HIGH;                                 
  • }

    2)初始化NRF24L01到发送模式,配置相关参数。
  • /***************************************************************************
  • * 描  述 : 初始化NRF24L01到发送模式,配置相关参数
  • * 入  参 : 无
  • * 返回值 : 无
  • **************************************************************************/  
  • void Set_TxMode_MB(void)  
  • {                                                         
  •     CE_MB_LOW;        
  •   //写TX节点地址   
  •   NRF24L01_WriteBuf_MB(SPI_WRITE_REG+TX_ADDR,(uint8_t*)TX_ADDRESS_MB,TX_ADDR_WIDTH);      
  •   //设置RX节点地址,使能ACK(应答)      
  •   NRF24L01_WriteBuf_MB(SPI_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS_MB,RX_ADDR_WIDTH);   
  •   //使能通道0的自动应答      
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+EN_AA,0x01);      
  •   //使能通道0的接收地址   
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+EN_RXADDR,0x01);   
  •   //设置自动重发间隔时间:750us+86us ;最大自动重发次数:5次  
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+SETUP_RETR,0x25);  
  •   //设置RF通道工作频率   
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+RF_CH,55);         
  •   //设置TX发射参数,0db增益,250Kbps,低噪声增益开启     
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+RF_SETUP,0x26);   
  •   //设置为发送模式PTX,使能PWR_UP、EN_CRC,使能CRC为2字节,开启RX_DR、TX_DS、MAX_RT中断引脚   
  •   NRF24L01_WriteReg_MB(SPI_WRITE_REG+CONFIG,0x0e);                                    
  • }

    注:在配置发送、接收模式时,是否应答、重发间隔、通道工作频率、通信速率、是否CRC等都是可以根据自己需求配置的,上面举例仅是参考。
    2、数据处理函数:nRF24L01P模块无线发送或接收也是通过操作nRF24L01P寄存器实现的,函数如下。
    1)启动NRF24L01读取一次数据。
  • /***************************************************************************
  • * 描  述 : 启动NRF24L01读取一次数据
  • * 入  参 : buf:待发送数据首地址
  • * 返回值 : 0:未接收到数据;RX_OK:接收到数据
  • **************************************************************************/  
  • uint8_t NRF24L01_RxPacket_MB(uint8_t *buf)  
  • {  
  •     uint8_t state;            
  •       
  •     state=NRF24L01_ReadReg_MB(STATUS);                     //读取状态寄存器的值         
  •     NRF24L01_WriteReg_MB(SPI_WRITE_REG+STATUS,state);      //清除RX_DR、TX_DS或MAX_RT中断标志  
  •     if(state&RX_OK)                                         //接收到数据  
  •     {  
  •         NRF24L01_ReadBuf_MB(RD_RX_PLOAD,buf,RX_PLOAD_WIDTH);  //读取数据  
  •         NRF24L01_WriteReg_MB(FLUSH_RX,0xff);                 //清除RX FIFO寄存器   
  •         return RX_OK;                                         //返回0x10  
  •     }        
  •     return 0;                                               //没收到任何数据  
  • }

    2)启动NRF24L01发送一次数据。
  • /***************************************************************************
  • * 描  述 : 启动NRF24L01发送一次数据
  • * 入  参 : buf:待发送数据首地址
  • * 返回值 : TX_OK:发送完成;MAX_TX:达到最大重发次数;0xff:发送失败
  • **************************************************************************/  
  • uint8_t NRF24L01_TxPacket_MB(uint8_t *buf)  
  • {  
  •     uint8_t state;     
  •       
  •     CE_MB_LOW;  
  •   NRF24L01_WriteBuf_MB(WR_TX_PLOAD,buf,TX_PLOAD_WIDTH);   //写数据到TX BUF   
  •     CE_MB_HIGH;                                             //启动发送      
  •     while(READ_NRF24L01_MB_IRQ!=0);                         //等待发送完成  
  •     state=NRF24L01_ReadReg_MB(STATUS);                     //读取状态寄存器的值      
  •     NRF24L01_WriteReg_MB(SPI_WRITE_REG+STATUS,state);      //清除RX_DR、TX_DS或MAX_RT中断标志  
  •     if(state&MAX_TX)                                        //达到最大重发次数  
  •     {  
  •         NRF24L01_WriteReg_MB(FLUSH_TX,0xff);                 //清除TX FIFO寄存器   
  •         return MAX_TX;                                        //返回0x10  
  •     }  
  •     if(state&TX_OK)                                         //发送完成  
  •     {  
  •         return TX_OK;                                         //返回0x20  
  •     }  
  •     return 0xff;                                            //发送失败,返回0xff  
  • }

    注:模式配置函数和数据处理函数属于功能函数,常供外部调用。
    3、nRF24L01P寄存器基本操作函数笔者常使用4个,罗列如下。
    1)NRF24L01寄存器写函数。
  • /***************************************************************************
  • * 描  述 : NRF24L01寄存器写函数
  • * 入  参 : regaddr:要写的寄存器地址;data:写入到寄存器的数据
  • * 返回值 : 读取的状态值
  • **************************************************************************/  
  • uint8_t NRF24L01_WriteReg_MB(uint8_t regaddr,uint8_t dat)  
  • {  
  •     uint8_t status;   
  •       
  •   CS_MB_LOW;                             //使能SPI传输  
  •   status =SPI2_ReadWriteByte(regaddr); //发送寄存器地址  
  •   SPI2_ReadWriteByte(dat);             //写入寄存器的值  
  •   CS_MB_HIGH;                            //禁止SPI传输      
  •   return(status);                         //返回状态值  
  • }

    2)NRF24L01寄存器读函数。
  • /***************************************************************************
  • * 描  述 : NRF24L01寄存器读函数
  • * 入  参 : regaddr:要读取的寄存器地址
  • * 返回值 : 读取的寄存器的值
  • **************************************************************************/  
  • uint8_t NRF24L01_ReadReg_MB(uint8_t regaddr)  
  • {  
  •     uint8_t reg_val;        
  •    
  •     CS_MB_LOW;                          //使能SPI传输         
  •   SPI2_ReadWriteByte(regaddr);      //发送寄存器号  
  •   reg_val=SPI2_ReadWriteByte(0XFF); //读取寄存器内容  
  •   CS_MB_HIGH;                         //禁止SPI传输           
  •   return(reg_val);                 //返回读取的值  
  • }  

    3)从指定地址读出指定长度的数据。
  • /***************************************************************************
  • * 描  述 : 从指定地址读出指定长度的数据
  • * 入  参 : pBuf:读出数据的存放地址;datlen:读出的数据字节数
  • * 返回值 : 读取的寄存器的值
  • **************************************************************************/  
  • uint8_t NRF24L01_ReadBuf_MB(uint8_t regaddr,uint8_t *pBuf,uint8_t datlen)  
  • {  
  •     uint8_t status,temp;            
  •   CS_MB_LOW;                               //使能SPI  
  •   status=SPI2_ReadWriteByte(regaddr);      //发送寄存器值,并读取状态值           
  •     for(temp=0;temp<datlen;temp++)  
  •     {  
  •         pBuf[temp]=SPI2_ReadWriteByte(0XFF);   //读出数据  
  •     }  
  •   CS_MB_HIGH;                              //禁止SPI  
  •   return status;                           //返回读到的状态值  
  • }

    4)向指定地址写入指定长度的数据。
  • /***************************************************************************
  • * 描  述 : 向指定地址写入指定长度的数据
  • * 入  参 : pBuf:读出数据的存放地址;datlen:读出的数据字节数
  • * 返回值 : 读取的状态寄存器值
  • **************************************************************************/  
  • uint8_t NRF24L01_WriteBuf_MB(uint8_t regaddr, uint8_t *pBuf, uint8_t datalen)  
  • {  
  •     uint8_t status,temp;         
  •     CS_MB_LOW;                                            //使能SPI  
  •   status = SPI2_ReadWriteByte(regaddr);                 //发送寄存器值,并读取状态值  
  •   for(temp=0; temp<datalen; temp++)  
  •     {  
  •        SPI2_ReadWriteByte(*pBuf++);                       //写入数据      
  •     }         
  •   CS_MB_HIGH;                                           //禁止SPI  
  •   return status;                                        //返回读到的状态值  
  • }

    4、nRF24L01P寄存器基本操作函数使用的SPI读写函数是根据MCU不同而不同,可以使用硬件SPI,也可以使用模拟SPI。此处不详述。
    5、附件是基于艾克姆IK-ZET6的开发板关联nRF24L01P模块进行收发的例程,仅供参考。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表