nRF24L01温度发送与接收程序

合集下载

NRF24L01测试发送程序

NRF24L01测试发送程序

NRF24L01测试发送程序/*对该程序做一下几点说明一、该程序仅用于测试是否发送成功,所以有两处的设置做出了调整1、SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);//频道0自动ACK应答允许(此处禁止用于测试)2、SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);//允许接收地址只有频道0(此处禁止用于测试)二、其中P3口连接的是无线模块的引脚,P2口连接的是LED 是为了显示发送数据后STA TUS的状态若使用的开发板不同,需将P2口连接到其他口观察状态寄存器的状态三、P3口一定不要接其他外部设备,如使用的开发板有其他外接设备一定要断掉。

或侧换成最小系统板进行试验四、若发送仍不成功,可以用示波器观察发送数据时的MISO口的波形判断是否为硬件问题*///***************************************************发送程序*********************************//#include#includetypedef unsigned char uchar;//****************************************NRF24L01 IO端口定义*********************************//sbit CE =P3^2;sbit CSN =P3^3;sbit SCK =P3^4;sbit M OSI =P3^5;sbit M ISO =P3^6;sbit IRQ =P3^7;//***********************************发送缓冲区***********************************************//uchar TxBuf[3]={1,2,3};//发送的数据用数字存储//*****************************NRF24L01的接收和发送地址***************************************//#define TX_ADR_WIDTH 5 // 5个字节的TX地址长度#define RX_ADR_WIDTH 5 // 5个字节的TX地址长度#define TX_PLOAD_WIDTH 3 // 20个字节的TX数据长度#define RX_PLOAD_WIDTH 3 // 20个字节的TX数据长度uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uchar 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);uchar SPI_RW(uchar num);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uchar SPI_RW_Reg(uchar reg, uchar value);uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uchar 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 inerDelay_us(unsigned char n){for(;n>0;n--)_nop_();}//*****************************************长延时*****************************************//void Delay(unsigned int s){unsigned int i;for(i=0; i<="" p="">for(i=0; i<="" p="">}//****************************************状态标志****************************************//uchar bdata sta;sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;//********************************NRF24L01初始化******************************************//void init_NRF24L01(void){inerDelay_us(100);CE=0; // 片选使能CSN=1; // SPI使能SCK=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, 0x00); // 频道0自动ACK 应答允许(此处禁止用于测试)SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00); //允许接收地址只有频道0(此处禁止用于测试),如果需要多频道可以参考Page21 SPI_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,发射功率为最大值0dBSPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送}/************************************************************** **************** **********************/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/************************************************************** **************** **********************/uchar SPI_RW(uchar num){uchar bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit{MOSI = (num & 0x80); // output 'uchar', MSB to MOSInum = (num << 1); // shift next bit into MSB..SCK = 1; // Set SCK high..num |= MISO; // capture current MISO bitSCK = 0; // ..then set SCK low again}return(num); // 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 registervalueCSN = 1; // CSN high, terminate SPI communicationreturn(reg_val); // return register value}/************************************************************** **************** **********************//*功能:NRF24L01读写寄存器函数/************************************************************** **************** **********************/uchar SPI_RW_Reg(uchar reg, uchar value){uchar status;CSN = 0; // CSN low, init SPI transactionstatus = SPI_RW(reg); // select registerSPI_RW(value); // ..and write value to it..CSN = 1; // CSN high againreturn(status); // return nRF24L01 status uchar}/************************************************************** **************** ***************************/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/****************************************************************** ************ ***************************/uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uchar status,uchar_ctr;CSN = 0; //SPI使能status = SPI_RW(reg);for(uchar_ctr=0; uchar_ctr<="" bdsfid="224" p="" uchar_ctr++)="">SPI_RW(*pBuf++);CSN = 1; //关闭SPIreturn(status); //}/************************************************************** **************** *****************************/*函数: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); // 装载数据CE=1; //置高CE激发数据发送inerDelay_us(10);}/************************************主函数************************************************************/ void main(void){init_NRF24L01() ;Delay(6000);while(1){nRF24L01_TxPacket(TxBuf); // 发送Tx buffer的数据Delay(15000); //可变P2=SPI_Read(STA TUS);Delay(10000); //可变}}。

NRF24L01的发送与接收程序

NRF24L01的发送与接收程序

