久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2520|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中日av | 日韩精品一区二区三区中文字幕 | 黄色免费在线网址 | 免费观看成人鲁鲁鲁鲁鲁视频 | 久久极品 | 一区二区三区国产好 | 97精品久久 | 亚洲女优在线播放 | 国产在线精品一区二区三区 | 午夜99 | 久久99精品久久久久久琪琪 | 久久久国产一区二区三区四区小说 | 日韩视频免费在线 | 国产情品| 久久亚洲一区 | 欧美一区久久 | 亚洲精品欧美一区二区三区 | 国产欧美精品一区二区三区 | 99视频在线免费观看 | 中文字幕精 | 97精品超碰一区二区三区 | 91精品国产91久久久久久不卞 | 在线观看av网站永久 | .国产精品成人自产拍在线观看6 | 欧美日韩在线观看一区 | 一区二区三区在线免费观看 | 在线啊v | 一区二区视频在线 | 91视视频在线观看入口直接观看 | 国产视频久久久 | 国产乱码精品一区二区三区五月婷 | 国产精品亚洲一区 | 97超在线视频 | 欧美在线观看一区二区 | 四虎影院在线播放 | 91资源在线 | av电影一区二区 | 精品国产18久久久久久二百 | 在线免费激情视频 | 国产一区二区三区四区 | 久久av一区二区 |