nrf24l01无线模块NRF24L01模块收发c程序

合集下载

基于nRF24L01的无线通信模块设计

基于nRF24L01的无线通信模块设计

1前言 (2)2总体方案设计 (3) (3)图2.1无线通信模块框图 (3)3单元模块设计 (4)3.1 nRF24L01的简单介绍 (4)3.2 STC89C52的简单介绍 (6)3.3 LCD1602的简单介绍 (7)3.4 其它的器件 (8)3.5 各单元模块的联系 (8)4软件设计 (9)5系统调试 (10)5.1主要问题及分析 (10)5.2调试工具 (10)6系统功能、指标参数 (11)6.1系统能实现的功能 (11)6.2系统指标参数测试 (11)6.3系统的指标功能及参数分析 (11)7结论 (12)8总结与体会 (13)9参考文献 (14)10附录 (15)10.1相关设计图 (15) (15) (16)图10.2无线收发模块电路原理总图 (16)图10.3正5V电源模块图 (16)10.2相关的程序 (20)1前言本次我们三人小组设计的是无线通信模块,根据设计要求我们选择了无线收发模块nRF24L01、单片机STC89C52、LCD1602和键盘模块等作为本次设计的硬件需求。

首先我们与老师一起讨论了一些设计的相关事宜和设计思路。

接下来我们一起画好了模拟电路图,在老师的帮助下我们对电路图进行了补充和完善。

完成这些基本工作后,在老师和同学的帮助下我们买回了自己所需的元器件。

接着我们变分工完成了元器件的焊接连接和程序的编写,然后便是模块的上电调试,设计的答辩和设计报告的完善。

我们本次之所以会选择无线通信模块的设计,是我们觉得无线通信技术是现代社会中一门很重要的技术,我们掌握好了这门技术对以后我们的工作生活都有很大的帮助。

我们本次设计的无线通信模块虽然只是我们的一次小小的体验,但我们都知道无线通信在我们现在所处的信息时代是多么的重要,如今我们生活的方方面面无不与无线通信息息相关。

我们所熟悉的手机、电脑、电视等等都与无线通信有着直接的联系。

甚至在某些高端领域方面无线通信技术能反映一个国家的科技水平和综合国力。

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收发程序

/******* ******** ******** ******** ******** ******** ******** ******** ******** ******* ******** ******** ******/ 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的工作原理

nRF24L01的工作原理

nRF24L01的工作原理nRF24L01是一款低功耗、高性能的2.4GHz无线收发模块,广泛应用于物联网、无线传感器网络和远程控制等领域。

它采用射频(RF)技术,能够在不需要复杂的网络设置和配置的情况下,实现设备之间的无线通信。

nRF24L01的工作原理主要包括以下几个方面:1. 射频通信:nRF24L01采用2.4GHz频段的射频信号进行通信。

它支持GFSK调制方式,并提供多个可选的通信通道。

在发送端,数据通过SPI接口输入到nRF24L01的发送缓冲区,经过调制后,以射频信号的形式发送出去。

在接收端,nRF24L01接收到射频信号后,进行解调和解码,将数据恢复成原始的数字信号,并通过SPI接口输出。

2. 发送和接收模式:nRF24L01有两种工作模式,分别是发送模式和接收模式。

在发送模式下,nRF24L01将发送缓冲区中的数据通过射频信号发送出去。

在接收模式下,nRF24L01接收到射频信号后,将数据存储在接收缓冲区中,等待主机读取。

3. 网络配置:nRF24L01支持多个通信通道和多个地址管道,可以通过设置不同的通道和地址,实现多个设备之间的无线通信。

每个设备都有一个唯一的地址,用于区分不同的设备。

通过配置不同的通道和地址,可以避免设备之间的干扰。

4. 自动重传和自动确认:nRF24L01具有自动重传和自动确认功能。

在发送数据时,nRF24L01可以自动重传数据,以确保数据的可靠传输。

同时,接收端的nRF24L01可以发送确认信号给发送端,告知数据已经成功接收。

如果发送端没有收到确认信号,会自动重传数据,以提高数据传输的可靠性。

5. 低功耗设计:nRF24L01采用了低功耗设计,可以在不同的睡眠模式之间切换,以降低功耗。