N R F24L01的发送与接收程序-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN#include <>#include <>typedef unsigned char uchar;typedef unsigned char uint;SCK = 1;uchar |= MISO; then set SCK low again}return(uchar); .SPI_RW(reg);reg_val = SPI_RW(0); then read registervalueCSN = 1; and write value to it..CSN = 1;SCK = 1;uchar |= MISO; then set SCK low again}return(uchar); .SPI_RW(reg);reg_val = SPI_RW(0); then read registervalueCSN = 1; and write value to it..CSN = 1; // CSN high againreturn(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 tranactionstatus = SPI_RW(reg); // Select register to write to and read status ucharfor(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; //关闭SPIreturn(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 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,激发数据发送inerDelay_us(10);}//************************************主函数void main(void){uchar temp =0;init_NRF24L01() ;nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer dataDelay(6000);P0=0xBF;while(1){nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer dataLED=0;Delay(10000); //可变SPI_RW_Reg(WRITE_REG+STATUS,0XFF);LED=1;Delay(8000);}}。

nrf24l01工作原理

nrf24l01工作原理

nrf24l01工作原理
NRF24L01是一种低功耗2.4GHz无线收发模块,工作于
2.4GHz~2.525GHz的ISM频段。

它是由Nordic Semiconductor
公司设计和制造的。

NRF24L01的工作原理如下:
1. 发送与接收:模块既可以作为发送器发送数据,也可以作为接收器接收数据。

发送器和接收器之间通过无线信道进行通信。

2. 通信协议:NRF24L01采用了专有的GFSK调制技术和
2.4GHz无线通信协议。

它支持1Mbps、2Mbps和250kbps的
数据传输速率。

3. 通信距离:NRF24L01的通信距离取决于多个因素,如工作
频率、功率级别、天线设计等。

一般情况下,它可以在室内环境下达到10-30米的通信距离。

4. 工作模式:NRF24L01有两种工作模式:发射模式和接收模式。

在发射模式下,模块将数据发送到接收器。

在接收模式下,模块接收来自发送器的数据。

5. 通信通道和地址:NRF24L01有125个不同的通信通道,可
以在这些通道中选择一个适合的通道进行通信。

另外,可以通过设置6个字节的地址来区别不同的模块。

6. 特点:NRF24L01具有低功耗和快速开启/关闭的特点。


不需要通信时,可以将模块设置为睡眠模式以节省能量。

综上所述,NRF24L01是一种通过2.4GHz无线信号进行通信的模块,适用于低功耗的应用场景,如无线传感器网络、遥控器、无线键盘鼠标等。

nrf24l01发送接收一体程序(以调通,解决了接收端只能接收一次的问题)

nrf24l01发送接收一体程序(以调通,解决了接收端只能接收一次的问题)

nrf24l01发送接收一体程序(以调通,解决了接收端只能接收一次的问题)/**************************************************基于单片机无线报警系统主机(机载设别)系统程序/**************************************************/#include#include#define uchar unsigned char/***************************************************/#define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址#define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址uchar RX_BUF[4]={0,0,0,0};uchar TX_BUF[4]={0x20,0x20,0x20,0x20};uchar flag; //无线模块接受数据标志uchar DATA = 0x01;uchar bdata sta;unsigned int a,k; //定时器延时参数uchar mark; //传感器响应标志位uchar mark1; // 延时标志位sbit RX_DR = sta^6; //接受数据成功标志位sbit TX_DS = sta^5; // 发送成功标志位sbit MAX_RT = sta^4; //最大重发上限标志位sbit HW=P2^0; //红外感应模块输入端sbit ZD=P1^7; //震动传感器输入端sbit LED=P2^1; //LED报警器输出端sbit SDA=P2^4; //语音模块数据控制端sbit ONN=P2^3; //语音芯片电源控制端口sbit FM =P2^5; //蜂鸣器/************************************************** 函数:delayus()描述:延迟x微秒/**************************************************/void delayus(unsigned int t){while(t--);}/************************************************** 函数:delayms()描述:延迟x毫秒/**************************************************/void delayms(unsigned int h){unsigned int j;while(h--)for(j=85;j>0;j--);}/************************************************** 函数:delays()描述:延迟x.xx秒/**************************************************/void delays( float h){unsigned int i,j;h*=100;while(h--){for(i=0;i<235;i++)for(j=0;j<3;j++);}}/************************************************** 函数:sendadd()描述:语音模块发送地址信号/**************************************************/ void sendadd(unsigned char addr){uchar i;delayms(5); /* 数据信号置于低电平5ms */for(i=0;i<8;i++){ SDA=1;if(addr & 1){delayus(60); /* 高电平比低电平为600us:200us,表示发送数据1 */SDA=0;delayus(20);}else{delayus(20);SDA=0; /* 高电平比低电平为200us:600us,表示发送数据0 */ delayus(60);}addr>>=1;}SDA=1;}/**************************************************函数:SPI_RW()描述:根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节/**************************************************/uchar SPI_RW(uchar byte){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); // 返回状态寄存器}/************************************************** 函数:clear()描述:清TX_FIFO寄存器/**************************************************/void clear(){CSN=0;SPI_RW(FLUSH_TX);CSN=1;}/************************************************** 函数: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_RW_Reg(WRITE_REG + CONFIG, 0x0F); // CRC使能,16位CRC校验,上电,接收模式CE = 1;delayus(200); // 拉高CE启动接收设备}/**************************************************函数:TX_Mode()描述:这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数据发送结束后,发送模块自动转入接收模式等待应答信号。

