nRF24L01无线通信模块使用手册

合集下载

nRF24L01 无线模块 说明书

nRF24L01 无线模块 说明书

nRF24L01 无线模块用户手册目录产品概述 (3)基本特性 (3)引脚接口说明 (4)模块尺寸 (6)nRF2401工作模式 (7)Enhanced ShockBurstTM收发模式 (7)Enhanced ShockBurstTM数据发送流程 (8)空闲模式 (9)关机模式 (9)nRF24L01模块参数设置 (9)主要参数设置 (10)程序设计分析 (10)nRF24L01初始化 (10)nRF24L01SPI写操作 (11)nRF24L01 SPI读操作 (11)nRF24L01写寄存器函数 (12)nRF24L01连续读多个寄存器函数 (12)nRF24L01连续写多个寄存器函数 (12)nRF24L01接收模式设置 (13)nRF24L01接收数据流程 (13)nRF24L01发送数据流程 (13)无线应用注意事项 (14)我们的承诺 (15)产品概述nRF24L01是挪威NordicVLSI公司出品的一款新型射频收发器件,采用4 mm×4 mm QFN20封装;nRF24L01工作在ISM频段:2.4~2.524 GHz。

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

nRF24L01功耗很低,在以-6 dBm的功率发射时,工作电流也只有9 mA;而对应接收机的工作电流只有12.3 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。

nRF24L01在业界领先的低功耗特点使其特别适合采用钮扣电池供电的2.4G应用,整个解决方案包括链路层和MultiCeiver功能提供了比现有的 nRF24XX 更多的功能和更低的电源消耗,与目前的蓝牙技术相比在提供更高速率的同时,而只需花更小的功耗基本特性(1) 2.4Ghz全球开放ISM 频段免许可证使用(2) 最高工作速率2Mbps,高效GFSK调制,抗干扰能力强(3) 125频道,满足多点通信和跳频通信需要(4) 内置硬件CRC 检错和点对多点通信地址控制(5) 低功耗1.9 - 3.6V 工作,适合电池供电应用(6) 待机模式下状态为22uA;掉电模式下为900nA(7) 模块可软件设地址,只有收到本机地址时才会输出数据(提供中断指示),可直接接各种单片机使用,软件编程非常方便(8) 内置专门稳压电路,即使开关电源也有很好的通信效果(9) 标准DIP间距接口,便于嵌入式应用(10)具有自动应答机制,和CRC校验,数据通讯稳定可靠。

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使用方法

NRF24L01使用方法

四、 程序说明
4.1 发射:
/* PD3--20 脚--CE----模块芯片开启信号 激活 RX 或 TX PD2--19 脚--CSN---模块 SPI 片选信号 PC7--17 脚--SCK---模块 SPI 时钟信号 PC6--16 脚--MOSI--模块 SPI 输入信号 PC5--15 脚--MISO--模块 SPI 输出信号 PC4--14 脚--IRQ---模块可屏蔽中断信号 低电平有效 */ #include <NRF_2401C.h> #include <delay.h> uchar RevTempDate[5];//最后一位用来存放结束标志 uchar TxAddr[]={0x34,0x43,0x10,0x10,0x02};//发送地址 /*****************状态标志*****************************************/ uchar sta; //状态标志 单片机输出 单片机输出 单片机输出 单片机输出 单片机输入 单片机输入
写寄存器 TXFIFO
广东顺德春暖花开自动化开发设计工作室
伍耀斌
4.2 接收:
/* PD3--20 脚--CE----模块芯片开启信号 激活 RX 或 TX PD2--19 脚--CSN---模块 SPI 片选信号 PC7--17 脚--SCK---模块 SPI 时钟信号 PC6--16 脚--MOSI--模块 SPI 输入信号 PC5--15 脚--MISO--模块 SPI 输出信号 PC4--14 脚--IRQ---模块可屏蔽中断信号 低电平有效 */ #include <NRF_2401C.h> #include <delay.h> uchar RevTempDate[5];//最后一位用来存放结束标志 uchar TxAddr[]={0x34,0x43,0x10,0x10,0x02};//发送地址 /*****************状态标志*****************************************/ uchar sta; //状态标志 //RX_DR=sta^6; //TX_DS=sta^5; PLC_BitState.BitState0.Bit.M4=1; //MAX_RT=sta^4; struct PLC_BITSTATE { //-------------------------------------------union BITSTATE0 { char all; struct BIT00 { uchar M0:1;// uchar M1:1;// uchar M2:1;// uchar M3:1;// uchar MAX_RT:1;// uchar TX_DS:1;// uchar RX_DR:1;// uchar M7:1;// }Bit; }BitState0; }PLC_BitState; /*****************SPI 时序函数******************************************/ uchar NRFSPI(uchar date) { } /**********************NRF24L01 初始化函数*******************************/ void NRF24L01Int() { } /*****************SPI 读寄存器一字节函数*********************************/ 单片机输出 单片机输出 单片机输出 单片机输出 单片机输入 单片机输入

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

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