在睡眠模式下,nRF24L01的功耗非常低,适用于电池供电的应用场景。

总结:nRF24L01是一款功能强大的2.4GHz无线收发模块,具有射频通信、发送和接收模式、网络配置、自动重传和自动确认、低功耗设计等特点。

无线模块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无线模块讲解解析

增强型的ShockBurst TM 模式
• nRF24L01配置为增强型的ShockBurst TM 模式 下时,只 要MCU有数据要发送,nRF24L01就会自动启动 ShockBurst TM模式来发送数据。在发送完数据后 nRF24L01转到接收模式,并等待终端的应答信号。如果 没有收到应答信号,nRF24L01将重发相同的数据包,直 到收到应答信号或重发次数超过SETUP_RETR_ARC寄 存器中设置的值为止,如果重发次数超过了设定值,则产 生MAX_RT中断。 • 只要接收到确认信号,nRF24L01就认为最后一包数据已 经发送成功(接收方已经收到数据),把TX FIFO中的数 据清除掉并产生TX_DS中断(IRQ引脚置高)。
增强型ShockBurstTM 接收模式
• 1、 ShockBurstTM 接收模式是通过设置寄存器中 PRIM_RX 位为高来选择的。准备接收数据的通道必须被 使能(EN_RXADDR 寄存器),所有工作在增强型 ShockBurstTM 模式下的数据通道的自动应答功能是由 (EN_AA 寄存器)来使能的,有效数据宽度是由 RX_PW_Px 寄存器来设置的。地址的建立过程见增强型 ShockBurstTM 发送章节。 • 2、 接收模式由设置CE 为高来启动。 • 3、 130us 后nRF24L01 开始检测空中信息。
数据通道
• 数据通道0 是唯一的一个可以配置为40 位自身地址的数据通道。1~5 数据通道都为8 位自身地址和32 位公用地址。所有的数据通道都可以 设置为增强型ShockBurst 模式。
寄存器配置
• nRF24L01所有的寄存器都是通过SPI口进行配置的(寄存器配置详见 附件)。CSN为低后,SPI接口等待指令执行。每一条指令都必须通 过一次CSN由高到低的变化。 • SPI指令格式:

NRF24L01高速嵌入式无线数传模块 说明书

NRF24L01高速嵌入式无线数传模块 说明书

NRF24L01高速嵌入式无线数传模块说明书2008年12月20日一、产品特性2.4GHz全球开放ISM频段,最大0dBm发射功率,免许可证使用支持六路通道的数据接收低工作电压:1.9~3.6V低电压工作高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率)多频点:125频点,满足多点通信和跳频通信需要超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线) 低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。

低应用成本:NRF24L01集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等,NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。

便于开发:由于链路层完全集成在模块上,非常便于开发。

自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制自动存储未收到应答信号的数据包自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程载波检测—固定频率检测内置硬件CRC检错和点对多点通信地址控制数据包传输错误计数器及载波检测功能可用于跳频设置可同时设置六路接收通道地址,可有选择性的打开接收通道 标准插针Dip2.54MM间距接口,便于嵌入式应用二、基本电气特性三、引脚说明说明:1)VCC脚接电压范围为1.9V~3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。

推荐电压3.3V左右。

(2)除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。

当然对3V左右的单片机更加适用了。