NRF24L01详细教程

NRF24L01详细教程

NRF24L01详细教程近来课程的项目需要用到NRF24L01,用来做基本的收发,虽然资料拿到不少,但是,很多资料并不是很清晰、所带的例程并不够简洁或有不少冗余的部分,再加上对应的中文数据手册部分没翻译出来,翻译出来的不够有条理,很多地方模糊,甚至关键的地方看一两次还看不出来,导致了在学NRF24L01时花费了较多时间,所以,学完NRF24L01后,萌生了写个尽量清晰的教程的想法。

教程中的例程虽然是库开发方式,但基本都是最底层的操作才用到库函数譬如发一字节数据、GPIO置位等,虽然用的STM32,但我在看其他板子的例程时,发觉内容与流程都是差不多的,只是不同板引脚不同所导致的引脚配置的不同,不管用什么方式开发,用什么芯片,了解清楚NRF24L01如何配置,了解清楚其收发流程,基本上就会开发了,所以此文档虽然写的是以STM32为例,但看完此文档用NRF24L01基本也没什么大问题了。

教程说明:这教程是基于STMF103ZET6的,是野火的板子,例程也是从野火提供修改例程得来,用的是库开发的方式。

学习NRF24L01的步骤:1.学习SPI,SPI就是NRF24L01传送数据到单片机的一种协议,类似于USB,当然USB还是比较有难度的。

2.了解NRF24L01相关寄存器,结合中文数据手册了解NRF24L01的基本配置,收发数据前后的操作(如何启动发送接收、寄存器清空、标志位重置等)。

3.分析具体代码SPI的简介:具体的SPI教程,大家可以去野火的教程进行学习,在此只是简略介绍一下,SPI是一种一对多协议:一个主机(MCU)对应对多个从机,可以分时与多个从机通讯SPI 总线包含4 条总线,分别为SS、SCK、MOSI、MISO,其含义分别为SS:Slave Select,片选信号线,主机借此信号线选择一个从机,低电平有效。

MOSI:Master Output,Slave Input,主机数据从此线输出到从机,数据方向从主机到从机。

nRF24L01接收和发送的问题

nRF24L01接收和发送的问题

24L01是收发双方都需要编程的器件,这就对调试方法产生了一定的要求,如果两块一起调,那么通讯不成功,根本不知道是发的问题还是收的问题,不隐晦的说,我当时也是没理清调试思路才浪费了大半天时间看着模块干瞪眼。

正确的方法应该是先调试发送方,能保证发送正确,再去调接收,这样就可以有针对性的解决问题。

至于怎么去调发送方,先说下发送方的工作流程:•配置寄存器使芯片工作于发送模式后拉高CE端至少10us•读状态寄存器ST ATUS•判断是否是发送完成标志位置位•清标志•清数据缓冲网上的程序我也看过,大多都是成品,发送方发送-等应答-(自动重发)-触发中断。

可是这样的流程就已经把接收方给牵涉进来了,就是说一定要接收方正确收到数据并且回送应答信号之后发送方才能触发中断,结束一次完整的发送。

可是这跟我们的初衷不相符,我们想单独调试发送,完全抛开接收,这样就要去配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。

SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 失能通道0自动应答SPI_RW_Reg(WRITE_REG + EN_RX ADDR, 0x00); // 失能接收通道0SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); // 失能自动重发(注:以下贴出的寄存器描述由于中文资料上有一个错误,故贴出原版英文资料)有了以上这三个配置,发送方的流程就变成了发送-触发中断。

