NRF24L01无线模块收发程序例程

合集下载

nRF24L01无线通信模块使用手册

nRF24L01无线通信模块使用手册

nRF24L01无线通信模块使用手册一、模块简介该射频模块集成了NORDIC公司生产的无线射频芯片nRF24L01:1.支持2.4GHz的全球开放ISM频段,最大发射功率为0dBm2.2Mbps,传输速率高3.功耗低,等待模式时电流消耗仅22uA4.多频点(125个),满足多点通信及跳频通信需求5.在空旷场地,有效通信距离:25m(外置天线)、10m(PCB天线)6.工作原理简介:发射数据时,首先将nRF24L01配置为发射模式,接着把地址TX_ADDR和数据TX_PLD 按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号。

如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从发送堆栈中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC_CNT)达到上限,MAX_RT置高,TX_PLD不会被清除;MAX_RT或TX_DS置高时,使IRQ变低,以便通知MCU。

最后发射成功时,若CE为低,则nRF24L01进入待机模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入待机模式2。

接收数据时,首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。

当接收方检测到有效的地址和CRC时,就将数据包存储在接收堆栈中,同时中断标志位RX_DR置高,IRQ变低,以便通知MCU去取数据。

若此时自动应答开启,接收方则同时进入发射状态回传应答信号。

最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。

三、模块引脚说明四、模块与AT89S52单片机接口电路注:上图为示意连接,可根据自己实际需求进行更改;使用AT89S52MCU模块时,请将Nrf24L01通讯模块每个端口(MOSI、SCK、CSN和CE)接4.7K的排阻上拉到VCC增强其驱动能力(如下图:)。

nRF24L01无线模块6个接收通道_发送nRF24L01

nRF24L01无线模块6个接收通道_发送nRF24L01

nRF24L01无线模块6个接收通道_发送nRF24L01#include"nRF24L01.h"//uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0xb2,0xb2,0xb3,0xb4,0x01};//uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x02,0xb4,0xb3,0xb2,0xb1};uchar RX_BUF[TX_PLOAD_WIDTH];uchar TX_BUF[TX_PLOAD_WIDTH]={0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,};uchar flag,status;uchar DATA = 0x01;uchar bdata sta;sbit RX_DR = sta^6;sbit TX_DS = sta^5;sbit MAX_RT = sta^4;/**************************************************//**************************************************函数: init_io()描述:初始化IO/**************************************************/ void init_io(void){CE = 0; // 待机CSN = 1; // SPI禁止SCK = 0; // SPI时钟置低IRQ = 1; // 中断复位LED = 0x00; // 关闭指示灯}/**************************************************//************************************************** 函数:delay_ms()描述:延迟x毫秒/**************************************************/ void delay_ms(uchar x){uchar i, j;i = 0;for(i=0; i{j = 250;while(--j);j = 250;while(--j);}}/**************************************************//**************************************************函数:SPI_RW()描述:根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节/**************************************************/uchar SPI_RW(uchar byte){uchar i;for(i=0; i<8; i++) // 循环8次{MOSI = (byte & 0x80); // byte最高位输出到MOSIbyte <<= 1; // 低一位移位到最高位SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据byte |= MISO; // 读MISO到byte最低位SCK = 0; // SCK置低}return(byte); // 返回读出的一字节}/**************************************************//**************************************************函数:SPI_RW_Reg()描述:写数据value到reg寄存器/**************************************************/ uchar SPI_RW_Reg(uchar reg, uchar value){uchar status;CSN = 0; // CSN置低,开始传输数据status = SPI_RW(reg); // 选择寄存器,同时返回状态字SPI_RW(value); // 然后写数据到该寄存器CSN = 1; // CSN拉高,结束数据传输return(status); // 返回状态寄存器}/**************************************************//************************************************** 函数:SPI_Read()描述:从reg寄存器读一字节/**************************************************/uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0; // CSN置低,开始传输数据SPI_RW(reg); // 选择寄存器reg_val = SPI_RW(0); // 然后从该寄存器读数据CSN = 1; // CSN拉高,结束数据传输return(reg_val); // 返回寄存器数据}/**************************************************//**************************************************函数:SPI_Read_Buf()描述:从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址/**************************************************/ uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes) {uchar status, i;CSN = 0; // CSN置低,开始传输数据status = SPI_RW(reg); // 选择寄存器,同时返回状态字for(i=0; ipBuf[i] = SPI_RW(0); // 逐个字节从nRF24L01读出CSN = 1; // CSN拉高,结束数据传输return(status); // 返回状态寄存器}/**************************************************//**************************************************函数:SPI_Write_Buf()描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址/**************************************************/uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes){uchar status, i;CSN = 0; // CSN置低,开始传输数据status = SPI_RW(reg); // 选择寄存器,同时返回状态字for(i=0; iSPI_RW(pBuf[i]); // 逐个字节写入nRF24L01CSN = 1; // CSN拉高,结束数据传输return(status); // 返回状态寄存器}/**************************************************//**************************************************函数:RX_Mode()描述:这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包/**************************************************/void RX_Mode(void){CE = 0;SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址// SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, TX_ADR_WIDTH);// SPI_Write_Buf(WRITE_REG + RX_ADDR_P2, RX_ADDRESS2, TX_ADR_WIDTH);// SPI_RW_Reg(WRITE_REG + RX_PW_P1, TX_PLOAD_WIDTH);SPI_RW_Reg(WRITE_REG + EN_AA, 0x3f); // 使能接收通道0自动应答SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x3f); // 使能接收通道0SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40 SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式CE = 1; // 拉高CE启动接收设备}/**************************************************//**************************************************函数:TX_Mode()描述:这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数据发送结束后,发送模块自动转入接收模式等待应答信号。

NRF24L01收发程序

NRF24L01收发程序