深圳市德普施科技有限公司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 )接4.7K 的排阻上拉到VCC 增强其驱动能力(如下图:)。

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无线通信模块

NRF24L01无线通信模块一、NRF24L01简介:NRF24L01 是一款工作在2.4~2.5GHz 世界通用ISM 频段的单片无线收发器芯片。

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

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

极低的电流消耗:当工作在发射模式下发射功率为-6dBm 时电流消耗为9mA,接收模式12.3mA。

掉电模式和待机模式下电流消耗更低。

二、NRF24L01参考数据:三、模块接口尺寸和说明四、引脚及功能:五、NRF24L01的SPI命令宏定义:六、NRF24L01相关寄存器地址宏定义:七、NRF24L01的工作模式:1、NRF24L01模式配置2、发送模式函数配置3、接收模式函数配置4、发送、接收模式说明(1)在发射模式下,CE至少要拉高10us。

(2)NRF24L01在接收模式下可以接收6路不同通道的数据,每一个数据通道使用不同的地址,但是共用相同的频道。

(3)数据通道0是唯一一个可以配置为40位自身地址的数据通道,1~5数据通道都为8位自身地址和32位共用地址。

(4)所有的数据通道都可以设置为增强型ShockBurst模式。

八、NRF24L01的打包格式:1、增强型ShockBurst模式下的数据包形式前导码 | 地址(3~5字节) | 9位(标志位) | 数据(1~32字节) | CRC校验(0/1/2字节) 2、ShockBurst模式下与NRF24L01等相兼容的数据包形式前导码 | 地址(3~5字节) | 数据(1~32字节) | CRC校验(0/1/2字节)3、数据包说明前导码:在发送模式下加入,接收模式下去除,用来检测0和1。

地址:1)地址内容为接收机地址。

2)地址宽度可以是3、4或5字节宽度。

3)地址可以对接收通道和发射通道分别进行配置。

4)从接收的数据包中自动去除地址。

NRF24L01模块系列说明书

NRF24L01模块系列说明书
13 问:你们提供些单片机的程序?
答:原厂给的标准收发演示例程,有 51 PIC STM32 的,都是标准 C 语言编写, 因此即使移植其它单片机也很快
14 问:拿到模块和程序后,自己焊接测试电路和移植程序,下载进去后通讯不 了。
答:首先不用怀疑模块的问题。生产工艺成熟,不良率在不测试时候低于 1%, 何况全部测试,不良率低于千分之一。大部分新手自己焊接电路移植程序不良是 因为移植时候硬件错误或者软件增删错误引起,因为即使很小点错误,也能导致 整个程序的失效,所以建议自己移植程序时候要很小心,尽量照搬我们的例程, 等整个程序跑起来再做修改。若实在搞不定,可以借用我们的测试板,或者付出 很少费用就能买到配套的测试板,这样能给客户节省不少的时间。
11 问 NRF24L01 系列模块可以一对多发送或者多对一接收吗?
答:完全可以,70%客户都这么用的。
12 问:我是新手,你们提供哪些方面的技术支持?
答:2.4G 系列模块属于有点技术难度的产品,若完全依靠客户参照规格书 写程序,会浪费客户一个多礼拜的时间,比较幸运的是我们提供了参考程序,并 且提供和程序配套的测试板借用或购买,可以让客户快速体验模块的性能。建议 项目比较急的客户选用,价格每个 20 元成本价格销售,可以给客户节省好几天 的调试时间,很划算。
答:一款原产台湾,一款原产品挪威,随着众多 IC 晶圆厂自己无线 IC 的 推出,兼容模块的价格从 2008 年的 20 元左右一直跌落到目前的 4.5,利润由当 初的 10 元降到现在的 0.5 元以下,其中挪威版的出的最早,价格虽然猛降,但 是始终拼不过台产芯片。
3 问:挪威版本的 NRF24L01+和台产版的哪个使用效果会更好? 答:台产版的完全克隆挪威版的,并在以前的基础上加了+7DB 的功放电路,