这样就抛开了接收方,可以专心去调试发送,可是怎么样才知道发送是否成功呢,要用到另外两个寄存器,ST ATUS和FIFO_ST AT US。

这样就很清晰了,我们可以通过读取ST ATUS的值来判断是哪个事件触发了中断,寄存器4、5、6位分别对应自动重发完成中断,数据发送完成中断,数据接收完成中断。

也就是说,在之前的配置下,如果数据成功发送,那么ST ATUS的值应该为0x2e。

NRF24L01t调试程序 含发送和接收 可直接用

NRF24L01t调试程序   含发送和接收 可直接用

//***SPI(nRF24L01) 寄存器地址**************************************************** #define CONFIG #define EN_AA 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式 0x01 // 自动应答功能设置
说实话,对于一个初次调试这个模块的同学,想要找一个直接可用的程序不好找,同时是找到的片 段程序很多又是木有注释的,我们(菜鸟)没有很好的理解芯片资料的能力,看着都是一头雾水。 在这儿,我贴出发送和接收两部分,希望可以让学习者轻松一点理解和掌握其操作流程。同时声明 一下,下面的程序不是我写的,但是99%的注释是我写的,对于掌握的人来说,不需要这样多的注 释,我是面对需要学习的人而写的。这样也算是我对电子技术给我的乐趣的回馈。在没有和程序作 所 帮助! 注释的位置需要调整一下哦 以下是发送端程序: #include <reg52.h> #include <intrins.h> #define MODE 0 //MODE=1时为发送代码 typedef unsigned char uchar; //************************************************IO 端口定义***************** sbit MISO = P2^3; sbit MOSI = P2^2; sbit SCK = P2^1; sbit CE = P2^5; sbit CSN = P2^0; sbit IRQ = P3^2; sbit led = P1^2; //***************************************************************************** uchar bdata sta; //状态标志 sbit RX_DR = sta^6; sbit TX_DS = sta^5; sbit MAX_RT = sta^4; MODE=0时为接收代码

nRF24L01的工作原理

nRF24L01的工作原理

nRF24L01的工作原理nRF24L01是一种低功耗2.4GHz无线收发器,广泛应用于物联网、传感器网络和无线通信系统等领域。

它采用射频(RF)技术,能够在无线环境中实现高速数据传输和可靠的通信连接。

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

一、硬件结构nRF24L01由射频前端、基带处理器和外围电路组成。

射频前端包括功率放大器、低噪声放大器和射频开关等,用于接收和发送无线信号。

基带处理器负责信号调制、解调和协议处理等功能。

外围电路包括晶振、电源管理和SPI接口等,用于提供稳定的时钟和电源,并与主控设备进行通信。

二、通信协议nRF24L01使用2.4GHz的ISM频段,采用射频通信协议来实现数据传输。

它支持多种通信模式,包括点对点模式、广播模式和多点模式等。

在点对点模式下,一个nRF24L01作为发送器,另一个nRF24L01作为接收器,它们之间通过射频信道进行数据交换。

在广播模式下,一个nRF24L01可以同时向多个接收器发送数据。

在多点模式下,多个nRF24L01可以互相通信,形成一个网络。

nRF24L01使用GFSK调制和解调技术,通过改变载波频率的相位和幅度来传输数字信号。

它还使用自适应频率跳频技术,可以在不同的射频信道上工作,以避免干扰和提高通信质量。

此外,nRF24L01还支持数据包重传、自动应答和信道切换等功能,以提高通信的可靠性和稳定性。

三、工作模式nRF24L01有两种工作模式:发送模式和接收模式。

在发送模式下,nRF24L01将待发送的数据加载到发送缓冲区,并通过射频信道发送给接收器。

在接收模式下,nRF24L01监听射频信道,接收来自发送器的数据,并将其存储在接收缓冲区中。

发送器和接收器之间通过射频信道进行双向通信,以实现数据的传输和交换。

nRF24L01还支持睡眠模式和待机模式,以降低功耗。