/******* ******** ******** ******** ******** ******** ******** ******** ******** ******* ******** ******** ******/ uchar SPI_Read (uchar reg) { uchar reg_val; CSN = 0; // CSN low, initiali ze SPI communic ation... SPI_RW(r eg); // Select register to read from.. reg_val = SPI_RW(0 ); // ..then read register value
/*NRF24L 01 初始 化 //****** ******** ******** ******** ******** ******** ******** ******** */ void init_NRF 24L01(vo id) { inerDela y_us(100 ); CE=0; // chip enable CSN=1; // Spi disable SCK=0; // SPI_Writ e_Buf(WR ITE_REG + TX_ADDR, TX_ADDRE SS, TX_ASCK high.. uchar |= MISO; // capture current MISO bit SCK = 0; // ..then set SCK low again } return(u char); // return read uchar } /******* ******** ******** ******** ******** ******** ******** ******** ******** ******* ******** ******** ****** /*函数: uchar SPI_Read (uchar reg) /*功能: NRF24L01 的SPI 时 序

无线模块NRF24L01基于C51单片机双向通讯C语言程序(中文详解)

无线模块NRF24L01基于C51单片机双向通讯C语言程序(中文详解)

#include <reg52.h>#include <intrins.h>/********************************************************** *****************************//* NRF24L01 地管脚定义,以及在本程序中地应用,VCC接3.3V 电源,可以通过5V用电压转换芯片/*得到,NC 管脚可以接可以不接,暂时没用途.本程序应用于51或者52单片机,是两个模块进行通讯/*成功地简单指示,现象是:模块1地 KEY1 对应模块1地LED1 和模块2地LED3 ,模块1地 KEY2 对应模/*块1地LED2 和模块2地LED4,发过来也对应./********************************************************** *****************************/typedef unsigned char uchar;typedef unsigned char uint;/************************************NRF24L01端口定义***********************************/sbit NC =P2^0; //没用,不接也可sbit MISO =P2^5; //数字输出(从 SPI 数据输出脚)sbit MOSI =P2^4; //数字输入(从 SPI 数据输入脚)sbit SCK =P1^7; //数字输入(SPI 时钟)sbit CE =P2^1; //数字输入(RX 或 TX 模式选择)sbit CSN =P2^2; //数字输入(SPI片选信号)sbit IRQ =P2^6; //数字输入(可屏蔽中断)/************************************按键***********************************************/sbit KEY1=P3^3;//按键S1sbit KEY2=P3^2;//按键S2/************************************数码管位选******************************************/sbit led1=P1^0; //LED0sbit led2=P1^1; //LED1sbit led3 =P1^2; //LED2sbit led4 =P1^3; //LED3sbit led5 =P1^4; //LED4/*********************************************NRF24L01***********************************/#define TX_ADR_WIDTH 5 // 5 uints TX address width 发送地址宽度#define RX_ADR_WIDTH 5 // 5 uints RX address width 接收地址宽度#define TX_PLOAD_WIDTH 20 // 20 uints TX payload 有效载荷装载货物#define RX_PLOAD_WIDTH 20 // 20 uints TX payloaduint 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 // 接收频道0接收数据长度#define RX_PW_P2 0x13 // 接收频道0接收数据长度#define RX_PW_P3 0x14 // 接收频道0接收数据长度#define RX_PW_P4 0x15 // 接收频道0接收数据长度#define RX_PW_P5 0x16 // 接收频道0接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置/*************************************函数声明****************************************/void Delay(unsigned int s); //大延时void inerDelay_us(unsigned char n); //小延时void init_NRF24L01(void); //NRF24L01 初始化uint SPI_RW(uint dat); //根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节uchar SPI_Read(uchar reg); //从reg寄存器读一字节void SetRX_Mode(void); //数据接收配置uint SPI_RW_Reg(uchar reg, uchar value); //写数据value到reg寄存器uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); //从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //把pBuf缓存中地数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);//数据读取后放入rx_buf接收缓冲区中void nRF24L01_TxPacket(unsigned char * tx_buf);//发送 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; //RX_DR 为 sta 地第六位sbit TX_DS =sta^5; //TX_DS 为 sta 地第五位sbit MAX_RT =sta^4; //MAX_RT 为 sta 地第四位/********************************************************** ********************************//*延时函数/********************************************************** ********************************/void inerDelay_us(unsigned char n) //延时,us 级{for(;n>0;n--)_nop_();}/********************************************************** ******************************//*NRF24L01初始化/********************************************************** *****************************/void init_NRF24L01(void){inerDelay_us(100);CE=0; // 芯片使能CSN=1; // 禁止 SPISCK=0; // SPI时钟置低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,如果需要多频道可以参考Page21SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB}/********************************************************** ******************************************//*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01地SPI写时序-----根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节/********************************************************** ******************************************/uint SPI_RW(uint dat){uint i;for(i=0;i<8;i++) // 循环8次{MOSI = (dat & 0x80); // dat地最高位输出到MOSI MSB to MOSIdat = (dat << 1); // 从右向左进一位shift next bit into MSB..SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据Set SCK high..dat |= MISO; //读MISO到 dat 最低位 capture current MISO bitSCK = 0; // SCK置低..then set SCK low again}return(dat); //返回读出地一字节 return read dat}/********************************************************** ******************************************/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01地SPI时序-----------从reg寄存器读一字节/********************************************************** ******************************************/uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0; //CSN置低,开始传输数据CSN low, initialize SPI communication...SPI_RW(reg); //选择寄存器 Select register to read from..reg_val = SPI_RW(0); //然后从该寄存器读数据 ..then read registervalueCSN = 1; //CSN拉高,结束数据传输CSN high, terminate SPI communicationreturn(reg_val); //返回寄存器数据 return register value}/********************************************************** ******************************************//*功能:NRF24L01读写寄存器函数/*描述:写数据value到reg寄存器/********************************************************** ******************************************/uint SPI_RW_Reg(uchar reg, uchar value){uchar status;CSN = 0; // CSN置低,开始传输数据CSN low, init SPI transactionstatus = SPI_RW(reg); // 选择寄存器,同时返回状态字select registerSPI_RW(value); // 然后写数据到该寄存器 ..and write value to it..CSN = 1; // CSN拉高,结束数据传输CSN high againreturn(status); // 返回状态寄存器 return nRF24L01 status uchar}/********************************************************** ******************************************//*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据地个数/*描述: 从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址/********************************************************** ******************************************/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,i;CSN = 0; //CSN置低,开始传输数据 Set CSN low, init SPI tranactionstatus = SPI_RW(reg); //选择寄存器,同时返回状态字Select register to write to and read status uchar for(i=0;i<uchars;i++)pBuf[i] = SPI_RW(0); //逐个字节从nRF24L01读出CSN = 1; //CSN拉高,结束数据传输return(status); //返回状态寄存器return nRF24L01 status uchar}/********************************************************** ***********************************************/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据地个数/*描述:把pBuf缓存中地数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址/********************************************************** ***********************************************/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,i;CSN = 0; //CSN置低,开始传输数据status = SPI_RW(reg); //选择寄存器,同时返回状态字inerDelay_us(10);for(i=0; i<uchars; i++)SPI_RW(*pBuf++); //逐个字节写入nRF24L01CSN = 1; //CSN拉高,结束数据传输return(status); //返回状态寄存器}/********************************************************** ******************************************//*函数:void SetRX_Mode(void)/*功能:数据接收配置/********************************************************** ******************************************/void SetRX_Mode(void){CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);//CRC使能,16位CRC 校验,上电,接收模式CE = 1; // 拉高CE启动接收设备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 bufferrevale =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,激发数据发送}/************************************主函数*********************************************************** */void main(void){unsigned char tf =0;unsigned char TxBuf[20]={0}; // 要发送地数组unsigned char RxBuf[20]={0}; // 接收地数据数组init_NRF24L01() ; //模块初始化led1=1;led2=1;led3 =1;led4 =1; //led 灯关闭Delay(1000);while(1){if(KEY1 ==0 ) //按键 1 按下{TxBuf[1] = 1 ; //赋值tf = 1 ;led1=0; //本地led 灯闪烁led1=1;Delay(200);}if(KEY2 ==0 ) //按键 2 按下{TxBuf[2] =1 ; //赋值tf = 1 ;led2=0; //本地led 灯闪烁Delay(200);led2=1;Delay(200);}if (tf==1) //有键按下{nRF24L01_TxPacket(TxBuf); //发送数据 Transmit Tx buffer dataTxBuf[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]==1){led3=RxBuf[0];}if( RxBuf[2]==1){led4=RxBuf[4];}Delay(3000); //old is '1000'}RxBuf[1] = 0x00; //清零RxBuf[2] = 0x00;led3=1; //关灯led4=1;}}本程序存在地问题:反应不够灵敏,当在按键1和按键2之间切换地时候,对方地灯闪烁会有一定地延时,另外本程序没有消除按键地抖动.对部分函数地解释:uint SPI_RW(uint dat)最基本地函数,完成 GPIO模拟 SPI 地功能.将输出字节(MOSI)从 MSB 循环输出,同时将输入字节(MISO)从 LSB 循环移入.上升沿读入,下降沿输出. (从 SCK被初始化为低电平可以判断出)uchar SPI_Read(uchar reg); //从reg寄存器读一字节读取寄存器值地函数:基本思路就是通过 READ_REG命令(也就是 0x00+寄存器地址) ,把寄存器中地值读出来.对于函数来说也就是把 reg 寄存器地值读到reg_val 中去.uint SPI_RW_Reg(uchar reg, uchar value); //写数据value到reg寄存器寄存器访问函数:用来设置 24L01 地寄存器地值.基本思路就是通过 WRITE_REG命令(也就是 0x20+寄存器地址)把要设定地值写到相应地寄存器地址里面去,并读取返回值.对于函数来说也就是把 value值写到 reg 寄存器中.需要注意地是,访问 NRF24L01 之前首先要 enable 芯片(CSN=0;) ,访问完了以后再 disable芯片(CSN=1;).uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); //从reg寄存器读出bytes个字节,通常用来//读取接收通道数据或接收/发送地址接收缓冲区访问函数:主要用来在接收时读取 FIFO 缓冲区中地值.基本思路就是通过READ_REG命令把数据从接收 FIFO(RD_RX_PLOAD)中读出并存到数组里面去.uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //把pBuf缓存中地数据写入到nRF24L01,通常//用来写入发发射缓冲区访问函数:主要用来把数组里地数放到发射 FIFO缓冲区中.基本思路就是通过WRITE_REG命令把数据存到发射 FIFO(WR_TX_PLOAD)中去.Tx 模式初始化过程1)写 Tx 节点地地址 TX_ADDR2)写 Rx 节点地地址(主要是为了使能 Auto Ack) RX_ADDR_P0 3)使能 AUTO ACK EN_AA4)使能 PIPE 0 EN_RXADDR5)配置自动重发次数 SETUP_RETR6)选择通信频率 RF_CH7)配置发射参数(低噪放大器增益.发射功率.无线速率) RF_SETUP 8 ) 选择通道0 有效数据宽度 Rx_Pw_P09)配置 24L01 地基本参数以及切换工作模式 CONFIG.Rx 模式初始化过程:初始化步骤 24L01 相关寄存器1)写 Rx 节点地地址 RX_ADDR_P02)使能 AUTO ACK EN_AA3)使能 PIPE 0 EN_RXADDR4)选择通信频率 RF_CH5) 选择通道0 有效数据宽度 Rx_Pw_P06)配置发射参数(低噪放大器增益.发射功率.无线速率) RF_SETUP 7)配置 24L01 地基本参数以及切换工作模式 CONFIG.。

nRF24L01射频模块驱动程序设计

nRF24L01射频模块驱动程序设计
YAN L i n - x i a n g, Z HANG Ho n g - y u
( S c h o o l o fE l e c t r o n i c E n g i n e e r i n g , U n w e n i t y o fE l e c t r o n i c S c i e n c e a n d T e c h n o l o g y f o C h i n a , C h e n g d u 6 1 1 7 3 1 ,C h i n a )
序 。最 终 实现 了 n R F 2 4 L 0 1 射 频 模 块 之 间 的通 信 。 该 射 频模 块在 2 . 4 5 G无 线通 信 领 域 中有 着 广 泛 的应 用前 景 。 关键词 : 驱动程序 : n R F 2 4 L 0 1 射频模块 ; 嵌入 式 L i n u x ; 2 . 4 5 G 无 线通 信
严林 祥 . 张 红 雨
( 电子 科 技 大 学 电子
摘 要 :文 中基 于微 处理 器 ¥ 3 C 2 4 4 0和 嵌 入 式 L i n u x操 作 系统 .介 绍 了 一种 利 用 S P I 控 制 器控 制 n R F 2 4 L 0 1 射 频模 块 的驱动程序设计。讨论 了n R F 2 4 L 0 1 射 频 模 块 的硬 件 电路 。 采 用 字符 设 备 驱 动 的 开发 流程 设 计 了射 频模 块 的 驱 动 程
且 有 统 一 的 协 议 标 准 的 应 用 领 域 有 :微 波 炉 、无 绳 电 话 、
段 的超 低 功耗 单 片 无 线 收 发 器 芯 片 。芯 片 内置 频 率 发 生 器 、 功率放大器 、 晶体 振 荡 器 、 调制器和解调器等功 能模块 , 外 围 扩展少量 的器件就可 以利用全 双工的 S P I 串行 接 口与 MC U 实 现 通信 。芯 片 有 1 2 5个频 点 , 能够实现点对点 、 点 对 多 点 的

nRF24L01的工作原理

nRF24L01的工作原理

nRF24L01的工作原理nRF24L01是一种低功耗2.4GHz无线收发模块,广泛应用于无线通信领域。

它采用射频收发器芯片nRF24L01+,支持2Mbps的高速数据传输速率,具有优秀的抗干扰能力和稳定的信号传输性能。

本文将详细介绍nRF24L01的工作原理,包括硬件结构和通信协议。

1. 硬件结构nRF24L01模块主要由射频收发器芯片、天线、晶振、电源管理电路和外部接口组成。

射频收发器芯片:nRF24L01+芯片是模块的核心部件,它集成为了射频收发器、基带处理器和嵌入式协议栈等功能。

该芯片采用2.4GHz的ISM频段,支持多通道选择,能够与其他nRF24L01模块进行无线通信。

天线:nRF24L01模块通常配备了PCB天线,用于接收和发送无线信号。

天线的设计和布局对模块的通信距离和稳定性有一定影响。

晶振:nRF24L01模块使用晶振提供时钟信号,以保证模块的正常运行。

常见的晶振频率为16MHz。

电源管理电路:nRF24L01模块需要3.3V的电源供电,电源管理电路用于稳定和管理电源输入。

外部接口:nRF24L01模块通常具有SPI接口,用于与主控芯片进行通信。

SPI接口包括四根信号线:SCK、MISO、MOSI和CSN。

2. 通信协议nRF24L01模块使用一种称为Enhanced ShockBurst的协议进行数据传输。

该协议基于射频通信技术,具有高效的数据传输和强大的抗干扰能力。

Enhanced ShockBurst协议采用了一对多的通信方式,即一个发送器可以同时向多个接收器发送数据。

协议中定义了一些重要的概念和参数,如地址、通道、数据包、数据速率等。

地址:nRF24L01模块使用6字节的地址进行通信,发送器和接收器必须使用相同的地址才干进行通信。

地址由发送器设定,并在数据包中包含。

通道:nRF24L01模块支持多达125个通道,发送器和接收器必须使用相同的通道才干进行通信。

通道的选择可以用于避免不同模块之间的干扰。

nRF24L01的工作原理

nRF24L01的工作原理

nRF24L01的工作原理nRF24L01是一种低功耗2.4GHz无线收发器,广泛应用于无线通信领域。

它采用射频(RF)技术,能够在2.4GHz频段进行无线通信,并具备较高的数据传输速率和较低的功耗。

nRF24L01工作原理主要包括无线信号传输、数据编码和解码、频率选择和信号调制等关键步骤。

下面将详细介绍nRF24L01的工作原理。

1. 无线信号传输nRF24L01通过天线接收或者发送无线信号。

在发送端,待发送的数据通过SPI(串行外设接口)与nRF24L01进行通信,nRF24L01将数据转换为无线信号并通过天线发送出去。

在接收端,nRF24L01通过天线接收到的无线信号,将其转换为数字信号,并通过SPI与微控制器进行通信,将接收到的数据传输给用户。

2. 数据编码和解码nRF24L01使用一种称为Enhanced ShockBurst™的编码技术,用于提高数据传输的可靠性和抗干扰能力。

发送端将待发送的数据分为多个数据包,并对每一个数据包进行编码和校验,以确保数据的完整性和准确性。

接收端对接收到的数据包进行解码和校验,以还原原始数据。

3. 频率选择nRF24L01可以在2.4GHz频段的多个不重叠的信道中进行通信。

通过选择不同的信道,可以避免与其他无线设备的干扰。

nRF24L01支持2.4GHz频段的125个信道,其中2.4GHz到2.525GHz范围内有16个信道,每一个信道之间的频率间隔为1MHz。

4. 信号调制nRF24L01使用高级调制技术,将数字信号转换为摹拟信号进行无线传输。

它采用高级调制方式,如GFSK(高斯频移键控)调制,以提高数据传输的可靠性和抗干扰能力。

GFSK调制技术通过改变载波频率的相位,将数字信号转换为摹拟信号,并通过天线进行传输。

5. 功耗控制nRF24L01具有低功耗特性,能够在不同的功耗模式之间进行切换,以满足不同应用场景的需求。

它支持多种低功耗模式,如睡眠模式、待机模式和接收模式等。

nrf24l01无线通信模块与51单片机工作原理

nrf24l01无线通信模块与51单片机工作原理

nrf24l01无线通信模块与51单片机工作原理
nRF24L01是一款低功耗的2.4GHz无线通信模块,适用于微
控制器和嵌入式系统之间的短距离数据传输。

它可以与51单
片机进行配合使用。

nRF24L01模块包括一个射频发射芯片和一个射频接收芯片。

模块通过SPI接口与51单片机连接。

其工作原理如下:
1. 初始化:首先,51单片机通过SPI接口向nRF24L01模块发送配置命令,包括设置通信频率、通信通道、发射功率等参数。

2. 发送数据:当需要发送数据时,51单片机将待发送的数据
通过SPI接口发送给nRF24L01模块的发送芯片。

发送芯片将
数据转换为无线信号,并通过天线发射出去。

3. 接收数据:当有数据被接收时,nRF24L01模块的接收芯片
会把接收到的数据通过SPI接口传递给51单片机。

单片机再
根据需要对接收到的数据进行处理。

4. 确认和重传:发送芯片在发送数据后会等待接收芯片的确认信号。

如果收到确认信号,发送芯片会继续发送下一个数据包。

如果未收到确认信号,发送芯片会进行多次重传,以确保数据的可靠传输。

5. 通信协议:nRF24L01模块支持多种通信协议,如无线串口、SPI、I2C等。

可以根据需要选择合适的通信协议进行数据传输。

通过上述工作原理,nRF24L01模块可以实现低功耗、短距离的无线数据传输,并与51单片机进行可靠的通信。

它被广泛应用于无线遥控、传感器网络、智能家居等领域。

nRF24L01的工作原理

nRF24L01的工作原理

nRF24L01的工作原理引言概述:nRF24L01是一款低功耗、高性能的2.4GHz无线收发模块,广泛应用于无线通信领域。

它采用了先进的射频技术和通信协议,具有稳定的信号传输和高效的能耗管理。

本文将详细介绍nRF24L01的工作原理,匡助读者更好地了解这款模块的工作机制。

一、射频通信原理1.1 发射端工作原理:当发送端要发送数据时,先将数据通过SPI接口发送给nRF24L01模块,模块将数据转换成射频信号并通过天线发送出去。

发送端的nRF24L01模块会在发送完成后自动进入接收模式,等待接收端的应答信号。

1.2 接收端工作原理:接收端的nRF24L01模块接收到射频信号后,将其转换成数字信号并通过SPI接口传输给微控制器,微控制器解析数据并做出相应的处理。

接收端的nRF24L01模块也会发送应答信号给发送端,确认数据接收成功。

1.3 频率调谐原理:nRF24L01模块采用频率合成技术,可以在2.4GHz频段内进行频率调谐,以适应不同的通信环境和干扰情况。

这种技术可以保证通信的稳定性和可靠性。

二、数据传输原理2.1 数据包格式:nRF24L01模块采用数据包的形式进行数据传输,每一个数据包包含了数据字段、地址字段、校验字段等部份。

发送端和接收端需要事先约定好数据包的格式,以确保数据的正确传输。

2.2 自动重传机制:nRF24L01模块具有自动重传机制,可以在数据传输失败时自动重新发送数据,提高了数据传输的成功率。

这种机制可以有效应对信号干扰和传输错误的情况。

2.3 数据加密功能:nRF24L01模块支持数据加密功能,可以对传输的数据进行加密保护,防止数据被恶意窃取或者篡改。

这种功能可以保障通信的安全性和隐私性。

三、功耗管理原理3.1 低功耗模式:nRF24L01模块具有多种低功耗模式,可以在不同的工作状态下自动切换,以降低功耗并延长电池寿命。

这种功耗管理机制可以使nRF24L01模块适合于电池供电的应用场景。

nrf24l01模块工作原理

nrf24l01模块工作原理

nrf24l01模块工作原理一、概述nrf24l01是一款低功耗2.4GHz无线收发模块,由Nordic公司生产。

它采用GFSK调制方式,支持1Mbps、2Mbps和250kbps三种数据传输速率。

nrf24l01模块广泛应用于无线遥控、无线数据传输、无线音频传输等领域。

二、硬件结构nrf24l01模块由射频前端和基带芯片组成。

其中射频前端包括天线接口、功率放大器和低噪声放大器,基带芯片包括SPI接口、状态寄存器和配置寄存器。

三、工作原理1. 发送端工作原理发送端将待发送的数据通过SPI接口写入nrf24l01的发送缓冲区中,并设置相应的发送参数,如频道号、地址宽度等。

当发送命令被触发后,nrf24l01会启动射频前端进行信号调制并将信号通过天线发射出去。

2. 接收端工作原理接收端不断监听所设定的频道号,并将接收到的信号经过解调后写入接收缓冲区。

当接收到完整的数据包时,nrf24l01会向主机发送中断请求,并将状态寄存器中的相应位设置为1,以便主机读取接收缓冲区中的数据。

3. 通信协议nrf24l01采用了一种简单的6字节地址格式,其中包括5字节的地址和1字节的控制码。

控制码用于区分发送和接收设备,并指定是广播还是单播通信。

nrf24l01还支持自动重发机制和自动应答机制,以提高通信可靠性。

四、应用场景nrf24l01模块广泛应用于无线遥控、无线数据传输、无线音频传输等领域。

在无人机、智能家居等领域也有着广泛的应用。

同时,由于其低功耗特性,也可以被用于物联网设备中。

五、总结nrf24l01是一款低功耗2.4GHz无线收发模块,具有简单易用和可靠性高等特点。

它在无线遥控、无线数据传输、无线音频传输等领域都有着广泛的应用,并且在物联网设备中也有着重要作用。

NRF24L01无线发射简易教程

NRF24L01无线发射简易教程

NRF24L01 简易教程先来看接口电路,使用的IO 口不是唯一的哦,可随意定义接口,当然是在使用IO 口模拟SPI 且IRQ 中断引脚不使用的使用查询方法判断接收状态的情况下了。

作为初探我们就是用简单的IO 模拟SPI 的方法了,中断使用查询的方式。

那么该教程讲解的接口与单片机的连接如下:首先您需要了解NRF24L01,请参阅“NRF24L01 芯片中文资料”或者“NRF24L01 芯片英文资料”。

我们的教程是以一个简单的小项目为大家展示NRF24L01 的使用方法与乐趣。

我们所写的教程均是以这种方式的呢,让您在学习的时候明白它能做什么,使您学起来不至于枯燥无味。

作为简易的教程,我们只需要知道它是怎么使用的就够了,我们本教程的目的是用NRF24L01 发送数据和接收数据,且接收方会对比发送的数据与接收的数据,若完全相同则控制LED 闪烁一次,并且把接收到的数据通过串口发送到PC 端,通过串口工具查看接收到的数据。

具体的要求如下:1、具备发送和接收的能力。

2、发送32 个字节的数据,接收方接收到正确数据之后给予提示,通过LED 闪烁灯形式。

3、把接收到的数据传送到PC 进行查看。

4、发送端每隔大约1.5 秒发送一次数据,永久循环。

以上是程序的要求,若您想自行设计出硬件接口,您也是可以添加一条呢:使用DIY 方式设计NRF24L01 的接口板,且包含含单片机平台,使用PCB 方式或者万用板方式均可。

如果您想让自己学的很扎实,那么推荐您自行做出接口板子呢。

当然若您的能力不足,那么我们不推荐自行做板呢,因为这样会增加您学习的难度,反而起到了反效果呢。

我们使用的方式是画PCB 的方式呢,若您自己做了接口板子,那么您可以对比下一呢,O(∩_∩)O!我们知道NRF24L01 的供电电压是1.9V~3.6V 不能超过这个范围,低了不工作,高了可能烧毁NRF24L01 芯片。

我们常用的STC89C52 的单片机的供电电压是5V,我们不能直接给24L01 这个模块供电,我们需要使用AMS1117-3.3V 稳压芯片把5V 转成3.3V 的电压为24L01 模块供电。

NRF24L01详细教程

NRF24L01详细教程

NRF24L01详细教程NRF24L01是一款低功耗2.4GHz无线收发模块,广泛应用于各种无线通信项目中。

它可以使微控制器与其他设备进行无线通信,例如Arduino 与Arduino之间的通信、Arduino与无线传感器节点的通信等。

下面是一个详细的NRF24L01教程。

1.NRF24L01的基本介绍NRF24L01是一款由Nordic Semiconductor公司生产的低功耗无线收发模块,采用2.4GHz频段,具有快速的通信速率、低功耗、高阻塞容限等特点。

它可以与各种微控制器(如Arduino)进行通信,是一种理想的无线通信解决方案。

2.NRF24L01的物理连接在开始使用NRF24L01之前,需要将其与微控制器进行物理连接。

NRF24L01模块有8个引脚,分别是:VCC、GND、CE、CSN、SCK、MOSI、MISO和IRQ。

其中,VCC和GND连接到供电电源,CE和CSN连接到微控制器的任意数字引脚,而SCK、MOSI和MISO连接到SPI总线。

3.NRF24L01的库文件安装在编程之前,需要安装与NRF24L01相关的库文件。

可以在Arduino IDE的库管理器中并安装"nRF24L01"库。

安装完成后,就可以在程序中引用该库文件了。

4.NRF24L01的基本设置在程序中,首先需要进行NRF24L01的基本设置。

首先,在程序开头引入"NRF24L01.h"库文件。

然后,在setup(函数中,通过调用"NRF24L01"类的对象进行初始化设置。

设置包括设置CE与CSN引脚、设置通信频率、设置收发地址等。

5.NRF24L01的通信在进行基本设置之后,可以开始进行NRF24L01的通信。

通信包括发送数据和接收数据两个方面。

对于发送数据,可以使用"NRF24L01"类的write(函数将数据发送给另外一个NRF24L01模块;对于接收数据,则可以使用available(函数判断是否有数据接收到,并使用read(函数读取数据。

STC89C52+NRF24L01+232通信无线模块收发c程序

STC89C52+NRF24L01+232通信无线模块收发c程序
#define TX_ADDR 0x10 //发送地址寄存器
#define RX_PW_P0 0x11 //接收频道0接收数据长度
#define RX_PW_P1 0x12 //接收频道0接收数据长度
#define RX_PW_P2 0x13 //接收频道0接收数据长度
#define RX_PW_P3 0x14 //接收频道0接收数据长度
/*函数:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI时序
/****************************************************************************************************/
uchar 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..
uchar bdata sta; //状态标志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
//*********************************************NRF24L01*************************************

NRF24L01无线模块收发程序(实测成功多图)

NRF24L01无线模块收发程序(实测成功多图)

NRF24L01无线模块收发程序(实测成功多图)本模块是NRF24L01无线传输模块,用于无线传输数据,距离不远,一般只是能够满足小距离的传输,目测是4-5m,价格一般是4元左右,可以方便的买到。

51最小系统学习板就可以,当时是用了两块学习板,一块用于发送,一块用于接收。

小车也是比较容易购到的,四个端口控制两个电机,两个控制一个电机,当两个端口高低电平不同时电机就会转动,即为赋值1和0是电机转动,赋值可以用单片机作用,当然这是小车启动部分,前进后退左转右转就是你赋值0和1的顺序问题了。

整体思路是用发射端的按键控制小车,即为按键按下就前进,再按其他按键实现其他功能,本次程序是在用NRF24L01发射数据在接收端用1602显示的基础上改变。

下面是程序源码(有好几个文件,分别创建)1.//////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////2.#include3.4.#include5.6.#include'1602.h'7.#include'delay.h'8.#include 'nrf24l01.h'9.#define uint unsigned int10.#define uchar unsigned char11.uint Weight_Shiwu=1234;12.unsigned char KeyScan(void);//键盘扫描13.// unsigned char KeyScan(void);//键盘扫描14.15.//#define KeyPort P016.sbit KEY1 = P0^0;17.sbit KEY2 = P0^1;18.sbit KEY3 = P0^2;19.sbit KEY4 = P0^3;20.sbit KEY5 = P0^4;21.void main()22.{23.// char TxDate[4];24.// LCD_Init(); //初始化液晶屏25.// LCD_Clear(); //清屏26.// NRF24L01Int(); //初始化LCD160227.// LCD_Write_String(4,0,'welcome');28.while(1)29.{30.KeyScan();31.32.}33.}34.35.36.37.38.unsigned char KeyScan(void)39.{40./******************************************************** /42.{43.if(!KEY1) //如果检测到低电平,说明按键按下44.{45.DelayMs(10); //延时去抖,一般10-20ms46.if(!KEY1) //再次确认按键是否按下,没有按下则退出47.{48.while(!KEY1);//如果确认按下按键等待按键释放,没有则退出49.{50.TxDate[0] = 1;//向左转51.TxDate[1] = 0;52.TxDate[2] = 1;53.TxDate[3] = 1;54.NRFSetTxMode(TxDate);//发送数据·55.while(CheckACK()); //检测是否发送完毕56.}57.}58.}59./******************************************************** /60.else if(!KEY2) //如果检测到低电平,说明按键按下61.{62.DelayMs(10); //延时去抖,一般10-20ms63.if(!KEY2) //再次确认按键是否按下,没有按下则退出64.{65.while(!KEY2);//如果确认按下按键等待按键释放,没有则退出66.{67.TxDate[0] = 1;//向右转69.TxDate[2] = 1;70.TxDate[3] = 0;71.NRFSetTxMode(TxDate);//发送数据72.while(CheckACK()); //检测是否发送完毕73.}74.}75.}76./******************************************************** /77.else if(!KEY3) //如果检测到低电平,说明按键按下78.{79.DelayMs(10); //延时去抖,一般10-20ms80.if(!KEY3) //再次确认按键是否按下,没有按下则退出81.{82.while(!KEY3);//如果确认按下按键等待按键释放,没有则退出83.{84.TxDate[0] = 1;//前进85.TxDate[1] = 0;86.TxDate[2] = 1;87.TxDate[3] = 0;88.NRFSetTxMode(TxDate);//发送数据89.while(CheckACK()); //检测是否发送完毕90.}91.}92.}93./******************************************************** /94.else if(!KEY4) //如果检测到低电平,说明按键按下96.DelayMs(10); //延时去抖,一般10-20ms97.if(!KEY4) //再次确认按键是否按下,没有按下则退出98.{99.while(!KEY4);//如果确认按下按键等待按键释放,没有则退出100.{101.TxDate[0] = 0;//后退102.TxDate[1] = 1;103.TxDate[2] = 0;104.TxDate[3] = 1;105.NRFSetTxMode(TxDate);//发送数据106.while(CheckACK()); //检测是否发送完毕107.}108.}109.}110.else if(!KEY5)111.{112.DelayMs(10);113.if(!KEY5)114.{115.while(!KEY5)116.{117.TxDate[0] = 1;118.TxDate[1] = 1;119.TxDate[2] = 1;120.TxDate[3] = 1;121.NRFSetTxMode(TxDate);122.while(CheckACK());123.}125.}126.}127.}1.//////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////2.#include3.4.#include5.6.#include'1602.h'7.#include'delay.h'8.#include 'nrf24l01.h'9.#define uint unsigned int10.#define uchar unsigned char11.uint Weight;12.sbit a = P2^0;13.sbit b = P2^1;14.sbit c = P2^2;15.sbit d = P2^3;16.void main()17.{18.LCD_Init(); //初始化液晶屏19.LCD_Clear(); //清屏20.*(RevTempDate+4)=*\0*;21.NRF24L01Int();22.while(1)23.{25.NRFSetRXMode();//设置为接收模式26.GetDate();//开始接受数;27.//Weight=RevTempDate[0]*1000+RevTempDate[1]*100+RevTemp Date[2]*10+RevTempDate[3];28.LCD_Write_Char(7,0,RevTempDate[0]+0x30);29.LCD_Write_Char(8,0,RevTempDate[1]+0x30);30.LCD_Write_Char(9,0,RevTempDate[2]+0x30);31.LCD_Write_Char(10,0,RevTempDate[3]+0x30);32. a = RevTempDate[0];//根据接受数据来设置高低电平(目测仅限传输1.0两种数值)33. b = RevTempDate[1];34. c = RevTempDate[2];35. d = RevTempDate[3];36.}37.}38.39.///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////1.#include2.3.#include 'nrf24l01.h'4.#define uchar unsigned char5.#define uint unsigned int6.sbit IRQ =P1^2;//输入7.sbit MISO =P1^3; //输入8.sbit MOSI =P1^1;//输出9.sbit SCLK =P1^4;//输出10.sbit CE =P1^5;//输出11.sbit CSN =P1^0;//输出12.uchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址13./*****************状态标志*****************************************/14.uchar bdata sta; //状态标志15.sbit RX_DR=sta^6;16.sbit TX_DS=sta^5;17.sbit MAX_RT=sta^4;18./*****************SPI时序函数******************************************/19.uchar NRFSPI(uchar date)20.{21.uchar i;22.for(i=0;i<8;i++)>23.{24.if(date&0x80)25.MOSI=1;26.else27.MOSI=0; // byte最高位输出到MOSI28.date<=1;>29.SCLK=1;30.if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据31.date|=0x01; // 读MISO到byte最低位32.SCLK=0; // SCK置低33.}34.return(date); // 返回读出的一字节35.}36./**********************NRF24L01初始化函数*******************************/37.void NRF24L01Int()38.{39.DDelay(2);//让系统什么都不干40.CE=0; //待机模式141.CSN=1;42.SCLK=0;43.IRQ=1;44.}45./*****************SPI读寄存器一字节函数*********************************/46.uchar NRFReadReg(uchar RegAddr)47.{48.uchar BackDate;49.CSN=0;//启动时序50.NRFSPI(RegAddr);//写寄存器地址51.BackDate=NRFSPI(0x00);//写入读寄存器指令52.CSN=1;53.return(BackDate); //返回状态54.}55./*****************SPI写寄存器一字节函数*********************************/56.uchar NRFWriteReg(uchar RegAddr,uchar date)57.{58.uchar BackDate;59.CSN=0;//启动时序60.BackDate=NRFSPI(RegAddr);//写入地址61.NRFSPI(date);//写入值62.CSN=1;63.return(BackDate);64.}65./*****************SPI读取RXFIFO寄存器的值********************************/66.uchar NRFReadRxDate(uchar RegAddr,uchar *RxDate,uchar DateLen)67.{ //寄存器地址//读取数据存放变量//读取数据长度//用于接收68.uchar BackDate,i;69.CSN=0;//启动时序70.BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址71.for(i=0;i72.{73.RxDate[i]=NRFSPI(0);74.}75.CSN=1;76.return(BackDate);77.}78./*****************SPI写入TXFIFO寄存器的值**********************************/79.uchar NRFWriteTxDate(uchar RegAddr,uchar *TxDate,uchar DateLen)80.{ //寄存器地址//写入数据存放变量//读取数据长度//用于发送81.uchar BackDate,i;82.CSN=0;83.BackDate=NRFSPI(RegAddr);//写入要写入寄存器的地址84.for(i=0;i85.{86.NRFSPI(*TxDate++);87.}88.CSN=1;89.return(BackDate);90.}91./*****************NRF设置为发送模式并发送数据******************************/92.void NRFSetTxMode(uchar *TxDate)93.{//发送模式94.CE=0;95.NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_A DDR_WITDH);//写寄存器指令+接收地址使能指令+接收地址+地址宽度96.NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同97.NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WIT DH);//写入数据98./******下面有关寄存器配置**************/99.NRFWriteReg(W_REGISTER+EN_AA,0x01); // 使能接收通道0自动应答100.NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // 使能接收通道0101.NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a); // 自动重发延时等待250us+86us,自动重发10次102.NRFWriteReg(W_REGISTER+RF_CH,0x40); // 选择射频通道0x40103.NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益104.NRFWriteReg(W_REGISTER+CONFIG,0x0e); // CRC使能,16位CRC校验,上电105.CE=1;106.DDelay(5);//保持10us秒以上107.}108./*****************NRF设置为接收模式并接收数据******************************/109.//主要接收模式110.void NRFSetRXMode()111.{112.CE=0;113.NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH); // 接收设备接收通道0使用和发送设备相同的发送地址114.NRFWriteReg(W_REGISTER+EN_AA,0x01); // 使能接收通道0自动应答115.NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // 使能接收通道0116.NRFWriteReg(W_REGISTER+RF_CH,0x40); // 选择射频通道0x40117.NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WIT DH); // 接收通道0选择和发送通道相同有效数据宽度118.NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益*/119.NRFWriteReg(W_REGISTER+CONFIG,0x0f); // CRC使能,16位CRC校验,上电,接收模式120.CE = 1;121.DDelay(5);//保持10us秒以上122.}123./****************************检测应答信号******************************/124.uchar CheckACK()125.{ //用于发射126.sta=NRFReadReg(R_REGISTER+STATUS); // 返回状态寄存器127.if(TX_DS||MAX_RT) //发送完毕中断128.{129.NRFWriteReg(W_REGISTER+STATUS,0xff); // 清除TX_DS或MAX_RT中断标志130.CSN=0;131.NRFSPI(FLUSH_TX);//用于清空FIFO !!关键!!不然会出现意想不到的后果大家记住!!132.CSN=1;133.return(0);134.}135.else136.return(1);137.}138./******************判断是否接收收到数据,接到就从RX 取出*********************/139.//用于接收模式140.uchar NRFRevDate(uchar *RevDate)141.{142.uchar RevFlags=0;143.sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器144.if(RX_DR) // 判断是否接收到数据145.{146.CE=0; //SPI使能147.NRFReadRxDate(R_RX_PAYLOAD,RevDate,RX_DATA_WI TDH);// 从RXFIFO读取数据148.RevFlags=1; //读取数据完成标志149.}150.NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标151.return(RevFlags);152.}153.void DDelay(uint t)154.{155.uint x,y;156.for(x=t;x>0;x--)157.for(y=110;y>0;y--);158.}159.///////////////////////////////////////////////////////////// ///////////////////////////////////////////1.#include 'delay.h'2./*------------------------------------------------延时函数,含有输入参数 unsigned char t,无返回值4.unsigned char 是定义无符号字符变量,其值的范围是5.0~255 这里使用晶振12M,精确延时请使用汇编,大致延时6.长度如下 T=tx2+5 uS7.------------------------------------------------*/8.void DelayUs2x(unsigned char t)9.{10.while(--t);11.}12./*------------------------------------------------13.mS延时函数,含有输入参数 unsigned char t,无返回值14.unsigned char 是定义无符号字符变量,其值的范围是15.0~255 这里使用晶振12M,精确延时请使用汇编16.------------------------------------------------*/17.void DelayMs(unsigned char t)18.{19.20.while(t--)21.{22.//大致延时1mS23.DelayUs2x(245);24.DelayUs2x(245);25.26.}27.}28.///////////////////////////////////////////////////////////// //////////////////////////////1.下面是接收的NRF24L01的程序。

nRF24L01的工作原理

nRF24L01的工作原理

nRF24L01的工作原理nRF24L01是一款低功耗的2.4GHz无线收发器,广泛应用于无线通信领域。

它采用射频芯片nRF24L01+和微控制器相结合的方式,可以实现无线数据传输和接收功能。

本文将详细介绍nRF24L01的工作原理及其相关技术参数。

一、nRF24L01的基本结构nRF24L01由射频芯片和微控制器组成,射频芯片负责无线通信的收发功能,而微控制器则负责控制和处理数据。

1. 射频芯片nRF24L01射频芯片是一款集成度高、性能稳定的射频收发器。

它支持2.4GHz 频段,采用GFSK调制方式,具有快速的数据传输速率和较低的功耗。

射频芯片包含了射频收发器、调制解调器、频率合成器等功能模块,能够实现无线通信的基本功能。

2. 微控制器nRF24L01通常与微控制器相结合使用,常见的微控制器有Arduino、STM32等。

微控制器负责控制射频芯片的工作模式、发送和接收数据的处理,以及与其他设备的交互等功能。

二、nRF24L01的工作模式nRF24L01具有多种工作模式,包括发送模式、接收模式和待机模式等。

下面将详细介绍每种工作模式的特点和工作原理。

1. 发送模式在发送模式下,nRF24L01将数据发送给接收端。

发送模式的工作原理如下:- 设置发送端的地址和通信频道。

- 将待发送的数据写入发送缓冲区。

- 发送端开始发送数据,nRF24L01将数据通过射频信号发送出去。

- 发送完毕后,发送端等待接收端的应答信号。

2. 接收模式在接收模式下,nRF24L01接收来自发送端的数据。

接收模式的工作原理如下:- 设置接收端的地址和通信频道。

- 接收端开始监听射频信号,并等待发送端发送数据。

- 当接收端接收到数据时,nRF24L01将数据写入接收缓冲区。

- 接收端可以通过读取接收缓冲区中的数据进行进一步处理。

3. 待机模式在待机模式下,nRF24L01处于低功耗状态,仅保持最基本的功能。

待机模式的工作原理如下:- nRF24L01关闭射频发送和接收功能,以降低功耗。

nRF24L01的工作原理

nRF24L01的工作原理

nRF24L01的工作原理引言概述:nRF24L01是一种低功耗2.4GHz无线收发器,广泛应用于物联网、无线传感器网络和家庭自动化等领域。

本文将详细介绍nRF24L01的工作原理。

一、发送和接收模块1.1 发送模块nRF24L01的发送模块由微控制器、射频前端和天线组成。

微控制器负责控制数据的发送,通过SPI接口与nRF24L01通信。

射频前端将数字信号转换为射频信号,并将其发送到天线。

1.2 接收模块接收模块由天线、射频前端和微控制器组成。

天线接收到射频信号后,射频前端将其转换为数字信号,并将其传输给微控制器进行处理。

1.3 通信协议nRF24L01使用2.4GHz的ISM频段进行通信,并采用GFSK调制方式。

它支持多种通信协议,如SPI、I2C和UART等。

通过设置相应的寄存器,可以实现不同的通信方式和数据传输速率。

二、工作频率和通道2.1 工作频率nRF24L01工作在2.4GHz的ISM频段,这个频段被分为多个频道。

不同的国家和地区有不同的频段规定,因此在使用nRF24L01时需要根据所在地区的规定选择合适的频率。

2.2 通道设置nRF24L01提供了多个通道供用户选择。

通过设置相应的寄存器,可以选择不同的通道进行通信。

通道的选择可以避免与其他设备的干扰,并提高通信的可靠性。

2.3 频率调谐nRF24L01支持频率调谐功能,可以根据环境和应用需求进行调整。

通过设置寄存器中的频率调谐字节,可以微调nRF24L01的工作频率,以适应不同的场景。

三、数据传输和调制方式3.1 数据传输nRF24L01支持点对点和广播两种数据传输方式。

在点对点模式下,发送模块将数据发送给接收模块,实现设备之间的直接通信。

在广播模式下,发送模块将数据广播给所有接收模块。

3.2 调制方式nRF24L01采用GFSK调制方式进行数据传输。

GFSK是一种高斯频移键控调制技术,通过改变载波频率的相位来传输数字信号。

这种调制方式具有抗干扰能力强、传输速率高的优点。

亿佰特(Ebyte)-nRF24L01无线收发模块

亿佰特(Ebyte)-nRF24L01无线收发模块

E01-ML01S
E01-ML01S 用户手册v4.7
E01-ML01S 是一款体积极小、贴片型、高速率(最高可达2Mbps)的2.4GHz 无线模块,SPI 接口,收发一体;模块自带高性能PCB 板载天线,精确阻抗匹配。

该模块目前已经稳定量产,并适用于多种应用场景。

E01-ML01S采用挪威Nordic公司原装进口的nRF24L01P芯片,所有阻容感器件均采用进口元器件,尤其是晶体,我们使用了高精度宽温晶体,保证期工业特性。

硬件的专业设计使模块体积极小,便于各种嵌入开发。

注意事项E01-ML01S
驱动方式E01-ML01S
系列产品E01-ML01S
E01-ML01S
E01-ML01S 采用静电袋和圈带两种包装方式。

通常,样品或者小批量发货为静电袋包装,批量或者特殊需求发货为
圈带。

圈带包装如下:
*关于圈带信息和自动焊接的更多信息请联系技术支持
E01-ML01S 采用了微带天线。

微带天线的性能受环境影响极大,为保障最佳的性能,推荐如下安装规则。

1、模块焊接位置规则如下图示例。

2、模块安装位置应尽量远离噪声源,电磁源(如电感,晶体振荡器等)。

3、模块天线应远离金属平面,信号辐射受金属平面影响极大。

*更多安装及焊接指导请参见《E01
系列应用手册》。

nRF24L01的工作原理

nRF24L01的工作原理

nRF24L01的工作原理标题:nRF24L01的工作原理引言概述:nRF24L01是一款广泛应用于无线通信领域的射频收发模块,具有低功耗、高速率、远距离传输等特点。

本文将详细介绍nRF24L01的工作原理,包括射频通信原理、数据传输过程、工作模式、硬件结构和应用场景。

一、射频通信原理1.1 无线电频谱1.2 调制与解调1.3 射频信号传输原理二、数据传输过程2.1 数据封装与解封装2.2 数据包格式2.3 错误检测与纠正三、工作模式3.1 发射模式3.2 接收模式3.3 低功耗模式四、硬件结构4.1 射频前端4.2 数字处理单元4.3 外设接口五、应用场景5.1 无线传感器网络5.2 远程控制系统5.3 数据采集与监控正文内容:一、射频通信原理1.1 无线电频谱:nRF24L01使用的频率范围为2.4GHz,属于ISM频段,该频段不需要特殊许可证即可使用。

1.2 调制与解调:nRF24L01采用GFSK调制方式,通过改变载波频率的相位和幅度来传输数字信号。

1.3 射频信号传输原理:nRF24L01通过发送和接收两个模块之间的频率同步和数据包交换来实现无线通信。

二、数据传输过程2.1 数据封装与解封装:发送端将数据按照一定格式进行封装,接收端根据相同格式进行解封装,以确保数据的正确传输。

2.2 数据包格式:nRF24L01的数据包格式包括地址字段、数据字段和校验字段,其中地址字段用于标识发送和接收模块。

2.3 错误检测与纠正:nRF24L01采用CRC校验机制,通过检测和纠正传输过程中的错误来提高数据传输的可靠性。

三、工作模式3.1 发射模式:nRF24L01在发射模式下将数据发送至接收端,通过频率同步和数据包交换实现无线传输。

3.2 接收模式:nRF24L01在接收模式下接收来自发送端的数据,并进行解码和处理,以获取正确的信息。

3.3 低功耗模式:nRF24L01具有多种低功耗模式,可根据需求选择相应的模式以降低功耗。

nRF24L01的工作原理

nRF24L01的工作原理

nRF24L01的工作原理nRF24L01是一种低功耗2.4GHz无线收发器,常用于物联网、无线传感器网络和远程控制等应用。

它采用射频(RF)技术,能够实现可靠的无线通信,并具备较低的功耗和成本。

nRF24L01的工作原理可以分为发送和接收两个部分。

在发送端,数据通过SPI接口从主控芯片传输到nRF24L01,然后经过调制和编码处理后,以射频信号的形式发送出去。

在接收端,nRF24L01接收到射频信号后,经过解码和解调处理,将数据还原成原始数据,并通过SPI接口传输给主控芯片。

具体来说,nRF24L01的工作原理如下:1. 发送端工作原理:- 主控芯片将要发送的数据通过SPI接口传输给nRF24L01。

- nRF24L01将接收到的数据进行调制和编码处理,采用高速频移键控(GFSK)调制技术和32位CRC校验,以提高数据的可靠性。

- 经过调制和编码处理后的数据,通过射频天线以无线信号的形式发送出去。

- 发送完毕后,nRF24L01进入待机模式,等待下一次发送指令。

2. 接收端工作原理:- nRF24L01通过射频天线接收到发送端发送的无线信号。

- 接收到的信号经过解调和解码处理,将其还原成原始数据。

- nRF24L01通过SPI接口将解码后的数据传输给主控芯片。

- 主控芯片对接收到的数据进行处理,例如存储、显示或进一步处理。

为了实现可靠的无线通信,nRF24L01采用了一些关键技术和特性:- 自动重发机制:当发送端发送数据时,接收端会返回一个应答信号。

如果发送端未收到应答信号,nRF24L01会自动进行重发,以确保数据的可靠传输。

- 通道选择:nRF24L01支持多个通道,可以通过设置不同的通道来避免干扰,提高通信质量。

- 功率调节:nRF24L01支持多个功率级别的选择,可以根据实际需求进行功率调节,以平衡通信距离和功耗。

- 内置硬件加密:nRF24L01内置了硬件加密引擎,可以对数据进行加密处理,增强数据的安全性。

nRF24L01的工作原理

nRF24L01的工作原理

nRF24L01的工作原理nRF24L01是一种低功耗2.4GHz无线收发器,广泛应用于无线通信领域。

它采用射频芯片nRF24L01+,具有高度集成的特点,能够提供可靠的无线通信连接。

本文将详细介绍nRF24L01的工作原理,包括硬件结构和通信协议。

一、硬件结构nRF24L01由射频前端、基带处理器和外设接口组成。

1. 射频前端:射频前端包括射频收发器和天线开关。

射频收发器负责无线信号的调制、解调和放大,天线开关用于切换天线的收发模式。

2. 基带处理器:基带处理器负责控制射频前端的工作状态,包括发送和接收数据。

它还负责处理数据的编码、解码和差错校验。

3. 外设接口:nRF24L01提供了多种外设接口,包括SPI接口、GPIO接口和中断接口。

SPI接口用于与主控芯片进行通信,GPIO接口用于控制外部设备,中断接口用于处理外部中断信号。

二、通信协议nRF24L01采用2.4GHz的ISM频段进行无线通信,支持多种通信协议,如SPI、I2C、UART等。

其中,最常用的是SPI通信协议。

1. SPI通信协议:nRF24L01通过SPI接口与主控芯片进行通信。

SPI通信协议包括四根信号线:SCK(时钟信号)、MISO(主从数据传输)、MOSI(从主数据传输)和CSN(片选信号)。

主控芯片通过SPI接口向nRF24L01发送控制命令和数据,nRF24L01通过SPI接口将接收到的数据传输给主控芯片。

2. 数据传输:nRF24L01支持点对点和广播两种数据传输模式。

在点对点模式下,一个nRF24L01作为发送端,另一个nRF24L01作为接收端。

发送端将数据通过SPI接口发送给接收端,接收端通过SPI接口接收数据并进行处理。

在广播模式下,一个nRF24L01作为发送端,多个nRF24L01作为接收端。

发送端将数据广播给所有接收端,接收端通过SPI接口接收数据并进行处理。

三、工作原理nRF24L01的工作原理可以分为发送和接收两个过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//下面是接收的NRF24L01的程序。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include<reg52.h>#include "nrf24l01.h"#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit IRQ =P1^2;//输入sbit MISO =P1^3; //输入sbit MOSI =P1^1;//输出sbit SCLK =P1^4;//输出sbit CE =P1^5;//输出sbit CSN =P1^0;//输出uchar RevTempDate[5];//最后一位用来存放结束标志uchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址/*****************状态标志*****************************************/uchar bdata sta; //状态标志sbit RX_DR=sta^6;sbit TX_DS=sta^5;sbit MAX_RT=sta^4;/*****************SPI时序函数******************************************/ uchar NRFSPI(uchar date){uchar i;for(i=0;i<8;i++) // 循环8次{if(date&0x80)MOSI=1;elseMOSI=0; // byte最高位输出到MOSIdate<<=1; // 低一位移位到最高位SCLK=1;if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据date|=0x01; // 读MISO到byte最低位SCLK=0; // SCK置低}return(date); // 返回读出的一字节}/**********************NRF24L01初始化函数*******************************/ void NRF24L01Int(){NRFDelay(2);//让系统什么都不干CE=0;CSN=1;SCLK=0;IRQ=1;}/*****************SPI读寄存器一字节函数*********************************/ uchar NRFReadReg(uchar RegAddr){uchar BackDate;CSN=0;//启动时序NRFSPI(RegAddr);//写寄存器地址BackDate=NRFSPI(0x00);//写入读寄存器指令CSN=1;return(BackDate); //返回状态}/*****************SPI写寄存器一字节函数*********************************/ uchar NRFWriteReg(uchar RegAddr,uchar date){uchar BackDate;CSN=0;//启动时序BackDate=NRFSPI(RegAddr);//写入地址NRFSPI(date);//写入值CSN=1;return(BackDate);}/*****************SPI读取RXFIFO寄存器的值********************************/ uchar NRFReadRxDate(uchar RegAddr,uchar *RxDate,uchar DateLen){ //寄存器地址//读取数据存放变量//读取数据长度//用于接收uchar BackDate,i;CSN=0;//启动时序BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址for(i=0;i<DateLen;i++) //读取数据{RxDate[i]=NRFSPI(0);}CSN=1;return(BackDate);}/*****************SPI写入TXFIFO寄存器的值**********************************/ uchar NRFWriteTxDate(uchar RegAddr,uchar *TxDate,uchar DateLen){ //寄存器地址//写入数据存放变量//读取数据长度//用于发送uchar BackDate,i;CSN=0;BackDate=NRFSPI(RegAddr);//写入要写入寄存器的地址for(i=0;i<DateLen;i++)//写入数据{NRFSPI(*TxDate++);}CSN=1;return(BackDate);}/*****************NRF设置为发送模式并发送数据******************************/ void NRFSetTxMode(uchar *TxDate){ //发送模式CE=0;NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+P0地址使能指令+发送地址+地址宽度NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DA TA_WITDH);//写入数据/******下面有关寄存器配置**************/NRFWriteReg(W_REGISTER+EN_AA,0x01); // 使能接收通道0自动应答NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // 使能接收通道0NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a); // 自动重发延时等待250us+86us,自动重发10次NRFWriteReg(W_REGISTER+RF_CH,0x40); // 选择射频通道0x40NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益NRFWriteReg(W_REGISTER+CONFIG,0x0e); // CRC使能,16位CRC校验,上电CE=1;NRFDelay(5);//保持10us秒以上}/*****************NRF设置为接收模式并接收数据******************************/ //接收模式void NRFSetRXMode(){CE=0;NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH); // 接收设备接收通道0使用和发送设备相同的发送地址NRFWriteReg(W_REGISTER+EN_AA,0x01); // 使能接收通道0自动应答NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // 使能接收通道0NRFWriteReg(W_REGISTER+RF_CH,0x40); // 选择射频通道0x40NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH); // 接收通道0选择和发送通道相同有效数据宽度NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益NRFWriteReg(W_REGISTER+CONFIG,0x0f); // CRC使能,16位CRC校验,上电,接收模式CE = 1;NRFDelay(5);}/****************************检测是否有接收到数据******************************/void CheckACK(){ //用于发射模式接收应答信号sta=NRFReadReg(R_REGISTER+STATUS); // 返回状态寄存器if(TX_DS)NRFWriteReg(W_REGISTER+STATUS,0xff); // 清除TX_DS或MAX_RT中断标志}/*************************接收数据*********************************************/void GetDate(){sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器if(RX_DR) // 判断是否接收到数据{CE=0;//待机NRFReadRxDate(R_RX_PAYLOAD,RevTempDate,RX_DATA_WITDH);// 从RXFIFO读取数据接收4位即可,后一位位结束位NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标CSN=0;NRFSPI(FLUSH_RX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!CSN=1;}//NRFWriteReg(W_REGISTER+STA TUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标}void NRFDelay(uint t){uint x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}。

相关文档
最新文档