找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3210|回复: 5
收起左侧

单片机+NRF2401收发一体程序

  [复制链接]
ID:269804 发表于 2021-4-18 20:02 | 显示全部楼层 |阅读模式
NRF2401收发一套程序只需要修改参数即可实现收发功能。
51hei.png

单片机源程序如下:
  1. #include "NRF24L01.h"

  2. xdata u8 TxAddr[5] = {0x01,0x10,0x34,0x43,0x20}; //发送地址
  3. xdata u8 RxAddr[5] = {0x01,0x10,0x34,0x43,0x20}; //接收地址

  4. void NRF_IO_Init(void)
  5. {
  6.         SCK = 0;
  7. }

  8. u8 NRF_SPI_RW(u8 byte)
  9. {
  10.         u8 i = 0;
  11.         for(i=0;i<8;i++)
  12.         {
  13.                 MOSI = (byte&0x80);
  14.                 byte <<= 1;
  15.                 SCK = 1;
  16.                 byte|=MISO;
  17.                 SCK=0;
  18.         }
  19.        
  20.         return byte;
  21. }


  22. void NRF_WriteReg(u8 regaddr,u8 regval)
  23. {
  24.           CSN = 0;
  25.                 NRF_SPI_RW(regaddr+W_REG);
  26.           NRF_SPI_RW(regval);
  27.           CSN = 1;
  28. }

  29. u8 NRF_ReadReg(u8 regaddr)
  30. {
  31.           CSN = 0;
  32.                 NRF_SPI_RW(regaddr+R_REG);
  33.           regaddr = NRF_SPI_RW(NOP);
  34.           CSN = 1;
  35.                 return regaddr;
  36. }


  37. void NRF_WriteBytes(u8 regaddr,u8*nrfaddr,u8 len)
  38. {
  39.                 u8 i = 0;
  40.           CSN = 0;
  41.                 NRF_SPI_RW(regaddr+W_REG);
  42.           for(i = 0;i<len;i++)
  43.           {
  44.                    NRF_SPI_RW(nrfaddr[i]);
  45.                 }
  46.           CSN = 1;
  47. }

  48. void NRF_ReadBytes(u8 regaddr,u8*nrfaddr,u8 len)
  49. {
  50.                 u8 i = 0;
  51.           CSN = 0;
  52.                 NRF_SPI_RW(regaddr+R_REG);
  53.           for(i = 0;i<len;i++)
  54.           {
  55.                    nrfaddr[i] = NRF_SPI_RW(NOP);
  56.                 }
  57.           CSN = 1;
  58. }


  59. u8 NRF_CheckDev(void)
  60. {
  61.         u8 i  = 0;
  62.   xdata u8 rbuf[5] = {0};
  63.         NRF_WriteBytes(TX_ADDR,TxAddr,5);
  64.         NRF_ReadBytes(TX_ADDR,rbuf,5);
  65.         for(i=0;i<5;i++)
  66.         {
  67.                 if(TxAddr[i]!=rbuf[i])
  68.                 {
  69.                         return 0xff;
  70.                 }
  71.         }
  72.         return 0x0;
  73. }


  74. void NRF_SendMode(void)
  75. {
  76.         NRF_WriteBytes(TX_ADDR,TxAddr,5);    //设置发送地址               
  77.         NRF_WriteReg(EN_AA,0x01);                         //允许P0自动应答
  78.         NRF_WriteReg(EN_RXADDR,0x01);                 //P0接收
  79.         NRF_WriteBytes(RX_ADDR_P0,RxAddr,5); //自动应答地址
  80.         NRF_WriteReg(RF_CH,40);                         //频率
  81.         NRF_WriteReg(RF_SETUP,0x07);                 //功率和速度
  82.         NRF_WriteReg(CONFIG,0x0e);                 //发送模式       

  83. }

  84. void NRF_RecvMode(void)
  85. {
  86.         NRF_WriteReg(EN_RXADDR,0x01);                 //P0接收
  87.         NRF_WriteBytes(RX_ADDR_P0,RxAddr,5); //接收地址
  88.         NRF_WriteReg(EN_AA,0x01);                         //允许P0自动应答
  89.         NRF_WriteReg(RF_CH,40);                         //频率
  90.         NRF_WriteReg(RF_SETUP,0x07);                 //功率和速度                       
  91.         NRF_WriteReg(RX_PW_P0,32);         //数据有效宽度
  92.         NRF_WriteReg(CONFIG,0x0f);                 //接收模式

  93. }


  94. //返回值 0 存在设备 1 设备有问题
  95. //参数 0 发送模式   1接收模式
  96. u8 NRF_CONFIG(u8 mode)
  97. {
  98.          
  99.                 NRF_IO_Init();
  100.                 if(NRF_CheckDev()) //检测设备存在
  101.           {
  102.                                 return 0xff;
  103.                 }

  104.                 switch(mode)
  105.                 {

  106.                         case NRF_TX:NRF_SendMode();                             
  107.                                      break; //发送
  108.                         case NRF_RX:NRF_RecvMode();
  109.                                                                          break; //接收
  110.                        
  111.                         default: return 0xff;
  112.                 }
  113.                
  114.           return 0x00;
  115. }


  116. void NRF_SendData(u8 *sbuf,u8 len)
  117. {
  118.                 CE = 0;
  119.     CSN = 0;
  120.                 if(len>32)len = 32; //限制最大32个字节
  121.           NRF_SPI_RW(WR_TX_PLOAD); //发送fifo地址
  122.           while(len--)
  123.                 {
  124.                   NRF_SPI_RW(*sbuf++);
  125.                 }
  126.                 CSN = 1;
  127.                 CE = 1;
  128. }



  129. void NRF_RecvData(u8 *sbuf,u8 len)
  130. {
  131.     CSN = 0;
  132.                 if(len>32)len = 32; //限制最大32个字节
  133.           NRF_SPI_RW(RD_RX_PLOAD);
  134.           while(len--)
  135.                 {
  136.                  *sbuf=NRF_SPI_RW(NOP);
  137.                         sbuf++;
  138.                 }
  139.                 CSN = 1;
  140. }


  141. u8 NRF_TxOrRxPack(u8 mode,u8 *pbuf,u8 len,u8 timeout)
  142. {
  143.                 static xdata u16 cnt = 0;
  144.                 static xdata u8 SRMode = 0;
  145.           u8 status = 0;
  146.                 if(++cnt>timeout)
  147.                 {
  148.                           cnt = 0;
  149.                           if(mode==NRF_TX) //发送模式
  150.                                 {
  151.                                                 switch(SRMode)
  152.                                                 {
  153.                                                         case 0:NRF_SendData(pbuf,len);SRMode++;
  154.                                                                     break;
  155.                                                         case 1:if(IRQ==0){
  156.                                                                                         status =NRF_ReadReg(STATUS);
  157.                                                                                         NRF_WriteReg(STATUS,status);
  158.                                                                                         if(status&MAX_TX)
  159.                                                                                         {
  160.                                                                                                         NRF_WriteReg(FLUSH_TX,0xff);
  161.                                                                                                         SRMode = 0;
  162.                                                                                                         return MAX_TX; //达到最大重发次数
  163.                                                                                         }
  164.                                                                                         if(status&TX_OK)
  165.                                                                                         {
  166.                                                                                                   SRMode = 0;
  167.                                                                                                         return TX_OK; //成功
  168.                                                                                         }
  169.                                                                                 }
  170.                                                                                 break;
  171.                                                         default: SRMode = 0;
  172.                                                 }
  173.                                 }
  174.                                  if(mode==NRF_RX) //接收模式
  175.                                 {
  176.                                                 status =NRF_ReadReg(STATUS);
  177.                               NRF_WriteReg(STATUS,status); //清除标志位
  178.                                                 if(status&RX_OK) //收到数据
  179.                                           {
  180.                                                         NRF_RecvData(pbuf,len);
  181.                                                         NRF_WriteReg(FLUSH_RX,0xff);//收到数据将RX FIFO清空
  182.                                                         return RX_OK;
  183.                                           }
  184.                                 }
  185.                 }
  186.                
  187.                 return 0xff; //其他错误
  188. }
复制代码
51hei.png
所有资料51hei提供下载:
NRF24L01(整理后).zip (90.47 KB, 下载次数: 101)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:28992 发表于 2021-4-19 00:19 | 显示全部楼层
very good job, thank you sir!
回复

使用道具 举报

ID:269804 发表于 2021-5-9 11:06 来自手机 | 显示全部楼层
这个代码是利用状态机实现的,需要代码无阻塞
回复

使用道具 举报

ID:281029 发表于 2022-4-2 14:38 | 显示全部楼层
想问下头文件#include <STC89C5xRC.H>为什么编译提示有问题
回复

使用道具 举报

ID:44459 发表于 2022-4-3 23:59 | 显示全部楼层
谢谢分享  正准备研究一下
回复

使用道具 举报

ID:269804 发表于 2022-5-20 17:29 | 显示全部楼层
山川慕白 发表于 2022-4-2 14:38
想问下头文件#include 为什么编译提示有问题

需要添加stc的头文件,用reg52.h 也行可能就是需要改一下
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表