2.4G无线通信使用教程

2.4G无线通信使用教程
5
} //在指定位置写指定长度的数据 //reg:寄存器(位置) //*pBuf:数据指针 //len:数据长度 //返回值,此次读到的状态寄存器值 u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len) { u8 status,u8_ctr; NRF24L01_CSN = 0; //使能 SPI 传输 status = SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状 态值 for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); //写入数据 NRF24L01_CSN = 1; //关闭 SPI 传输 return status; //返回读到的状态值 } //启动 NRF24L01 发送一次数据 //txbuf:待发送数据首地址 //返回值:发送完成状况 u8 NRF24L01_TxPacket(u8 *txbuf) { u8 sta; SPI2_SetSpeed(SPI_BaudRatePrescaler_4);//spi 速度为 9Mhz(24L01 的最大 SPI 时钟为 10Mhz) NRF24L01_CE=0; NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);// 写 数 据 到 TX BUF 32 个字节 NRF24L01_CE=1;//启动发送 while(NRF24L01_IRQ!=0);//等待发送完成 sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值 NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); // 清 除 TX_DS 或 MAX_RT 中断标志 if(sta&MAX_TX)//达到最大重发次数 { NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除 TX FIFO 寄存器 return MAX_TX; } if(sta&TX_OK)//发送完成 { return TX_OK; }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 )接4.7K 的排阻上拉到VCC 增强其驱动能力(如下图:)。

若使用其它单片机与Nrf24L01通讯模块相连时请串联2K 电阻。

VCC P1.0 P1.1 CN CN P1.2 P1.3 P1.4 P3.2 GNDAT89S52MCU 模块 +5V CE CSN CN CN SCK MOSI MISO IRQ GNDNrf24L01通讯模块五、工作模式操纵注1:进入此模式后,只要CSN置高,在FIFO中的数据就会赶忙发射出去,直到所有数据数据发射完毕,之后进入待机模式II。

注2:正常的发射模式,CE端的高电平应至少保持10us。

24L01将发射一个数据包,之后进入待机模式I。

六、数据和操纵接口通过以下六个引脚,可实现模块的所有功能:①IRQ(低电平有效,中断输出)②CE(高电平有效,发射或接收模式操纵)③CSN(SPI信号)④SCK(SPI信号)⑤MOSI(SPI信号)⑥MISO(SPI信号)通过SPI接口,可激活在数据寄存器FIFO中的数据;或者通过SPI命令(1个字节长度)访咨询寄存器。

在待机或掉电模式下,单片机通过SPI接口配置模块;在发射或接收模式下,单片机通过SPI接口接收或发射数据。

1.SPI指令所有的SPI指令均在当CSN由低到高开始跳变时执行;从MOSI写命令的同时,MISO 实时返回24L01的状态值;SPI指令由命令字节和数据字节两部分组成。

SPI命令字节表FLUSH_TX 1110 0001 0 在发射模式下,清空TX FIFO寄存器。

FLUSH_RX 1110 0010 0 在接收模式下,清空RX FIFO寄存器。

在传输应答信号时不应执行此操作,否则不能传输完整的应答信号。

REUSE_TX_PL 1110 0011 0 应用于发射端。

重新使用上一次发射的有效数据,当CE=1时,数据将不断重新发射。

在发射数据包过程中,应禁止数据包重用功能。

NOP 1111 1111 0 空操作。

可用于读状态寄存器。

2.SPI时序SPI读写时序见下面两图。

在写寄存器之前,一定要进入待机模式或掉电模式。

