找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1953|回复: 1
收起左侧

NRF24L01数据接收不及时

[复制链接]
ID:675145 发表于 2020-8-26 08:22 | 显示全部楼层 |阅读模式
我的NRF24L01模块调试发现IRQ接收总是有快有慢,导致数据接收不及时。接收到的数据都是正确的。下面看波形图: 1598347874(1).jpg

放大波形看,要等上一组数据接收完即IRQ脚产生接收完成中断,才能接收下一组数据
1598347941(1).jpg

下面是代码
  1. #include "NRF24L01_Drive.h"

  2. u8 code TX_ADDRESS[ADR_WIDTH]={0X34,0X43,0X10,0X10,0X01};
  3. u8 idata NRF24L01_RX_Buffer[DATA_WIDTH];
  4. u8 idata NRF24L01_TX_Buffer[DATA_WIDTH];
  5. u8 NRF24L01_SPI_Drive(u8 dat)        //一个字节的发送并读取
  6. {
  7.         u8 i;
  8.         for(i=0; i<8; i++)
  9.         {
  10.                 NRF24L01_MOSI=1;
  11.                 NRF24L01_MOSI=dat&0x80; //MOSI发送到无线模块
  12.                 dat<<=1;
  13.                 NRF24L01_SCK=1;
  14.                 dat|=NRF24L01_MISO;                //MISO读取信号给单片机
  15.                 NRF24L01_SCK=0;
  16.         }
  17.         return dat;
  18. }
  19. u8 NRF24L01_Write_Read_Reg_Drive(u8 Reg, u8 Value)        //写或者读一个寄存器
  20. {
  21.         u8 Result;
  22.         NRF24L01_CSN=0;
  23.         Result=NRF24L01_SPI_Drive(Reg);
  24.         NRF24L01_SPI_Drive(Value);
  25.         NRF24L01_CSN=1;
  26.         return Result;
  27. }
  28. u8 NRF24L01_Read_Buffer_Drive(u8 Reg, u8 *pBuf, u8 len)
  29. {
  30.         u8 Result,k;
  31.         NRF24L01_CSN=0;
  32.         Result=NRF24L01_SPI_Drive(Reg);
  33.         for(k=0; k<len; k++)
  34.         {
  35.                 pBuf[k]=NRF24L01_SPI_Drive(NOP);
  36.         }
  37.         NRF24L01_CSN=1;
  38.         return Result;
  39. }
  40. u8 NRF24L01_Write_Buffer_Drive(u8 Reg, u8 *pBuf, u8 len)
  41. {
  42.         u8 Result,k;
  43.         NRF24L01_CSN=0;
  44.         Result=NRF24L01_SPI_Drive(Reg);
  45.         for(k=0; k<len; k++)
  46.         {
  47.                 NRF24L01_SPI_Drive(*pBuf++);
  48.         }
  49.         NRF24L01_CSN=1;
  50.         return Result;
  51. }
  52. void NRF24L01_Init(u8 Mode)
  53. {
  54.         NRF24L01_CSN=1;
  55.         NRF24L01_SCK=0;
  56.         NRF24L01_CE=0;        //进入待机模式才能配置寄存器
  57.         NRF24L01_Write_Buffer_Drive(0x20+TX_ADDR, TX_ADDRESS, ADR_WIDTH);        //发送地址
  58.         NRF24L01_Write_Buffer_Drive(0x20+RX_ADDR_P0, TX_ADDRESS, ADR_WIDTH);//接收数据通道0
  59.         NRF24L01_Write_Read_Reg_Drive(0x20+RX_PW_P0, DATA_WIDTH);        //接收数据通道0有效数据宽度
  60.         NRF24L01_Write_Read_Reg_Drive(0x20+EN_AA, 0x01);                        //允许通道0自动应答
  61.         NRF24L01_Write_Read_Reg_Drive(0x20+EN_RXADDR, 0x01);                //允许通道0接收数据
  62.         NRF24L01_Write_Read_Reg_Drive(0x20+SETUP_RETR, 0x12);                //自动重发延时及等待
  63.         NRF24L01_Write_Read_Reg_Drive(0x20+RF_CH, 40);                                //频率
  64.         NRF24L01_Write_Read_Reg_Drive(0x20+RF_SETUP, 0x0f);                        //设置速率和输出功率
  65.         NRF24L01_Write_Read_Reg_Drive(0x20+CONFIG, Mode);                        //允许中断并选择收发模式
  66.         NRF24L01_CE=1;
  67. }
  68. u8 NRF24L01_RX_Data_Ser()
  69. {
  70.         static u16 count;
  71.         u8 status;
  72.         status= NRF24L01_Write_Read_Reg_Drive(STATUS, 0);
  73.         if(status & RX_DR)
  74.         {
  75.                 NRF24L01_CE=0;
  76.                 NRF24L01_Read_Buffer_Drive(RD_RX_PLOAD,NRF24L01_RX_Buffer,DATA_WIDTH);
  77.                 NRF24L01_Write_Read_Reg_Drive(FLUSH_RX, 0xff);
  78.                 NRF24L01_Write_Read_Reg_Drive(0x20+STATUS, status);
  79.                 NRF24L01_CE=1;
  80.         }
  81.         else
  82.         {
  83.                 count++;
  84.                 if(count>500)
  85.                 {
  86.                         count=0;
  87.                         return 0xff;
  88.                 }
  89.         }
  90.         return status;
  91. }