在睡眠模式下,nRF24L01关闭大部分电路,只保持少量的关键电路运行,以便快速唤醒和恢复正常工作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define FLUSH_RX 0xE2 // Define flush RX register command
#define REUSE_TX_PL 0xE3 // Define reuse TX payload register command
#define NOP 0xFF // Define No Operation, might be used to read status register
sbit IRQ = P1^2; // Interrupt signal, from nRF24L01 (input)
sbit MISO= P1^3; // Master In, Slave Out pin (input)
sbit SCLK= P1^4; // Serial Clock pin, (output)
#define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址
#define TX_PLOAD_WIDTH 4 //数据通道有效数据宽度
uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; //定义一个静态发送地址
#define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address
#define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address
#define RX_PW_P5 0x16 // 'RX payload width, pipe5' register address
Byte |=MISO; //读MISO到byte最低位
SCLK=0; // SCK置低
}
return Byte; //返回读出的一字节
}
/*写数据value到reg寄存器*/
uchar SPI_Write_Read_Register(uchar Reg,uchar value)
{
uchar Status;
SPI_Write_Read_Register(WRITE_REG + EN_RXADDR, 0x01); //使能接收通道0
SPI_Write_Read_Register(WRITE_REG + RF_CH, 0x00); //选择射频通道0x00
SPI_Write_Read_Register(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); //接收通道0选择和发送通道相同有效数据宽度
for(i=0;i<Bytes;i++)
{
SPI_Write_Read(Buf[i]); //逐个字节写入nRF24L01
}
CSN=1; // CSN拉高,结束数据传输
return Status; //返回状态寄存器
}
/*设置nRF24L01为接收模式,等待接收发送设备的数据包*/
/*void RX_Mode(void)
#include <reg52.h>
#include <mБайду номын сангаасth.h>
#include <stdio.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
/***************************************************/
/*uchar SPI_Read(uchar Reg)
{
uchar result;
CSN=0; // CSN置低,开始传输数据
SPI_Write_Read(Reg); //选择寄存器
result=SPI_Write_Read(0); //然后从该寄存器读数据
CSN=1; // CSN拉高,结束数据传输
#define RD_RX_PLOAD 0x61 // Define RX payload register address
#define WR_TX_PLOAD 0xA0 // Define TX payload register address
#define FLUSH_TX 0xE1 // Define flush TX register command
SPI_Write_Read_Register(WRITE_REG + RF_SETUP, 0x07); //数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_Write_Read_Register(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式
CE=1;//拉高CE启动接收设备
#define RX_ADDR_P4 0x0E // 'RX address pipe4' register address
#define RX_ADDR_P5 0x0F // 'RX address pipe5' register address
#define TX_ADDR 0x10 // 'TX address' register address
#define RF_CH 0x05 // 'RF channel' register address
#define RF_SETUP 0x06 // 'RF setup' register address
#define STATUS 0x07 // 'Status' register address
#define RX_ADDR_P1 0x0B // 'RX address pipe1' register address
#define RX_ADDR_P2 0x0C // 'RX address pipe2' register address
#define RX_ADDR_P3 0x0D // 'RX address pipe3' register address
{
CE=0;
SPI_Write_Buffer(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);//接收设备接收通道0使用和发送设备相同的发送地址
SPI_Write_Read_Register(WRITE_REG + EN_AA, 0x01); //使能接收通道0自动应答
#define EN_RXADDR 0x02 // 'Enabled RX addresses' register address
#define SETUP_AW 0x03 // 'Setup address width' register address
#define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address
return result; //返回寄存器数据
} */
/*从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址*/
/*uchar SPI_Read_Buffer(uchar Reg,uchar *Buf,uchar Bytes)
{
uchar Status,i;
CSN=0; // CSN置低,开始传输数据
uchar SPI_Write_Read(uchar Byte)
{
uchar i;
for(i=0;i<8;i++) //循环8次
{
MOSI=(Byte&0x80); // byte最高位输出到MOSI
Byte<<=1; //低一位移位到最高位
SCLK=1; //拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
sbit CE = P1^5; // Master Out, Slave In pin (output)
// SPI(nRF24L01) commands
#define READ_REG 0x00 // Define read command to register
#define WRITE_REG 0x20 // Define write command to register
#define FIFO_STATUS 0x17 // 'FIFO Status Register' register address
uchar bdata Sta;
uchar code Dis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阳数码管花数。
// SPI(nRF24L01) registers(addresses)
#define CONFIG 0x00 // 'Config' register address
#define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address
Status=SPI_Write_Read(Reg); //选择寄存器,同时返回状态字
for(i=0;i<Bytes;i++)
{
Buf[i]=SPI_Write_Read(0);//逐个字节从nRF24L01读出
相关文档
最新文档