其中,Cn——SPI指令位;Sn——状态寄存器位;Dn——数据位(低字节在前,高字节在后;每个字节中高位在前)SPI读时序SPI写时序地址(十六进制)寄存器位复位值类型讲明00 CONFIG 配置寄存器Reserved 7 0 R/W 默认为0MASK_RX_DR 6 0 R/W 可屏蔽中断RX_RD1:中断产生时对IRQ没阻碍0:RX_RD中断产生时,IRQ 引脚为低MASK_TX_DS 5 0 R/W 可屏蔽中断TX_RD1:中断产生时对IRQ没阻碍0:TX_RD中断产生时,IRQ 引脚为低八、模块编程操纵1.ShockBurst TM发射模式①设置PRIM_RX为低。

②通过SPI接口,将接收节点地址(TX_ADDR)和有效数据(TX_PLD)写入模块,写TX_PLD时,CSN必须一直置低。

③置CE为高,启动发射。

CE高电平连续时刻至少为10us。

④ShockBurst TM发射模式:系统上电启动内部16MHz时钟数据打包数据发射⑤若启动了自动应答模式(ENAA_P0=1),则模块赶忙进入接收模式(NO_ACK已设置)。

假如接收到应答信号,则表示发射成功,TX_DS置高且TX FIFO中的有效数据被移出;假如没有接收到应答信号,则自动重发(自动重发已设置);假如自动重发次数超过最大值(ARC),MAX_RT置高,在TX FIFO中的数据不被移出。

当MAX_RT和TX_DS置高时,IRQ激活。

只有重新写状态寄存器(STA TUS)才能关闭IRQ。

假如重发次数达到最大后,仍没有接收到应答信号,在MAX_RT中断清除之前,可不能再发射数据。

PLOS_CNT 计数器会增加,每当有一个MAX_RT中断产生。

⑥假如CE置低,则系统进行待机模式I,否则发送TX FIFO寄存器中的下一个数据包。

当TX FIFO中的数据发射完,CE仍为高时,系统进入待机模式II。

⑦在待机模式II下,CE置低,则进入待机模式I。

2.ShockBurst TM接收模式①设置PRIM_RX为高,配置接收数据通道(EN_RXADDR)、自动应答寄存器(EN_AA)和有效数据宽度寄存器(RX_PW_PX)。

②置CE为高,启动接收模式。

③130us后,模块检测空中信号,④接收到有效的数据包后(地址匹配、CRC检验正确),数据储存在RX FIFO中,RX_DR 置高。

⑤假如启动了自动应答功能,则发送应答信号。

⑥MCU置CE为低,进入先机模式I。

⑦MCU可通过SPI接口将数据读出⑧模块预备好进入发射模式或接收模式或待机模式。

九、RF通道频率RF通道频率指的是nRF24L01所使用的中心频率,该频率范畴从 2.400GHz到2.525GHz,以1MHz区分一个频点,故有125个频点可使用。

