我的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();
调试了很久,大佬帮我看看是哪里的问题。
|