A. NRF24L01收發程序
我一般只判斷RX_DR,IRQ一般可以用在無線喚醒中,建議你在網上搜索 免費單片機教程及學習 裡面都是很全的程序
B. 求51單片機nRF24L01+無線模塊的程序,收和發的,要能用的啊,謝謝了
#include"NRF24L01.h"
//==========================================================================
//TX_ADDRESS[TX_ADR_WIDTH]//本地地址
//RX_ADDRESS[RX_ADR_WIDTH]//接收地址
//==========================================================================
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};
//==========================================================================
//
//bdata sta狀態標志
//
//==========================================================================
uint bdata sta;
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
//==========================================================================
//函數功能: 延時1ms的時間
//函數變數: int s,int i;
//函數介面: Delay();
//函數說明: 延時 i*s的時間
//==========================================================================
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
//==========================================================================
//函數功能: 延時1us的時間
//函數變數: char n;
//函數介面: inerDelay_us();
//函數說明: 延時n的時間
//==========================================================================
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
//==========================================================================
//
//NRF24L01初始化
//
//==========================================================================
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //寫本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//寫接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);//頻道0自動 ACK應答允許
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);//允許接收地址只有頻道0,如果需要多頻道可以參考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); //設置信道工作為2.4GHZ,收發必須一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);//設置接收數據長度,本次設置為20位元組
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //設置發射速率為1MHZ,發射功率為最大值0dB
}
//===========================================================================
//
//函數功能: NRF24L01的SPI寫時序
//函數介面: uint SPI_RW(uint uchar)
//
//===========================================================================
uint SPI_RW(uint uchar)
{
uint bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI
uchar = (uchar << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
uchar |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(uchar); // return read uchar
}
//===========================================================================
//
//函數功能: NRF24L01的SPI時序
//函數介面: uchar SPI_Read(uchar reg)
//
//===========================================================================
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN = 0; // CSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication
return(reg_val); // return register value
}
//==========================================================================
//
//函數功能: NRF24L01讀寫寄存器函數
//
//==========================================================================
uint SPI_RW_Reg(uchar reg, uchar value)
{
uint status;
CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again
return(status); // return nRF24L01 status uchar
}
//===========================================================================
//
//函數功能: 用於讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數
//函數介面: uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
//
//===========================================================================
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status uchar
for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); //
CSN = 1;
return(status); // return nRF24L01 status uchar
}
//===========================================================================
//
//函數功能: 用於寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
//函數介面: uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
//
//===========================================================================
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0; //SPI使能
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
SPI_RW(*pBuf++);
CSN = 1; //關閉SPI
return(status); //
}
//===========================================================================
//
//函數功能: 數據接收配置
//函數介面: void SetRX_Mode(void)
//
//===========================================================================
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收發完成中斷響應,16位CRC ,主接收
CE = 1;
inerDelay_us(130);
}
//===========================================================================
//
//函數功能: 數據讀取後放如rx_buf接收緩沖區中
//函數介面: unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
//
//===========================================================================
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
if(RX_DR) // 判斷是否接收到數據
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //讀取數據完成標志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到數據後RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志
return revale;
}
//==========================================================================
//
//函數功能: 發送 tx_buf中數據
//函數介面: void nRF24L01_TxPacket(unsigned char * tx_buf)
//
//==========================================================================
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0; //StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 裝載數據
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收發完成中斷響應,16位CRC,主發送
CE=1; //置高CE,激發數據發送
inerDelay_us(10);
}
//程序功能:實現對NRF24L01進行數據發送接收測試
//硬體電路:普中科技開發板+NRF24L01
//IO口接法:
// MCU型號STC89C52RC / NEF24L01
// MCU電源+5V / 晶振頻率:12Mhz
// 微分復位:10K電阻/10uF電解電容
// ^|^ ^|^
// IRQ >|P1^0 P0^0| NRF24L01管腳接法
// MOSI >|P1^1 P0^1| 1|GND 3.3V|2
// CSN >|P1^2 P0^2| 3|CE CSN|4
// |P1^3 P0^3| 5|SCK MOSI|6
// |P1^4 P0^4| 7|MISO IRQ|8
// MISO >|P1^5 P0^5|
// SCK >|P1^6 P0^6|
// CE >|P1^7 P0^7|
//=======================================================================
//參數:調用reg52.h頭文件庫函數
// 聲明要使用NRF24L01C程序
//=======================================================================
#include<reg52.h>
#include"NRF24L01.h"
//=======================================================================
//主函數:執行語句
//==============================================================================================
//************************************主函數************************************************************
void main(void)
{
unsigned char tf =0; //定義變數tf初值為0
unsigned char TxBuf[20]={0}; //定義TxBuf[20]={0}
unsigned char RxBuf[20]={0}; //定義RxBuf[20]={0}
init_NRF24L01() ; //初始化NRF24L01
TxBuf[1] = 1 ; //聲明TxBuf[1] = 1
TxBuf[2] = 1 ; //TxBuf[2] = 1
nRF24L01_TxPacket(TxBuf); //發送 tx_buf中數據
Delay(6000); //延時六秒
while(1)
{
TxBuf[1] = 1 ;
tf = 1 ;
if (tf==1)
{
nRF24L01_TxPacket(TxBuf);//發送 tx_buf中數據
TxBuf[1] = 0x00;
TxBuf[2] = 0x00;
tf=0;
Delay(5000);
P0=0xf0;
}
//==================================================================
/* SetRX_Mode(); //數據接收配置
nRF24L01_RxPacket(RxBuf); //數據讀取後放如rx_buf接收緩沖區中
if( RxBuf[1]==1)
{
P0=0xff;
}
Delay(5000);
P0=0xff;
RxBuf[1] = 0x00;
RxBuf[2] = 0x00;*/
}
}
C. nRF24L01發送數據長度以及收發問題
這個是純發送數據,最長32位。地址和CRC是發送方自動添加,接收方自動去除,截取純數據保存到內部寄存器,接收方的單片機只要讀取該寄存器即可,該寄存器的長度是32位。其中地址可以通過NRF的寄存器修改;CRC只能通過NRF的寄存器設置是8位還是16位,不能設置具體能容。
D. 麻煩您把用單片機控制NRF24L01無線模塊發送和接收,也就是「收發一體」的程序給我可以嗎
這個程序是我親手調試成功的,希望可以幫助到你。這個會了,其他復雜的也就不怎麼復雜了。
#include <reg52.h>#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
/************************************NRF24L01埠定義***********************************/
sbit MISO =P2^0; //數字輸出(從 SPI 數據輸出腳)
sbit MOSI =P2^1; //數字輸入(從 SPI 數據輸入腳)
sbit SCK =P2^2; //數字輸入(SPI 時鍾)
sbit CE =P2^3; //數字輸入(RX 或 TX 模式選擇)
sbit CSN =P2^4; //數字輸入(SPI片選信號)
sbit IRQ =P2^5; //數字輸入(可屏蔽中斷)
/************************************按鍵***********************************************/
sbit KEY1=P3^1;//按鍵S1
sbit KEY2=P3^2;//按鍵S2
/************************************數碼管位選******************************************/
sbit led1=P1^0; //LED0
sbit led2=P1^1; //LED1
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH 1 // 5 uints TX address width
#define RX_ADR_WIDTH 1 // 5 uints RX address width
#define TX_PLOAD_WIDTH 20 // 20 uints TX payload
#define RX_PLOAD_WIDTH 20 // 20 uints TX payload
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34};//,0x43,0x10,0x10,0x01}; //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34};//,0x43,0x10,0x10,0x01}; //接收地址
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG 0x00 // 讀寄存器指令
#define WRITE_REG 0x20 // 寫寄存器指令
#define RD_RX_PLOAD 0x61 // 讀取接收數據指令
#define WR_TX_PLOAD 0xA0 // 寫待發數據指令
#define FLUSH_TX 0xE1 // 沖洗發送 FIFO指令
#define FLUSH_RX 0xE2 // 沖洗接收 FIFO指令
#define REUSE_TX_PL 0xE3 // 定義重復裝載數據指令
#define NOP 0xFF // 保留
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG 0x00 // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
#define EN_AA 0x01 // 自動應答功能設置
#define EN_RXADDR 0x02 // 可用信道設置
#define SETUP_AW 0x03 // 收發地址寬度設置
#define SETUP_RETR 0x04 // 自動重發功能設置
#define RF_CH 0x05 // 工作頻率設置
#define RF_SETUP 0x06 // 發射速率、功耗功能設置
#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接收數據長度
#define RX_PW_P1 0x12 // 接收頻道1接收數據長度
#define RX_PW_P2 0x13 // 接收頻道2接收數據長度
#define RX_PW_P3 0x14 // 接收頻道3接收數據長度
#define RX_PW_P4 0x15 // 接收頻道4接收數據長度
#define RX_PW_P5 0x16 // 接收頻道5接收數據長度
#define FIFO_STATUS 0x17 // FIFO棧入棧出狀態寄存器設置
//**************************************************************************************
void Delay(unsigned int s);
void inerDelay_us(unsigned char n);
void init_NRF24L01(void);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
void SetRX_Mode(void);
uint SPI_RW_Reg(uchar reg, uchar value);
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
//*****************************************長延時*****************************************
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
//******************************************************************************************
uint bdata sta; //狀態標志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/******************************************************************************************
/*延時函數
/******************************************************************************************/
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; //
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 寫本地地址
SPI_Write_Buf(WRITE_REG/*寫寄存器指令*/ + RX_ADDR_P0/*接收頻道0接收數據長度*/, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 頻道0自動 ACK應答允許
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 設置信道工作為2.4GHZ,收發必須一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH/*20*/); //設置接收數據長度,本次設置為32位元組
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //設置發射速率為1MHZ,發射功率為最大值0dB
}
/****************************************************************************************************
/*函數:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI寫時序
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
uint bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI
uchar = (uchar << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
uchar |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(uchar); // return read uchar
}
/****************************************************************************************************
/*函數:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI時序
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN = 0; // CSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication
return(reg_val); // return register value
}
/****************************************************************************************************/
/*功能:NRF24L01讀寫寄存器函數
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
uint status;
CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again
return(status); // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用於讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數
/****************************************************************************************************/
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status uchar
for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); //
CSN = 1;
return(status); // return nRF24L01 status uchar
}
/*********************************************************************************************************
/*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用於寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
/*********************************************************************************************************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0; //SPI使能
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
SPI_RW(*pBuf++);
CSN = 1; //關閉SPI
return(status); //
}
/****************************************************************************************************/
/*函數:void SetRX_Mode(void)
/*功能:數據接收配置
/****************************************************************************************************/
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收發完成中斷響應,16位CRC ,主接收
CE = 1;
inerDelay_us(130);
}
/******************************************************************************************************/
/*函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:數據讀取後放如rx_buf接收緩沖區中
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)//定義了一個指針//
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
if(RX_DR) // 判斷是否接收到數據
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //讀取數據完成標志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到數據後RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志
return revale;
}
/***********************************************************************************************************
/*函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:發送 tx_buf中數據
/**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)//定義了一個指針//
{
CE=0; //StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 裝載數據
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收發完成中斷響應,16位CRC,主發送
CE=1; //置高CE,激發數據發送
inerDelay_us(10);
}
//************************************主函數************************************************************
void main(void)
{
unsigned char tf =0; //定義的狀態變數//
unsigned char TxBuf[20]={0}; // 20個狀態//
unsigned char RxBuf[20]={0}; // 20個狀態//
init_NRF24L01() ; //24L01初始化//
led1=1;led2=1; //關燈//
TxBuf[1] = 1 ;
TxBuf[2] = 1 ;
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data 發送數據//
Delay(6000);
while(1)
{
if(KEY1 ==0 )
{
TxBuf[1] = 15 ;
tf = 1 ;
led1=0;
Delay(120);
led1=1;
Delay(120);
}
if(KEY2 ==0 )
{
TxBuf[2] =1 ;
tf = 1 ;
led2=0;
Delay(120);
led2=1;
Delay(120);
}
if (tf==1)
{
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
TxBuf[1] = 0x00;
TxBuf[2] = 0x00;
tf=0;
Delay(1000);
}
SetRX_Mode();
RxBuf[1] = 0x00;
RxBuf[2] = 0x00;
Delay(1000);
nRF24L01_RxPacket(RxBuf);
if(RxBuf[1]|RxBuf[2])
{
if( RxBuf[1]==15)
{
led1=0;
}
if( RxBuf[2]==1)
{
led2=0;
}
Delay(6000); //old is '1000'
}
RxBuf[1] = 0x00;
RxBuf[2] = 0x00;
led1=1;
led2=1;
}
}