(3)硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以了(a:与51系列单片机P0口连接时候,需要加10K的上拉电阻,与其余口连接不需要。

NRF24L01全双工调试程序 自动切换收发模式 可用于实现对讲机

NRF24L01全双工调试程序 自动切换收发模式 可用于实现对讲机
#define RX_ADDR_P1 0x0B //频道1接收数据地址
#define RX_ADDR_P2 0x0C //频道2接收数据地址
#define RX_ADDR_P3 0x0D //频道3接收数据地址
#define R据地址
#define RX_ADDR_P5 0x0F //频道5接收数据地址
函数:uchar SPI_Read(uchar reg)
功能:NRF24L01的SPI时序
#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
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//接收地址
//***************************************NRF24L01寄存器指令**********************************//
#define EN_AA 0x01 //自动应答功能设置
#define EN_RXADDR 0x02 //可用信道设置
#define SETUP_AW 0x03 //收发地址宽度设置
#define SETUP_RETR 0x04 //自动重发功能设置
#define RF_CH 0x05 //工作频率设置
//NRF24L01调试程序,全双工双向通信,即两个模块兼具收发功能,自动高速切换收发模式。

关于NRF24L01无线模块的C52双向通讯C程序(中文详解)

关于NRF24L01无线模块的C52双向通讯C程序(中文详解)
SCK = 0; // SCK置低 ..then set SCK low again
}
return(dat); //返回读出的一字节 return Fra bibliotekead dat
}
uchar SPI_Read(uchar reg)
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个字节,通常用来
reg_val = SPI_RW(0); //然后从该寄存器读数据 ..then read registervalue
CSN = 1; //CSN拉高,结束数据传输 CSN high, terminate SPI communication
return(reg_val); //返回寄存器数据 return register value
//射通道数据或接收/发送地址
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); //数据读取后放入rx_buf接收缓冲区中
void nRF24L01_TxPacket(unsigned char * tx_buf); //发送 tx_buf中数据
#define RX_ADDR_P2 0x0C // 频道2接收数据地址
#define RX_ADDR_P3 0x0D // 频道3接收数据地址

无线模块nrf24l01中文资料_引脚图及引脚定义_电路原理及实例

无线模块nrf24l01中文资料_引脚图及引脚定义_电路原理及实例

无线模块nrf24l01中文资料_引脚图及引脚定义_电路原理及实例
一、无线模块nrf24l01中文资料nrf24l01简介nRF24.L01是一款新型单片射频收发器件,工作于2.4GHz~2.5GHzISM频段。

内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。

nRF24L01功耗低,在以-6dBm的功率发射时,工作电流也只有9mA;接收时,工作电流只有12.3mA,多种低功率工作模式,工作在100mw时电流为160mA,在数据传输方面实现相对WiFi距离更远,但传输数据量不如WiFi(掉电模式和空闲模式)使节能设计更方便。

主要特点:
GFSK调制:
硬件集成OSI链路层;
具有自动应答和自动再发射功能;
片内自动生成报头和CRC校验码;
数据传输率为lMb/s或2Mb/s;
SPI速率为0Mb/s~10Mb/s;
125个频道:
与其他nRF24系列射频器件相兼容;
QFN20引脚4mm4mm封装;
供电电压为1.9V~3.6V。

传输距离《5m
二、无线模块nrf24l01中文资料nrf24l01引脚图及引脚定义1、nrf24l01引脚图
2、nrf24l01引脚功能
三、无线模块nrf24l01中文资料nrf24l01电路原理1、工作模式。

无线模块nrf24l01中文资料

无线模块nrf24l01中文资料

无线模块nrf24l01中文资料
一、 无线模块nrf24l01中文资料nrf24l01简介
nRF24.L01是一款新型单片射频收发器件,工作于
2.4GHz~2.5GHzISM频段。

内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。

nRF24L01功耗低,在以-6dBm的功率发射时,工作电流也只有9mA;接收时,工作电流只有12.3mA,多种低功率工作模式,工作在100mw时电流为160mA,在数据传输方面实现相对WiFi距离更远,但传输数据量不如WiFi(掉电模式和空闲模式)使节能设计更方便。

主要特点:
GFSK调制:
硬件集成OSI链路层;
具有自动应答和自动再发射功能;。

无线模块24L01双向收发

无线模块24L01双向收发

