|
我的NRF24L01模塊調(diào)試發(fā)現(xiàn)IRQ接收總是有快有慢,導(dǎo)致數(shù)據(jù)接收不及時(shí)。接收到的數(shù)據(jù)都是正確的。下面看波形圖:
放大波形看,要等上一組數(shù)據(jù)接收完即IRQ腳產(chǎn)生接收完成中斷,才能接收下一組數(shù)據(jù)
下面是代碼
- #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) //一個(gè)字節(jié)的發(fā)送并讀取
- {
- u8 i;
- for(i=0; i<8; i++)
- {
- NRF24L01_MOSI=1;
- NRF24L01_MOSI=dat&0x80; //MOSI發(fā)送到無(wú)線(xiàn)模塊
- dat<<=1;
- NRF24L01_SCK=1;
- dat|=NRF24L01_MISO; //MISO讀取信號(hào)給單片機(jī)
- NRF24L01_SCK=0;
- }
- return dat;
- }
- u8 NRF24L01_Write_Read_Reg_Drive(u8 Reg, u8 Value) //寫(xiě)或者讀一個(gè)寄存器
- {
- 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; //進(jìn)入待機(jī)模式才能配置寄存器
- NRF24L01_Write_Buffer_Drive(0x20+TX_ADDR, TX_ADDRESS, ADR_WIDTH); //發(fā)送地址
- NRF24L01_Write_Buffer_Drive(0x20+RX_ADDR_P0, TX_ADDRESS, ADR_WIDTH);//接收數(shù)據(jù)通道0
- NRF24L01_Write_Read_Reg_Drive(0x20+RX_PW_P0, DATA_WIDTH); //接收數(shù)據(jù)通道0有效數(shù)據(jù)寬度
- NRF24L01_Write_Read_Reg_Drive(0x20+EN_AA, 0x01); //允許通道0自動(dòng)應(yīng)答
- NRF24L01_Write_Read_Reg_Drive(0x20+EN_RXADDR, 0x01); //允許通道0接收數(shù)據(jù)
- NRF24L01_Write_Read_Reg_Drive(0x20+SETUP_RETR, 0x12); //自動(dòng)重發(fā)延時(shí)及等待
- NRF24L01_Write_Read_Reg_Drive(0x20+RF_CH, 40); //頻率
- NRF24L01_Write_Read_Reg_Drive(0x20+RF_SETUP, 0x0f); //設(shè)置速率和輸出功率
- NRF24L01_Write_Read_Reg_Drive(0x20+CONFIG, Mode); //允許中斷并選擇收發(fā)模式
- 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;
- }
復(fù)制代碼- #ifndef NRF24L01_Drive
- #define NRF24L01_Drive
- #include "STC15.h"
- /********** NRF24L01寄存器操作命令 **********************************************/
- #define READ_REG 0x00 //讀配置寄存器,低5位為寄存器地址
- #define WRITE_REG 0x20 //寫(xiě)配置寄存器,低5位為寄存器地址
- #define RD_RX_PLOAD 0x61 //讀RX有效數(shù)據(jù),1~32字節(jié)
- #define WR_TX_PLOAD 0xA0 //寫(xiě)TX有效數(shù)據(jù),1~32字節(jié)
- #define FLUSH_TX 0xE1 //清除TX FIFO寄存器.發(fā)射模式下用
- #define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
- #define REUSE_TX_PL 0xE3 //重新使用上一包數(shù)據(jù),P_24L01_CE為高,數(shù)據(jù)包被不斷發(fā)送.
- #define NOP 0xFF //空操作,可以用來(lái)讀狀態(tài)寄存器
- /********** NRF24L01寄存器地址 **************************************************/
- #define CONFIG 0x00 //配置寄存器地址
- #define EN_AA 0x01 //使能自動(dòng)應(yīng)答功能
- #define EN_RXADDR 0x02 //接收地址允許
- #define SETUP_AW 0x03 //設(shè)置地址寬度(所有數(shù)據(jù)通道)
- #define SETUP_RETR 0x04 //建立自動(dòng)重發(fā)
- #define RF_CH 0x05 //RF通道
- #define RF_SETUP 0x06 //RF寄存器
- #define STATUS 0x07 //狀態(tài)寄存器
- #define OBSERVE_TX 0x08 // 發(fā)送檢測(cè)寄存器
- #define CD 0x09 // 載波檢測(cè)寄存器
- #define RX_ADDR_P0 0x0A // 數(shù)據(jù)通道0接收地址
- #define RX_ADDR_P1 0x0B // 數(shù)據(jù)通道1接收地址
- #define RX_ADDR_P2 0x0C // 數(shù)據(jù)通道2接收地址
- #define RX_ADDR_P3 0x0D // 數(shù)據(jù)通道3接收地址
- #define RX_ADDR_P4 0x0E // 數(shù)據(jù)通道4接收地址
- #define RX_ADDR_P5 0x0F // 數(shù)據(jù)通道5接收地址
- #define TX_ADDR 0x10 // 發(fā)送地址寄存器
- #define RX_PW_P0 0x11 // 接收數(shù)據(jù)通道0有效數(shù)據(jù)寬度(1~32字節(jié))
- #define RX_PW_P1 0x12 // 接收數(shù)據(jù)通道1有效數(shù)據(jù)寬度(1~32字節(jié))
- #define RX_PW_P2 0x13 // 接收數(shù)據(jù)通道2有效數(shù)據(jù)寬度(1~32字節(jié))
- #define RX_PW_P3 0x14 // 接收數(shù)據(jù)通道3有效數(shù)據(jù)寬度(1~32字節(jié))
- #define RX_PW_P4 0x15 // 接收數(shù)據(jù)通道4有效數(shù)據(jù)寬度(1~32字節(jié))
- #define RX_PW_P5 0x16 // 接收數(shù)據(jù)通道5有效數(shù)據(jù)寬度(1~32字節(jié))
- #define FIFO_STATUS 0x17 // FIFO狀態(tài)寄存器
- #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
復(fù)制代碼 main函數(shù)就初始化之后循環(huán)調(diào)用NRF24L01_RX_Data_Ser();
調(diào)試了很久,大佬幫我看看是哪里的問(wèn)題。
|
|