由参数RF_CH确定,公式为:F0 = 2400 + RF_CH(MHz)十、示例程序接收模块与发射模块大部分程序代码相同,如下:#ifndef _BYTE_DEF_#define _BYTE_DEF_typedef unsigned char BYTE;#endif// SPI命令#define READ_REG 0x00 //读第0个寄存器#define WRITE_REG 0x20 //写第0个寄存器#define RD_RX_PLOAD 0x61 //在接收模式下使用,读有效数据#define WR_TX_PLOAD 0xA0 //在发送模式下使用,写有效数据#define FLUSH_TX 0xE1 //在发送模式下使用,清TX FIFO寄存器#define FLUSH_RX 0xE2 //在接收模式下使用,清RX FIFO寄存器#define REUSE_TX_PL 0xE3 //发送方使用,重复发送最后的数据#define NOP 0xFF //空操作,用于读状态寄存器STATUS的值// nRF24L01寄存器地址#define CONFIG 0x00 //配置寄存器,8bit#define EN_AA 0x01 //自动应答设置寄存器,8bit#define EN_RXADDR 0x02 //接收地址设置寄存器,8bit#define SETUP_AW 0x03 //地址宽度设置寄存器,8bit#define SETUP_RETR 0x04 //自动重复发送设置寄存器,8bit#define RF_CH 0x05 //RF通道寄存器,8bit#define RF_SETUP 0x06 //RF设置寄存器,8bit#define STATUS 0x07 //状态寄存器,8bit#define OBSERVE_TX 0x08 //发送观测寄存器,8bit#define CD 0x09 //载波检测寄存器,8bit,#define RX_ADDR_P0 0x0A //接收地址数据通道0,40bit#define RX_ADDR_P1 0x0B#define RX_ADDR_P2 0x0C#define RX_ADDR_P3 0x0D#define RX_ADDR_P4 0x0E#define RX_ADDR_P5 0x0F#define TX_ADDR 0x10 //发送地址.发送方使用,40bit#define RX_PW_P0 0x11 //通道0接收的有效数据字节长度(1-32字节),8bit#define RX_PW_P1 0x12#define RX_PW_P2 0x13#define RX_PW_P3 0x14#define RX_PW_P4 0x15#define RX_PW_P5 0x16#define FIFO_STATUS 0x17 //FIFO状态寄存器,8bit2.SPI操作头文件(与单片机的接口设置在此头文件中)#define uchar unsigned char#define TX_ADR_WIDTH 5 //地址长度为5个字节#define TX_PLOAD_WIDTH 20 //数据长度为20个字节uchar const TX_ADDRESS[TX_ADR_WIDTH] = {0xE7,0xE7,0xE7,0xE7,0xE7};char rx_buf[TX_PLOAD_WIDTH]; //接收缓冲区uchar flag; //标志位int test[12];#define CE P0_0 //芯片使能:Chip Enable#define CSN P0_1 //片选信号:Chip Select Not#define SCK P1_2 //串行时钟信号:Serial Clock#define MOSI P0_3 //主发从收:Master In Slave Out#define MISO P0_4 //主收从发:Master Out Slave In#define IRQ P3_2 //中断查询:Interrupt Requestuchar bdata sta;sbit RX_DR = sta^6;sbit TX_DS = sta^5;sbit MAX_RT = sta^4;uchar SPI_RW(uchar byte)//写一个字节到nRF24L01,并返回现在nRF24L01的状态及数据{uchar bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++) //先写字节的高位,再写低位{MOSI = (byte & 0x80); //MOSI取byte最高位byte = (byte << 1); //byte左移一位SCK = 1; //SCK从高到低时开始写入byte |= MISO;//猎取MISO位.从MOSI写命令的同时,MISO返回nRF24L01的状态及数据SCK = 0;}return(byte);}uchar SPI_RW_Reg(BYTE reg, BYTE value)//将字节value写入寄存器reg{uchar status;CSN = 0; //CSN为0时,才能进行SPI读写status = SPI_RW(reg); //选择寄存器regSPI_RW(value); //写字节value到该寄存器CSN = 1; //终止SPI读写return(status);}BYTE SPI_Read(BYTE reg)//读寄存器reg状态字{BYTE reg_val;CSN = 0; //CSN为0时,才能进行SPI读写SPI_RW(reg); //选择寄存器regreg_val = SPI_RW(0); //写0,什么操作也不进行,仅仅为了读寄存器状态CSN = 1; //终止SPI读写return(reg_val);}uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)//从寄存器reg读出数据,典型应用是读RX数据或RX/TXF地址{uchar status,byte_ctr;CSN = 0; //CSN为0时,才能进行SPI读写status = SPI_RW(reg); //选择寄存器reg并返回其状态字for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)pBuf[byte_ctr] = SPI_RW(0); //从寄存器读数据CSN = 1; //终止SPI读写return(status); //返回状态值}uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)//将数据写入寄存器,如TX数据,RX/TX地址等. {uchar status,byte_ctr;CSN = 0; //CSN为0时,才能进行SPI读写status = SPI_RW(reg); //选择寄存器reg并返回其状态字for(byte_ctr=0; byte_ctr<bytes; byte_ctr++)SPI_RW(*pBuf++); //写数据到寄存器CSN = 1; //终止SPI读写return(status); //返回状态值}//接收模式初始化:设置RX地址,RX数据宽度,RF通道,速率,低噪声放大器增益//设置完之后,将CE置高,预备好接收数据void RX_Mode(void){SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);// 写TX_Address 到nRF24L01 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 自动重发延时:500us + 86us;重发次数:10次SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);//将地址TX_ADDRESS写入寄存器0的数据通道0 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //ENAA_P0=1,数据通道0自动应答SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //ERX_P0=1,使能SPI_RW_Reg(WRITE_REG + RF_CH, 40); //40个通信频段SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);//数据通道0的RX数据长度为TX_PLOAD_WIDTH,要与发送的一致SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0F);//速率为2Mbps,发送功率为0dBm,低噪声放大器增益为1 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);//PRIM_RX=1,接收方;PWR_UP=1;CRC检验字为2字节;}//发送模式初始化:设置发送地址,设置发送的数据,设置接收方地址,RF通道,速率等,与接收类似void TX_Mode(void){SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);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 + EN_AA, 0x01);SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);SPI_RW_Reg(WRITE_REG + RF_CH, 40);SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);}void show_status(void) //显示状态寄存器的值{test[0] = SPI_Read(EN_AA); //0x01test[1] = SPI_Read(EN_RXADDR); //0x01test[2] = SPI_Read(SETUP_AW); //0x03,5个字节test[3] = SPI_Read(SETUP_RETR); //0x1atest[4] = SPI_Read(RF_CH); //0x28test[5] = SPI_Read(RF_SETUP); //0x0ftest[6] = SPI_Read(RX_ADDR_P2);test[7] = SPI_Read(RX_ADDR_P3);test[8] = SPI_Read(RX_ADDR_P4);test[9] = SPI_Read(RX_ADDR_P5);test[10] = SPI_Read(RX_PW_P0); //0x14test[11] = SPI_Read(STA TUS);}void init_io(void){CE = 0; //待机CSN = 1; //SPI禁止读写SCK = 0;}void Inituart(void)//设置串口工作模式{TMOD |= 0x20; //定时器1工作在方式2,8位自动重装模式TL1 = 0xfd; //波特率为9600TH1 = 0xfd;SCON = 0x50; //模式1,8位数据TR1 = 1; //启动定时器1TI=1;}void init_int0(void)//外部中断设置{EA=1; //承诺全局中断ES=1; //开串行口中断EX0=1; //承诺外部中断0}void delay_ms(unsigned int x) //毫秒级延时{unsigned int i,j;i=0;for(i=0;i<x;i++){j=108;while(j--);}}3.发送模块主函数(向接收模块发射数据“abcdefg”,中断方式)void main(void){int i;init_io(); //IO端口设置Inituart(); //串口设置init_int0(); //外部中断0设置for(i=0;i<7;i++) //待发的数据tx_buf,发送的数据为”abcdefg”七个字母tx_buf[i] = 'a'+i;while(1){CE = 0; //Standby-1模式TX_Mode(); //发送设置CE = 1; //启动发送模式delay_ms(20);CE = 0; //Standby-1模式delay_ms(1000);}}//中断函数//假如RX_DR=1,则读取数据,之后清除标志位;//假如TX_DS或MAX_RT为1,则仅清除中断标志位void ISR_int0(void) interrupt 0{sta=SPI_Read(STATUS); //读状态寄存器STATUSif(RX_DR) //如接收到数据,则中断{SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//读取接收的数据flag=1; //标志位置高}if(MAX_RT) //重发中断达到最大数SPI_RW_Reg(FLUSH_TX,0); //清除TX FIFO寄存器SPI_RW_Reg(WRITE_REG+STATUS,sta); //清除RX_DR,TX_DS和MAX_RT中断标志位}4.接收模块主函数(接收并在串口输出,同时输出状态寄存器的值,使用查询方式)void main(void){int i;init_io(); //IO端口设置Inituart(); //串口设置init_int0(); //外部中断0设置CE=0; //Standby-1模式RX_Mode(); //设置接收模式CE = 1; //预备接收数据while(1){sta=SPI_Read(STATUS);if(RX_DR) //接收到数据{SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//读取接收的数据for(i=0;i<7;i++)printf("%c ",rx_buf[i]); //通过串口发送接收到的数据printf("\n");show_status(); //输出状态寄存器的值,可不用此操作for(i=0;i<12;i++)printf("%x ",test[i]);printf("\n");delay_ms(10);}if(MAX_RT) //重发中断达到最大数SPI_RW_Reg(FLUSH_TX,0); //清除TX FIFO寄存器SPI_RW_Reg(WRITE_REG+STATUS,sta); //清除RX_DR,TX_DS和MAX_RT中断标志位}}。

相关文档
最新文档