先发后接:/****************************************************************************** *****************************///hc-sr04 超声波测距模块DEMO 程序//晶振:11.0592//接线:模块TRIG接P3.6 ECH0 接p3.5//数码管:共阴数码管P2接数据口,P1.0 P1.1 P1.2接选通数码管/****************************************************************************** *****************************/#include <reg52.h> //器件配置文件#include <intrins.h>typedef unsigned char uchar;typedef unsigned char uint;//***************************************************************************** **************#define TX_ADR_WIDTH 1 // 5 uints TX address width#define RX_ADR_WIDTH 1 // 5 uints RX address width#define TX_PLOAD_WIDTH 1 // 20 uints TX payload#define RX_PLOAD_WIDTH 1 // 20 uints TX payloaduint const TX_ADDRESS[TX_ADR_WIDTH]= {0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {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);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 delayus(unsigned int i);void delayms(unsigned int k);void write_command(unsigned char command);void write_data(unsigned char dat);void init_1602();uchar RxBuf[1]; //存放接收到的数据uchar TxBuf[1]; //需要发送的数据//***************************************************************************** *************uint bdata sta; //状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;//****************************************NRF24L01端口定义***************************************sbit M ISO =P1^5;sbit M OSI =P1^1;sbit SCK =P1^6;sbit CE =P1^7;sbit CSN =P1^2;sbit IRQ =P3^2;//1602控制端口sbit rs_1602=P0^0;sbit rw_1602=P0^1;sbit en_1602=P0^2;unsigned char a,b; //a用于接收的,b用于发送的/*以下为无线模块*///NRF24L01初始化void init_NRF24L01(void){delayus(100);CE=0; // chip enableCSN=1; // Spi disableSCK=0; // Spi clock line init highSPI_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// SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收// SPI_RW_Reg(WRITE_REG + CONFIG, 0xbf);}//函数: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 MOSIuchar = (uchar << 1); // shift next bit into MSB..SCK = 1; // Set SCK high..uchar |= MISO; // capture current MISO bitSCK = 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 registervalueCSN = 1; // CSN high, terminate SPI communicationreturn(reg_val); // return register value}//功能:NRF24L01读写寄存器函数uint SPI_RW_Reg(uchar reg, uchar value){uint 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_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;delayus(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+STA TUS,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,激发数据发送delayus(10);}//通过串口将接收到数据发送给PC端void R_S_Byte(uchar R_Byte){SBUF = R_Byte;while( TI == 0 ); //查询法TI = 0;}/*无线模块到此为止*//*以下为延时模块*///延时1MS函数void delayms(unsigned int k){unsigned int j,i;for(j=k;j>0;j--)for(i=110;i>0;i--);}//延时1us函数void delayus(unsigned int i){for(;i>0;i--);}/*延时模块到此为止*//*以下为LCD1602模块*///1602写指令函数void write_command(unsigned char command)//写指令函数{rs_1602=0;rw_1602=0;en_1602=0;delayms(2);P2=command;delayus(2);en_1602=1;delayms(3);en_1602=0;}//1602写数据函数void write_data(unsigned char dat)//写数据函数{rs_1602=1;rw_1602=0;en_1602=0;delayms(2);P2=dat;delayus(2);en_1602=1;delayms(3);en_1602=0;}//1602初始化程序void init_1602()//初始化{write_command(0x01);//清屏write_command(0x38);//设置16*2显示,5*7点阵,8位数据口write_command(0x0c);//开显示、显示光标write_command(0x80);//写1062初始地址,0x80为1602第一行第一个地址}/*LCD1602模块到此为止*/void main(){a=1;b=1;TxBuf[0]=5;RxBuf[0]=0;init_1602(); //1602初始化init_NRF24L01(); //无线通信24L01初始化delayms(300);EA=1; //开启总中断EX0=1;//开外部中断1IT0=1;//下降沿触发while(1){SPI_RW_Reg(WRITE_REG + CONFIG, 0xfe); //24L01处于发送状态delayms(30);nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer datadelayms(30); //可变SPI_RW_Reg(WRITE_REG+STATUS,0XFF);delayms(30);while(b){a=1;TxBuf[0]++;if(TxBuf[0]>9)TxBuf[0]=0;break;}SPI_RW_Reg(WRITE_REG + CONFIG, 0xbf); //24L01处于接收状态SetRX_Mode(); //等待接受数据,在接受数据前要写这条指令delayms(300);while(a) //接收循环,中断函数中成功接收数据后,退出该循环{_nop_();}write_command(0x80);write_data(0x30+RxBuf[0]%10);}}void zhongd() interrupt 0 //外部中断函数{uchar i,j=1,temp;while(j){if(nRF24L01_RxPacket(RxBuf)) //接收数据{temp++;for(i=0;i<1;i++){R_S_Byte(RxBuf[i]);delayms(3);}j=0; //通过无线接收到的数据存入RxBuf[0]后再退出中断}}a=0; //接收到数据后,退出接收循环(循环在主函数里面进行)b=1; //接收到数据后,进入发送循环(循环在主函数里面进行)}先接后发:/****************************************************************************** *****************************///hc-sr04 超声波测距模块DEMO 程序//晶振:11.0592//接线:模块TRIG接P3.6 ECH0 接p3.5//数码管:共阴数码管P2接数据口,P1.0 P1.1 P1.2接选通数码管/****************************************************************************** *****************************/#include <reg52.h> //器件配置文件#include <intrins.h>typedef unsigned char uchar;typedef unsigned char uint;//***************************************************************************** **************#define TX_ADR_WIDTH 1 // 5 uints TX address width#define RX_ADR_WIDTH 1 // 5 uints RX address width#define TX_PLOAD_WIDTH 1 // 20 uints TX payload#define RX_PLOAD_WIDTH 1 // 20 uints TX payloaduint const TX_ADDRESS[TX_ADR_WIDTH]= {0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {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);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 delayus(unsigned int i);void delayms(unsigned int k);void write_command(unsigned char command);void write_data(unsigned char dat);void init_1602();uchar RxBuf[1]; //存放接收到的数据uchar TxBuf[1]; //需要发送的数据//***************************************************************************** *************uint bdata sta; //状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;//****************************************NRF24L01端口定义***************************************sbit M ISO =P3^5;sbit M OSI =P3^1;sbit SCK =P3^6;sbit CE =P3^3;sbit CSN =P3^0;sbit IRQ =P3^2;//LCD12864端口定义sbit rs_12864=P1^0;sbit rw_12864=P1^1;sbit en_12864=P1^2;sbit psb_12864=P3^7;unsigned char a,b; //a用于接收的,b用于发送的/*以下为无线模块*///NRF24L01初始化void init_NRF24L01(void){delayus(100);CE=0; // chip enableCSN=1; // Spi disableSCK=0; // Spi clock line init highSPI_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// SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收// SPI_RW_Reg(WRITE_REG + CONFIG, 0xbf);}//函数: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 MOSIuchar = (uchar << 1); // shift next bit into MSB..SCK = 1; // Set SCK high..uchar |= MISO; // capture current MISO bitSCK = 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 registervalueCSN = 1; // CSN high, terminate SPI communicationreturn(reg_val); // return register value}//功能:NRF24L01读写寄存器函数uint SPI_RW_Reg(uchar reg, uchar value){uint 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_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;delayus(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+STA TUS,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,激发数据发送delayus(10);}//通过串口将接收到数据发送给PC端void R_S_Byte(uchar R_Byte){SBUF = R_Byte;while( TI == 0 ); //查询法TI = 0;}/*无线模块到此为止*//*以下为延时模块*///延时1MS函数void delayms(unsigned int k){unsigned int j,i;for(j=k;j>0;j--)for(i=110;i>0;i--);}//延时1us函数void delayus(unsigned int i){for(;i>0;i--);}/*延时模块到此为止*//*LCD12864模块如下*/void wcom_12864(unsigned char command){rs_12864=0;//写指令rw_12864=0;en_12864=0;delayus(3);en_12864=1;P2=command;delayms(3);en_12864=0;}void wdata_12864(unsigned char dat){rs_12864=1;rw_12864=0;en_12864=0;delayus(3);en_12864=1;P2=dat;delayms(3);en_12864=0;}void init_12864(){psb_12864=1;wcom_12864(0x01);//清屏delayms(1);wcom_12864(0x38);delayms(1);wcom_12864(0xc0);delayms(1);wcom_12864(0x0c);delayms(1);}/*LCD12864模块到此为止*/void main(){a=1;b=1;TxBuf[0]=0x00;RxBuf[0]=0x00;init_12864(); //12864初始化init_NRF24L01(); //无线通信24L01初始化delayms(300);EA=1; //开启总中断EX0=1;//开外部中断1IT0=1;//下降沿触发while(1){SPI_RW_Reg(WRITE_REG + CONFIG, 0xbf); //24L01处于接收状态SetRX_Mode(); //等待接受数据,在接受数据前要写这条指令delayms(300);while(a) //接收循环,中断函数中成功接收数据后,退出该循环{_nop_();}delayms(1000); //改变这个延时函数可以改变连续两次收发的间隔,从处理器加了这个延时函数后,主控制器即使不加也是可以的wcom_12864(0x80);wdata_12864(0x30+RxBuf[0]%10);SPI_RW_Reg(WRITE_REG + CONFIG, 0xfe); //24L01处于发送状态delayms(30);nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer datadelayms(30); //可变SPI_RW_Reg(WRITE_REG+STATUS,0XFF);delayms(30);while(b){a=1;TxBuf[0]+=2;if(TxBuf[0]>9)TxBuf[0]=0;break;}}}void zhongd() interrupt 0 //外部中断函数{uchar i,j=1,temp;while(j){if(nRF24L01_RxPacket(RxBuf)) //接收数据{temp++;for(i=0;i<1;i++){R_S_Byte(RxBuf[i]);delayms(3);}j=0; //通过无线接收到的数据存入RxBuf[0]后再退出中断}}a=0; //接收到数据后,退出接收循环(循环在主函数里面进行)b=1; //接收到数据后,进入发送循环(循环在主函数里面进行)}。

