我的NRF24L01模塊調試發現IRQ接收總是有快有慢,導致數據接收不及時。接收到的數據都是正確的。下面看波形圖:
放大波形看,要等上一組數據接收完即IRQ腳產生接收完成中斷,才能接收下一組數據
下面是代碼
- #include "NRF24L01_Drive.h"
- u8 code TX_ADDRESS[ADR_WIDTH]={0X34,0X43,0X10,0X10,0X01};
- u8 idata NRF24L01_RX_Buffer[DATA_WIDTH];
- u8 idata NRF24L01_TX_Buffer[DATA_WIDTH];
- u8 NRF24L01_SPI_Drive(u8 dat) //一個字節的發送并讀取
- {
- u8 i;
- for(i=0; i<8; i++)
- {
- NRF24L01_MOSI=1;
- NRF24L01_MOSI=dat&0x80; //MOSI發送到無線模塊
- dat<<=1;
- NRF24L01_SCK=1;
- dat|=NRF24L01_MISO; //MISO讀取信號給單片機
- NRF24L01_SCK=0;
- }
- return dat;
- }
- u8 NRF24L01_Write_Read_Reg_Drive(u8 Reg, u8 Value) //寫或者讀一個寄存器
- {
- u8 Result;
- NRF24L01_CSN=0;
- Result=NRF24L01_SPI_Drive(Reg);
- NRF24L01_SPI_Drive(Value);
- NRF24L01_CSN=1;
- return Result;
- }
- u8 NRF24L01_Read_Buffer_Drive(u8 Reg, u8 *pBuf, u8 len)
- {
- u8 Result,k;
- NRF24L01_CSN=0;
- Result=NRF24L01_SPI_Drive(Reg);
- for(k=0; k<len; k++)
- {
- pBuf[k]=NRF24L01_SPI_Drive(NOP);
- }
- NRF24L01_CSN=1;
- return Result;
- }
- u8 NRF24L01_Write_Buffer_Drive(u8 Reg, u8 *pBuf, u8 len)
- {
- u8 Result,k;
- NRF24L01_CSN=0;
- Result=NRF24L01_SPI_Drive(Reg);
- for(k=0; k<len; k++)
- {
- NRF24L01_SPI_Drive(*pBuf++);
- }
- NRF24L01_CSN=1;
- return Result;
- }
- void NRF24L01_Init(u8 Mode)
- {
- NRF24L01_CSN=1;
- NRF24L01_SCK=0;
- NRF24L01_CE=0; //進入待機模式才能配置寄存器
- NRF24L01_Write_Buffer_Drive(0x20+TX_ADDR, TX_ADDRESS, ADR_WIDTH); //發送地址
- NRF24L01_Write_Buffer_Drive(0x20+RX_ADDR_P0, TX_ADDRESS, ADR_WIDTH);//接收數據通道0
- NRF24L01_Write_Read_Reg_Drive(0x20+RX_PW_P0, DATA_WIDTH); //接收數據通道0有效數據寬度
- NRF24L01_Write_Read_Reg_Drive(0x20+EN_AA, 0x01); //允許通道0自動應答
- NRF24L01_Write_Read_Reg_Drive(0x20+EN_RXADDR, 0x01); //允許通道0接收數據
- NRF24L01_Write_Read_Reg_Drive(0x20+SETUP_RETR, 0x12); //自動重發延時及等待
- NRF24L01_Write_Read_Reg_Drive(0x20+RF_CH, 40); //頻率
- NRF24L01_Write_Read_Reg_Drive(0x20+RF_SETUP, 0x0f); //設置速率和輸出功率
- NRF24L01_Write_Read_Reg_Drive(0x20+CONFIG, Mode); //允許中斷并選擇收發模式
- NRF24L01_CE=1;
- }
- u8 NRF24L01_RX_Data_Ser()
- {
- static u16 count;
- u8 status;
- status= NRF24L01_Write_Read_Reg_Drive(STATUS, 0);
- if(status & RX_DR)
- {
- NRF24L01_CE=0;
- NRF24L01_Read_Buffer_Drive(RD_RX_PLOAD,NRF24L01_RX_Buffer,DATA_WIDTH);
- NRF24L01_Write_Read_Reg_Drive(FLUSH_RX, 0xff);
- NRF24L01_Write_Read_Reg_Drive(0x20+STATUS, status);
- NRF24L01_CE=1;
- }
- else
- {
- count++;
- if(count>500)
- {
- count=0;
- return 0xff;
- }
- }
- return status;
- }
復制代碼- #ifndef NRF24L01_Drive
- #define NRF24L01_Drive
- #include "STC15.h"
- /********** NRF24L01寄存器操作命令 **********************************************/
- #define READ_REG 0x00 //讀配置寄存器,低5位為寄存器地址
- #define WRITE_REG 0x20 //寫配置寄存器,低5位為寄存器地址
- #define RD_RX_PLOAD 0x61 //讀RX有效數據,1~32字節
- #define WR_TX_PLOAD 0xA0 //寫TX有效數據,1~32字節
- #define FLUSH_TX 0xE1 //清除TX FIFO寄存器.發射模式下用
- #define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
- #define REUSE_TX_PL 0xE3 //重新使用上一包數據,P_24L01_CE為高,數據包被不斷發送.
- #define NOP 0xFF //空操作,可以用來讀狀態寄存器
- /********** NRF24L01寄存器地址 **************************************************/
- #define CONFIG 0x00 //配置寄存器地址
- #define EN_AA 0x01 //使能自動應答功能
- #define EN_RXADDR 0x02 //接收地址允許
- #define SETUP_AW 0x03 //設置地址寬度(所有數據通道)
- #define SETUP_RETR 0x04 //建立自動重發
- #define RF_CH 0x05 //RF通道
- #define RF_SETUP 0x06 //RF寄存器
- #define STATUS 0x07 //狀態寄存器
- #define OBSERVE_TX 0x08 // 發送檢測寄存器
- #define CD 0x09 // 載波檢測寄存器
- #define RX_ADDR_P0 0x0A // 數據通道0接收地址
- #define RX_ADDR_P1 0x0B // 數據通道1接收地址
- #define RX_ADDR_P2 0x0C // 數據通道2接收地址
- #define RX_ADDR_P3 0x0D // 數據通道3接收地址
- #define RX_ADDR_P4 0x0E // 數據通道4接收地址
- #define RX_ADDR_P5 0x0F // 數據通道5接收地址
- #define TX_ADDR 0x10 // 發送地址寄存器
- #define RX_PW_P0 0x11 // 接收數據通道0有效數據寬度(1~32字節)
- #define RX_PW_P1 0x12 // 接收數據通道1有效數據寬度(1~32字節)
- #define RX_PW_P2 0x13 // 接收數據通道2有效數據寬度(1~32字節)
- #define RX_PW_P3 0x14 // 接收數據通道3有效數據寬度(1~32字節)
- #define RX_PW_P4 0x15 // 接收數據通道4有效數據寬度(1~32字節)
- #define RX_PW_P5 0x16 // 接收數據通道5有效數據寬度(1~32字節)
- #define FIFO_STATUS 0x17 // FIFO狀態寄存器
- #define FLUSH_TX 0xE1
- #define FLUSH_RX 0xE2
- #define RX_DR 0x40
- #define TX_DS 0x20
- #define MAX_RT 0x10
- sbit NRF24L01_CSN =P1^2;
- sbit NRF24L01_CE =P5^3;
- sbit NRF24L01_MOSI=P1^3;
- sbit NRF24L01_SCK =P1^5;
- sbit NRF24L01_IRQ =P5^2;
- sbit NRF24L01_MISO=P1^4;
- #define ADR_WIDTH 5
- #define DATA_WIDTH 32
- #define NRF24L01_TX_Mode 0x0e
- #define NRF24L01_RX_Mode 0x0f
- extern u8 idata NRF24L01_RX_Buffer[DATA_WIDTH];
- extern u8 idata NRF24L01_TX_Buffer[DATA_WIDTH];
- extern void NRF24L01_Init(u8 Mode);
- //extern void NRF24L01_TX_Data_Ser();
- extern u8 NRF24L01_RX_Data_Ser();
- //extern void NRF24L01_Delete_Ser();
- #endif
復制代碼 main函數就初始化之后循環調用NRF24L01_RX_Data_Ser();
調試了很久,大佬幫我看看是哪里的問題。
|