找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1342|回复: 4
打印 上一主题 下一主题
收起左侧

关于nrf24l01的入门级简单应用,求教

[复制链接]
跳转到指定楼层
楼主
ID:711402 发表于 2020-4-21 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因本人还是小白,想用简单的按键来实现nrf24l01通信。按下按键1发送0x01后led闪烁,按下按键2发送0x02后led闪烁,我在板子上运行了,只有发射方的灯会闪烁,接收方的灯没反应,想求教一下。
发送方:
  1. <div>#include<reg52.h></div><div>#define uint unsigned int
  2. </div>#define uchar unsigned char
  3. sbit S1 =P1^0;                   //????1
  4. sbit S2 =P1^1;                  //????2
  5. sbit LED=P1^6;                                         //??????????????
  6. uchar Tx_Buf[32];
  7. sbit        CE            =P2^0;
  8. sbit        CSN                =P2^1;
  9. sbit        SCK            =P2^2;
  10. sbit         MOSI        =P2^3;
  11. sbit         MISO        =P2^4;
  12. sbit        IRQ                =P2^5;

  13. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  14. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  15. #define TX_PLOAD_WIDTH  32          // 32 uints TX payload
  16. #define RX_PLOAD_WIDTH  32          // 32 uints TX payload
  17. uchar  TX_ADDRESS[TX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7};        //??????
  18. uchar  RX_ADDRESS[RX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7};        //??????
  19. ///***************************************NRF24L01????????*******************************************************
  20. #define READ_REG        0x00          // ??????????
  21. #define WRITE_REG       0x20         // д????????
  22. #define RD_RX_PLOAD     0x61          // ??????????????
  23. #define WR_TX_PLOAD     0xA0          // д???????????
  24. #define FLUSH_TX        0xE1         // ??????? FIFO???
  25. #define FLUSH_RX        0xE2          // ??????? FIFO???
  26. #define REUSE_TX_PL     0xE3          // ?????????????????
  27. #define NOP             0xFF          // ????
  28. ///*************************************SPI(nRF24L01)????????****************************************************
  29. #define CONFIG          0x00  // ???????????CRCУ??????????????????
  30. #define EN_AA           0x01  // ????????????
  31. #define EN_RXADDR       0x02  // ???????????
  32. #define SETUP_AW        0x03  // ?????????????
  33. #define SETUP_RETR      0x04  // ??????????????
  34. #define RF_CH           0x05  // ???????????
  35. #define RF_SETUP        0x06  // ????????????????????
  36. #define NRFRegSTATUS    0x07  // ???????
  37. #define OBSERVE_TX      0x08  // ????????
  38. #define CD              0x09  // ??????           
  39. #define RX_ADDR_P0      0x0A  // ???0??????????
  40. #define RX_ADDR_P1      0x0B  // ???1??????????
  41. #define RX_ADDR_P2      0x0C  // ???2??????????
  42. #define RX_ADDR_P3      0x0D  // ???3??????????
  43. #define RX_ADDR_P4      0x0E  // ???4??????????
  44. #define RX_ADDR_P5      0x0F  // ???5??????????
  45. #define TX_ADDR         0x10  // ???????????
  46. #define RX_PW_P0        0x11  // ???????0???????????
  47. #define RX_PW_P1        0x12  // ???????1???????????
  48. #define RX_PW_P2        0x13  // ???????2???????????
  49. #define RX_PW_P3        0x14  // ???????3???????????
  50. #define RX_PW_P4        0x15  // ???????4???????????
  51. #define RX_PW_P5        0x16  // ???????5???????????
  52. #define FIFO_STATUS     0x17  // FIFO?????????????????
  53. ///*****************************???????*********************************************************
  54. uchar NRF24SPI_Send_Byte(uchar dat);
  55. uchar SPI_WR_Reg(uchar reg, uchar value);
  56. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len);
  57. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len);
  58. uchar nRF24L01_RxPacket(unsigned char* rx_buf);
  59. void nRF24L01_TxPacket(unsigned char * tx_buf);
  60. uchar SPI_RD_Reg(uchar reg);
  61. void init_NRF24L01(void);
  62. void TX_Mode(void);
  63. void RX_Mode(void);
  64. void NRF_Send(void);

  65. //----------------------------------------------
  66. //????????[MOSI??MISO???????]
  67. //----------------------------------------------
  68. uchar NRF24SPI_Send_Byte(uchar dat)
  69. {
  70.           uchar i;
  71.         for (i = 0; i < 8; i++) //output 8-bit
  72.         {
  73.                 //д??1λ????
  74.                 MOSI=(dat & 0x80);        //output 'uchar', MSB to MOSI
  75.                 dat<<= 1;           // shift next bit into MSB..
  76.                
  77.                 //???1λ????
  78.                 SCK = 1;                           // Set SCK high..
  79.                 if (MISO){
  80.                          dat|= 1;
  81.                 }else{                                     // capture current MISO bit
  82.                          dat &= 0xFE;
  83.                 }
  84.                 SCK = 0;                    // ..then set SCK low again
  85.         }
  86.         return(dat);                        // return read uchar
  87. }
  88. //----------------------------------------------
  89. //???n??10us
  90. //----------------------------------------------
  91. void Delay_n10us(uint n)        
  92. {
  93.    for(;n>0;n--)
  94.    {
  95.             unsigned char a,b;
  96.      for(b=1;b>0;b--)
  97.          for(a=2;a>0;a--);
  98.    }
  99. }

  100. //----------------------------------------------
  101. //NRF24L01?????
  102. //----------------------------------------------         
  103. void init_NRF24L01(void)
  104. {        
  105.         
  106.         Delay_n10us(10);
  107.         CE = 0;                    // chip enable
  108.         CSN= 1;                    // Spi disable
  109.         SCK=0;          //??????????д
  110.     IRQ=1;          //?ж??λ

  111.   
  112.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // д??????        
  113.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // д???????

  114.         
  115.         SPI_WR_Reg(WRITE_REG + EN_AA, 0x01);      //  ???0???        ACK???????        
  116.         SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  ???????????????0?????????????????ο?Page21  
  117.         SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // ???????????????????500us + 86us, 10 retrans...
  118.         SPI_WR_Reg(WRITE_REG + RF_CH, 22);        //   ????????????2.4GHZ????????????
  119.         SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //???y????????????????????32???
  120.         SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x07);                   //???÷????????1MHZ?????书???????0dB
  121.   
  122. //  SPI_RD_Reg(WRITE_REG + EN_AA);
  123. //  SPI_RD_Reg(WRITE_REG + EN_RXADDR);
  124. //  SPI_RD_Reg(WRITE_REG + RF_CH);
  125. //  SPI_RD_Reg(WRITE_REG + RX_PW_P0);
  126. //  SPI_RD_Reg(WRITE_REG + RF_SETUP);
  127. }
  128. //----------------------------------------------
  129. //??????uchar SPI_Read(uchar reg)
  130. //?????NRF24L01??SPI???,?????????????????
  131. //----------------------------------------------
  132. uchar SPI_RD_Reg(uchar reg)
  133. {
  134.         uchar reg_val;
  135.         CSN = 0;                                        // CSN low, initialize SPI communication...
  136.         NRF24SPI_Send_Byte(reg);            // Select register to read from..
  137.         reg_val = NRF24SPI_Send_Byte(0);    // ..then read registervalue
  138.         CSN = 1;                                        // CSN high, terminate SPI communication        
  139.         return(reg_val);                                // return register value
  140. }
  141. //----------------------------------------------
  142. //??????uchar SPI_Write(uchar reg)
  143. //?????NRF24L01??SPI???,д????????????????
  144. //----------------------------------------------
  145. uchar SPI_WR_Reg(uchar reg, uchar value)
  146. {
  147.         uchar status;
  148.         CSN = 0;                                           // CSN low, init SPI transaction
  149.         status = NRF24SPI_Send_Byte(reg);        // select register
  150.         NRF24SPI_Send_Byte(value);          // ..and write value to it..
  151.         CSN = 1;                                           // CSN high again
  152.         return(status);                                    // return nRF24L01 status uchar
  153. }
  154. //----------------------------------------------
  155. //??????uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)
  156. //????: ?????????
  157. //??????reg???????????
  158. //                pBuf???????????????
  159. //                uchars??????????????
  160. //----------------------------------------------
  161. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)
  162. {
  163.         uint status,i;
  164.         CSN = 0;                                    // Set CSN low, init SPI tranaction
  165.         status = NRF24SPI_Send_Byte(reg);   // Select register to write to and read status uchar
  166.         for(i=0;i<Len;i++){
  167.                  pBuf[i] = NRF24SPI_Send_Byte(0);
  168.         }
  169.         CSN = 1;                          
  170.         return(status);                            // return nRF24L01 status uchar
  171. }
  172. //----------------------------------------------
  173. //??????uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len)
  174. //????: ????д????
  175. //??????reg:?????????
  176. //                pBuf?????д????????
  177. //                uchars??д??????????
  178. //----------------------------------------------
  179. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len)
  180. {
  181.         uint status,i;
  182.         CSN = 0;                                            //SPI???      
  183.         status = NRF24SPI_Send_Byte(reg);   
  184.         for(i=0; i<Len; i++){
  185.            NRF24SPI_Send_Byte(*pBuf);
  186.                  pBuf ++;
  187.         }
  188.         CSN = 1;                                                   //???SPI
  189.         return(status);   
  190. }
  191. //----------------------------------------------
  192. //??????void SetRX_Mode(void)
  193. //????????????????
  194. //----------------------------------------------
  195. void RX_Mode(void)
  196. {
  197.    
  198.         CE = 0;        
  199.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);            // д??????        
  200.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);         // д???????
  201.         SPI_WR_Reg(WRITE_REG + EN_AA, 0x01);                                      //???0???        ACK???????        
  202.         SPI_WR_Reg(WRITE_REG + EN_RXADDR,0x01);                          //???????????????0?????????????????ο?Page21  
  203.         SPI_WR_Reg(WRITE_REG + SETUP_RETR,0x1a);                         //???????????????????500us + 86us, 10 retrans...
  204.         SPI_WR_Reg(WRITE_REG + RF_CH, 0x40);                                //????????????2.4GHZ????????????
  205.         SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);         //???y????????????????????32???
  206.         SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F);                           //???÷????????2MHZ?????书???????0dB
  207.         SPI_WR_Reg(WRITE_REG + CONFIG, 0x0F);
  208.         CE = 1;
  209.         Delay_n10us(20); //200us
  210. }
  211. //----------------------------------------------
  212. //??????unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  213. //????????????????rx_buf???????????
  214. //----------------------------------------------
  215. uchar nRF24L01_RxPacket(unsigned char* rx_buf)
  216. {
  217.     uchar flag=0;
  218.     uchar status;
  219.          
  220.         status=SPI_RD_Reg(NRFRegSTATUS);        //?????????????ж???????????
  221.         
  222.         if(status & 0x40)                                        //?ж????????????
  223.         {
  224.                    CE=0;                         //SPI???
  225.                  SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);        // read receive payload from RX_FIFO buffer
  226.                  flag =1;                                                                                        //????????????
  227.         }
  228.         SPI_WR_Reg(WRITE_REG+NRFRegSTATUS, status);                           //??????????RX_DR,TX_DS,MAX_RT??????1?????д1??????ж???
  229.         return flag;
  230. }
  231. //----------------------------------------------
  232. //??????void TX_Mode(void)
  233. //????????????????
  234. //----------------------------------------------
  235. void TX_Mode(void)
  236. {
  237.     CE = 0;
  238.         
  239.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // д??????        
  240.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // д???????
  241.         SPI_WR_Reg(WRITE_REG + EN_AA, 0x01);                                              //  ???0???        ACK???????        
  242.         SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01);                                          //  ???????????????0?????????????????ο?Page21  
  243.         SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a);                                         // ???????????????????500us + 86us, 10 retrans...
  244.         SPI_WR_Reg(WRITE_REG + RF_CH, 0x40);                                                        //   ????????????2.4GHZ????????????
  245.         SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);                                 //???y????????????????????32???
  246.         SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F);                                                   //???÷????????2MHZ?????书???????0dB            
  247.         SPI_WR_Reg(WRITE_REG + CONFIG, 0x0E);                                                        // CRC????16λCRCУ?飬???
  248.     CE = 1;
  249. }
  250. //----------------------------------------------
  251. //??????void nRF24L01_TxPacket(unsigned char * tx_buf)
  252. //?????????tx_buf??????
  253. //----------------------------------------------
  254. void nRF24L01_TxPacket(unsigned char * tx_buf)
  255. {
  256.         CE = 0;                        //StandBy I??        
  257.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // ?????????
  258.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // ???????        
  259.         CE = 1;                 //???CE?????????????
  260. }


  261. void delay10ms(void)                        //?????????10ms
  262. {
  263.         uchar x,y;
  264.         for(x=0;x<100;x++)
  265.         for(y=0;y<100;y++)
  266.             ;
  267. }
  268. //??????
  269. void main()                                          
  270. {               
  271.          LED=1;                                    //????????            
  272.          init_NRF24L01();                //?????         
  273.          Tx_Buf[0]=0;  
  274.          while(1)
  275.          {
  276.              P1=0xff;
  277.            if((P1&0x0f)!=0x0f)                   //????м?????
  278.             {
  279.                    delay10ms();                  //???10ms??????
  280.                    if(S1==0)                      //????1??????
  281.                    {
  282.                           TX_Mode();                                                 //??????
  283.                         Tx_Buf[0]=0x01;                                                                        
  284.                         nRF24L01_TxPacket(Tx_Buf);                //????????????24L01
  285.                         LED=0;
  286.                         delay10ms();
  287.                         LED=1;
  288.                         delay10ms();                                        //?????LED1?????
  289.                     }
  290.                    if(S2==0)                      //????2??????
  291.                 {
  292.                           TX_Mode();                                                 //??????
  293.                         Tx_Buf[0]=0x01;                                                                        
  294.                         nRF24L01_TxPacket(Tx_Buf);                //????????????24L01
  295.                         LED=0;
  296.                         delay10ms();
  297.                         LED=1;
  298.                         delay10ms();                                        //?????LED1?????
  299.                 }
  300.              }
  301. <div>      }</div><div>}
  302. </div>
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:648281 发表于 2020-4-21 18:14 | 只看该作者
你好!
NRF24L01 调试本身就比较麻烦;
模块正常运行配置的参数有点多;
所以在调试的时候,要有点耐心;
程序应该你从网上找的吧;
逐段去理解分析吧。
回复

使用道具 举报

板凳
ID:711402 发表于 2020-4-24 09:27 | 只看该作者
本帖最后由 Julia123 于 2020-4-24 13:27 编辑

接收方可以接到数据了,可是为什么要发送方按好几次按键接收方的灯才会亮呢   有时候又按好多下也亮不了  是会丢失数据吗
回复

使用道具 举报

地板
ID:282850 发表于 2020-4-24 16:57 | 只看该作者
丢失数据是可能的,但据你描述,估计RX端处理LED的程序不一定正确,试理一下思路。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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