nRF24L01模块介绍

nRF24L01模块介绍

nRF24L01芯片(模块)介绍nRF24L01芯片(模块)简介nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。

无线收发器包括:频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。

输出功率频道选择和协议的设置可以通过SPI 接口进行设置。

几乎可以连接到各种单片机芯片,并完成无线数据传送工作。

极低的电流消耗:当工作在发射模式下发射功率为0dBm 时电流消耗为11.3mA ,接收模式时为12.3mA,掉电模式和待机模式下电流消耗更低。

nRF24L01芯片(模块)功能1、真正的GFSK单片式收发芯片。

2、内置硬件链路层。

3、增强型ShockBurst TM功能。

4、自动应答及自动重发功能。

5、地址及CRC检验功能。

6、无线速率:1或2Mbps7、SPI接口速率:0~8Mbps。

8、125个可选工作频道。

9、很短的频道切换时间,可用于跳频。

10、Nrf24XX系列完全兼容。

11、I/O可接受5V电平的输入。

12、20脚QFN 4X4mm封装。

13、极低成本晶振±60ppm。

14、低工作电压:1.9~3.6V。

nRF24L01芯片(模块)应用领域1、无线鼠标,键盘,游戏机操纵杆。

2、无线数据通讯。

3、无线门禁。

4、安防系统。