复制代码
  1. #ifndef NRF24L01_Drive
  2. #define NRF24L01_Drive

  3. #include "STC15.h"

  4. /**********  NRF24L01寄存器操作命令  **********************************************/
  5. #define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
  6. #define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
  7. #define RD_RX_PLOAD     0x61          //读RX有效数据,1~32字节
  8. #define WR_TX_PLOAD     0xA0          //写TX有效数据,1~32字节
  9. #define FLUSH_TX        0xE1          //清除TX FIFO寄存器.发射模式下用
  10. #define FLUSH_RX        0xE2          //清除RX FIFO寄存器.接收模式下用
  11. #define REUSE_TX_PL     0xE3          //重新使用上一包数据,P_24L01_CE为高,数据包被不断发送.
  12. #define NOP             0xFF          //空操作,可以用来读状态寄存器         
  13. /**********  NRF24L01寄存器地址   **************************************************/
  14. #define CONFIG          0x00          //配置寄存器地址                             
  15. #define EN_AA           0x01          //使能自动应答功能
  16. #define EN_RXADDR       0x02          //接收地址允许
  17. #define SETUP_AW        0x03          //设置地址宽度(所有数据通道)
  18. #define SETUP_RETR      0x04          //建立自动重发
  19. #define RF_CH           0x05          //RF通道
  20. #define RF_SETUP        0x06          //RF寄存器
  21. #define STATUS          0x07          //状态寄存器
  22. #define OBSERVE_TX      0x08          // 发送检测寄存器
  23. #define CD              0x09          // 载波检测寄存器
  24. #define RX_ADDR_P0      0x0A          // 数据通道0接收地址
  25. #define RX_ADDR_P1      0x0B          // 数据通道1接收地址
  26. #define RX_ADDR_P2      0x0C          // 数据通道2接收地址
  27. #define RX_ADDR_P3      0x0D          // 数据通道3接收地址
  28. #define RX_ADDR_P4      0x0E          // 数据通道4接收地址
  29. #define RX_ADDR_P5      0x0F          // 数据通道5接收地址
  30. #define TX_ADDR         0x10          // 发送地址寄存器
  31. #define RX_PW_P0        0x11          // 接收数据通道0有效数据宽度(1~32字节)
  32. #define RX_PW_P1        0x12          // 接收数据通道1有效数据宽度(1~32字节)
  33. #define RX_PW_P2        0x13          // 接收数据通道2有效数据宽度(1~32字节)
  34. #define RX_PW_P3        0x14          // 接收数据通道3有效数据宽度(1~32字节)
  35. #define RX_PW_P4        0x15          // 接收数据通道4有效数据宽度(1~32字节)
  36. #define RX_PW_P5        0x16          // 接收数据通道5有效数据宽度(1~32字节)
  37. #define FIFO_STATUS     0x17          // FIFO状态寄存器

  38. #define FLUSH_TX                0xE1
  39. #define FLUSH_RX                0xE2  
  40. #define RX_DR                        0x40  
  41. #define TX_DS                        0x20  
  42. #define MAX_RT                        0x10   

  43. sbit NRF24L01_CSN =P1^2;
  44. sbit NRF24L01_CE  =P5^3;
  45. sbit NRF24L01_MOSI=P1^3;
  46. sbit NRF24L01_SCK =P1^5;
  47. sbit NRF24L01_IRQ =P5^2;
  48. sbit NRF24L01_MISO=P1^4;

  49. #define ADR_WIDTH    5
  50. #define DATA_WIDTH   32
  51. #define NRF24L01_TX_Mode 0x0e
  52. #define NRF24L01_RX_Mode 0x0f

  53. extern u8 idata NRF24L01_RX_Buffer[DATA_WIDTH];
  54. extern u8 idata NRF24L01_TX_Buffer[DATA_WIDTH];
  55. extern void NRF24L01_Init(u8 Mode);
  56. //extern void NRF24L01_TX_Data_Ser();
  57. extern u8 NRF24L01_RX_Data_Ser();
  58. //extern void NRF24L01_Delete_Ser();


  59. #endif
复制代码
main函数就初始化之后循环调用NRF24L01_RX_Data_Ser();
调试了很久,大佬帮我看看是哪里的问题。

回复

使用道具 举报

ID:675145 发表于 2020-8-26 10:34 | 显示全部楼层
自己顶一个    有人吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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