5、遥控装置。

6、遥感勘测。

7、智能运动设备。

8、工业传感器。

9、玩具。

nRF24L01芯片(模块)结构方框图nRF24L01芯片(模块)引脚及其功能。

NRF24L01无线模块C语言程序

NRF24L01无线模块C语言程序

NRF24L01无线模块C语言程序24MHz晶振#include#include#include#include#include#include#define U8 unsigned char#define U16 unsigned int#define TX_ADDR_WITDH 5 //发送地址宽度设置为5个字节#define RX_ADDR_WITDH 5 //接收地址宽度设置为5个字节#define TX_DATA_WITDH 1//发送数据宽度1个字节#define RX_DATA_WITDH 1//接收数据宽度1个字节#define R_REGISTER 0x00//读取配置寄存器#define W_REGISTER 0x20//写配置寄存器#define R_RX_PAYLOAD 0x61//读取RX有效数据#define W_TX_PAYLOAD 0xa0//写TX有效数据#define FLUSH_TX 0xe1//清除TXFIFO寄存器#define FLUSH_RX 0xe2//清除RXFIFO寄存器#define REUSE_TX_PL 0xe3//重新使用上一包有效数据#define NOP 0xff//空操作#define CONFIG 0x00//配置寄存器#define EN_AA 0x01//使能自动应答#define EN_RXADDR 0x02//接收通道使能0-5个通道#define SETUP_AW 0x03//设置数据通道地址宽度3-5 #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//P0通道数据宽度设置#define RX_PW_P1 0x12//P1通道数据宽度设置#define RX_PW_P2 0x13//P2通道数据宽度设置#define RX_PW_P3 0x14//P3通道数据宽度设置#define RX_PW_P4 0x15//P4通道数据宽度设置#define RX_PW_P5 0x16//P5通道数据宽度设置#define FIFO_STATUS 0x17//FIFO状态寄存器//NRF24L01U8 NRFACK();U8 NRFSPI(U8 date);U8 NRFReadReg(U8 RegAddr);U8 NRFWriteReg(U8 RegAddr,U8 date);U8 NRFReadRxDate(U8 RegAddr,U8 *RxDate,U8 DateLen);U8 NRFWriteTxDate(U8 RegAddr,U8 *TxDate,U8 DateLen);U8 NRFRevDate(U8 *RevDate);void NRFSetTxMode(U8 *TxDate);void NRF24L01Int();void NRFSetRXMode();U8 CheckACK();void Delay(U16 t);U8 bdata sta;//mainvoid Delay_10ms(U16 del);bit CE=P1^4; //RX/TX模式选择端sbit IRQ=P1^1; //可屏蔽中断端sbit CSN=P1^6; //SPI片选端//就是SSsbit MOSI=P1^0; //SPI主机输出从机输入端1sbit MISO=P1^2; //SPI主机输入从机输出端sbit SCLK=P1^3; //SPI时钟端U8 code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址U8 bdata sta; //状态标志sbit RX_DR=sta^6;sbit TX_DS=sta^5;sbit MAX_RT=sta^4;void Delay(U16 t){U16 x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}U8 NRFSPI(U8 date){U8 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); // 返回读出的一字节}void NRF24L01Int(){Delay(2);//让系统什么都不干CE=0; //待机模式1CSN=1;SCLK=0;IRQ=1;}U8 NRFReadReg(U8 RegAddr){U8 BackDate;CSN=0;//启动时序NRFSPI(RegAddr);//写寄存器地址BackDate=NRFSPI(0x00);//写入读寄存器指令CSN=1;return(BackDate); //返回状态}U8 NRFWriteReg(U8 RegAddr,U8 date){U8 BackDate;CSN=0;//启动时序BackDate=NRFSPI(RegAddr);//写入地址NRFSPI(date);//写入值CSN=1;return(BackDate);}U8 NRFReadRxDate(U8 RegAddr,U8 *RxDate,U8 DateLen){ //寄存器地址//读取数据存放变量//读取数据长度//用于接收 U8 BackDate,i;CSN=0;//启动时序BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址for(i=0;i{RxDate[i]=NRFSPI(0);}CSN=1;return(BackDate);}U8 NRFWriteTxDate(U8 RegAddr,U8 *TxDate,U8 DateLen){ //寄存器地址//写入数据存放变量//读取数据长度//用于发送 U8 BackDate,i;CSN=0;BackDate=NRFSPI(RegAddr);//写入要写入寄存器的地址for(i=0;i{NRFSPI(*TxDate++);}CSN=1;return(BackDate);}void NRFSetTxMode(U8 *TxDate){//发送模式CE=0;NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+接收地址使能指令+接收地址+地址宽度NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_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;Delay(5);//保持10us秒以上}//主要接收模式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;Delay(5);//保持10us秒以上}U8 CheckACK(){ //用于发射sta=NRFReadReg(R_REGISTER+STATUS);// 返回状态寄存器if(TX_DS||MAX_RT) //发送完毕中断{NRFWriteReg(W_REGISTER+STATUS,0xff); // 清除TX_DS或MAX_RT 中断标志CSN=0;NRFSPI(FLUSH_TX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!CSN=1;return(0);}elsereturn(1);}//用于接收模式U8 NRFRevDate(U8 *RevDate){U8 RevFlags=0;sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器 if(RX_DR) // 判断是否接收到数据{CE=0; //SPI使能NRFReadRxDate(R_RX_PAYLOAD,RevDate,RX_DATA_WITDH);// 从RXFIFO读取数据RevFlags=1; //读取数据完成标志}NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标return(RevFlags);}void Delay_10ms(U16 del){U16 i,j;for(i=0; i<del; i++)for(j=0; j<1827; j++) //这个是通过软件仿真得出的数;}// 做发射main(){U8 TxDate[1]={0};NRF24L01Int();Delay(6000);while(1){if(KEY==0){if(KEY==0){Delay_10ms(2);TxDate[0]=0x08;//发射按键标识值NRFSetTxMode(TxDate);while(CheckACK());TxDate[0]=0;}}}}//// 做接收:一直处于接受模式查询所得到的值是不是0x08 main(){U8 x;U8 RxBuf[1]={0};NRF24L01Int();Delay(6000);while(1){NRFSetRXMode();NRFRevDate(RxBuf);x=RxBuf[0];if(x==0x08)//0x08为发射部分所发送的按键标识{////加入所要执行的功能函数//当然了这里用到单片机io口的时候需要在之前定义//还有就是发送程序中的KEY也需要之前定义好 RxBuf[0]=0;}}}。

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。

三、模块引脚说明7 NC 空 8 CSN 芯片片选信号 I 9 CE 工作模式选择I 10+5V电源四、模块与AT89S52单片机接口电路注:上图为示意连接,可根据自己实际需求进行更改;使用AT89S52MCU 模块时,请将Nrf24L01通讯模块每个端口〔MOSI 、SCK 、CSN 和CE 〕增强其驱动能力〔如下列图:〕。

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。

亿佰特(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无线通信模块使用手册12要点

nRF24L01无线通信模块使用手册12要点

nRF24L01无线通信模块使用手册一、模块简介该射频模块集成了NORDIC公司生产的无线射频芯片nRF24L01 :1.支持2.4GHz的全球开放ISM频段,最大发射功率为OdBm2.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后发射数据;若自动应答开启,那么n RF24L01在发射数据后立即进入接收模式,接收应答信号。

如果收到应答,则认为此次通信成功,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模块时,请将Nf24L01通讯模块每个端口(MOSI、SCK、CSN和CE)接4.7K的排阻上拉到VCC增强其驱动能力(如下图:)。

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

//许多人都在找nrf24l01无线模块的c程序;我以前刚接触无线//时用的就是nrf24l01模块;搜索了许多程序有很多都没法直接用;甚至还怀疑模块是不是被我搞坏了;拿去让别人检测模块又是好的;为避免大家走弯路;我将我的程序发出来供大家参考;这是nrf24l01无线模块pcb图;下面有Nrf24l01无线模块的收发c程序;以下程序经本人亲自测试;绝对能用!!请注意以下几点:1、24L01模块的电源电压是否为3V-3.6V之间;2、如果您用的单片机是5V的话,请在IO口与模块接口之间串一个1K电阻;3、检查模块的GND是否与单片机的GND相连接4、先用程序进行调试,如果IO口不同,请更改IO口或相关时序;5、如果是51系列单片机,晶振请选用11.0592M Hz;模块供电最好用asm1117 5v转3.3v 稳压测试单片机是stc89c52;at89c52 通用;收发一体;一大截不废话了;上程序;此程序是按键控制led;当按下s的时候对应接受的led会闪闪发光;很简单的~如果要实现其他更先进的功能;自己发掘吧~~务必将硬件连接正确;否则;它不会工作的~~当然做什么都要严谨~~错一点就差大了~~《《收发一体程序》》#include <reg52.h>#include <intrins.h>typedef unsigned char uchar;typedef unsigned char uint;//****************************************NRF24L01端口定义***************************************sbit M ISO =P1^3;sbit M OSI =P1^4;sbit SCK =P1^2;sbit CE =P1^1;sbit CSN =P3^2;sbit IRQ =P3^3;//************************************按键***************************************************sbit KEY=P2^0;//***************************************************************************** sbit led=P2^1;//*********************************************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);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 enableCSN=1; // Spi disableSCK=0; //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写时序/****************************************************************************** **********************/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 MOSIuchar = (uchar << 1); // shift next bit into MSB..SCK = 1; // Set SCK high..uchar |= MISO; // capture current MISO bitSCK = 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 registervalueCSN = 1; // CSN high, terminate SPI communicationreturn(reg_val); // return register value}/****************************************************************************** **********************//*功能:NRF24L01读写寄存器函数/****************************************************************************** **********************/uint SPI_RW_Reg(uchar reg, uchar value){uint 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_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+STA TUS,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}; //unsigned char RxBuf[20]={0};init_NRF24L01() ;TxBuf[1] = 1 ;nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer dataDelay(6000);while(1){if(KEY ==0 ){led=0;Delay(200);led=1;TxBuf[1] = 1 ;tf = 1 ;}if (tf==1){nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer dataTxBuf[1] = 0x00;tf=0;Delay(1000);}//***************************************************************************** ******************SetRX_Mode();nRF24L01_RxPacket(RxBuf);if(RxBuf[1]){if( RxBuf[1]==1){led=0;Delay(200);led=1;}Delay(1000);}RxBuf[1] = 0x00;}}。

相关文档
最新文档