nRF24L01无线通信模块使用手册范本
- 格式:doc
- 大小:2.95 MB
- 文档页数:19
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 是由NORDIC 生产的工作在2.4GHz~2.5GHz 的ISM 频段
的单片无线收发器芯片。
无线收发器包括:频率发生器、增强型SchockBurst 模式控制器、功率放大器、晶体振荡器、调制器和解调器。
输出功率频道选择和协议的设置可以通过SPI 接口进行设置。
几乎可以连接到各种单片机芯片,并完成无线数据传送工作。
极低的电流消耗:当工作在发射模式下发射功率为0dBm 时电流消耗为11.3mA ,接收模式时为12.3mA,掉电模式和待机模式下电流消耗更低。
nrf24l01 模块使用教程
NRF24L01 与控制器的通信采用的SPI 通信协议,这个协议具体细节
大家可能都懂,不懂的可以之间百度;他们的通信模型是这样的:。
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无线通信模块使用手册一、模块简介该射频模块集成了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高速嵌入式无线数传模块说明书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使用说明1 NRF24L01功能框图Fig.1 NRF24L01 BLOCK DIAGRAMNRF24L01的框图如 Fig.1所示,从单片机控制的角度来看,我们只需要关注 Fig.1右面的六个控制和数据信号,分别为 CSN、SCK、MISO、MOSI、IRQ、CE。
CSN:芯片的片选线,CSN为低电平芯片工作。
SCK:芯片控制的时钟线(SPI时钟)MISO:芯片控制数据线(Master input slave output)MOSI:芯片控制数据线(Master output slave input)IRQ:中断信号。
无线通信过程中 MCU主要是通过 IRQ与 NRF24L01进行通信。
CE:芯片的模式控制线。
在 CSN为低的情况下,CE协同 NRF24L01的 CONFIG寄存器共同决定 NRF24L01的状态(参照 NRF24L01的状态机)。
2 NRF24L01状态机NRF24L01的状态机见 Fig.2所示,对于 NRF24L01的固件编程工作主要是参照NRF24L01的状态机。
主要有以下几个状态Power Down Mode:掉电模式Tx Mode:发射模式Rx Mode:接收模式Standby-1Mode:待机1模式Standby-2 Mode:待机2模式上面五种模式之间的相互切换方法以及切换所需要的时间参照 Fig.2。
Fig.2 NRF24L01 State Machine对 24L01的固件编程的基本思路如下:1)置 CSN为低,使能芯片,配置芯片各个参数。
(过程见 3.Tx与 Rx的配置过程)配置参数在 Power Down状态中完成。
2)如果是 Tx模式,填充 Tx FIFO。
3)配置完成以后,通过 CE与 CONFIG中的 PWR_UP与 PRIM_RX参数确定 24L01 要切换到的状态。
Tx Mode:PWR_UP=1; PRIM_RX=0; CE=1 (保持超过 10us就可以);Rx Mode: PWR_UP=1; PRIM_RX=1; CE=1;4) IRQ引脚会在以下三种情况变低:Tx FIFO发完并且收到 ACK(使能 ACK情况下)Rx FIFO收到数据达到最大重发次数将 IRQ接到外部中断输入引脚,通过中断程序进行处理。
先来看接口电路,使用的IO 口不是唯一的哦,可随意定义接口,当然是在 使用10 口模拟SPI 且IRQ 中断引脚不使用的使用查询方法判断接收状态的 情况下了。
作为初探我们就是 用简单的I0模拟SPI 的方法了,中断使用查询 的方式。
那么该教程讲解的接口与单片机的连接如下:GNl)Pl首先您需要了解 NRF24L01,请参阅“ NRF24L01芯片中文资料” 片英文资料”。
我们的教程是以一个简单的小项目为大家展示 NRF24L01的使用方法与乐 趣。
我们所写教程均是以这种方式的呢, 让您在学习的时候明白它能做什么, 使 您学起来不至于枯燥无味。
作为简易的教程,我们只需要知道它是怎么使用的就够了, 我们本教程的目 的是用NRF24L01发送数据和接收数据,且接收方会对比发送的数据与接收的 数据,若完全相同则 控制LED 闪烁一次,并且把接收到的数据通过串口发送 到PC 端,通过串口工具查看接收到 的数据。
具体的要求如下:1、 具备发送和接收的能力。
2、 发送32个字节的数据,接收方接收到正确数据之后给予提示,通过 LED闪烁灯形 式。
3、 把接收到的数据传送到 PC 进行查看。
4、 发送端每隔大约1.5秒发送一次数据,永久循环。
以上是程序的要求,若您想自行设计出硬件接口,您也是可以添加一条呢: 使用DIY 方式设计NRF24L01的接口板,且包含含单片机平台,使用PCB 方 式或者万用板方式均可。
如 果您想让自己学的很扎实,那么推荐您自行做出接 口板子呢。
当然若您的能力不足,那么我 们不推荐自行做板呢,因为这样会增 加您学习的难度,反而起到了反效果呢。
我们知道NRF24L01的供电电压是1.9V~3.6V 不能超过这个范围,低了不 工作,高了可能烧毁NRF24L01芯片。
我们常用的STC89C52的单片机的供电 电压是5V ,我们不能直接给24L01这个模块供电,我们需要使用 AMS1117-3.3V 稳压芯片把5V 转成3.3V 的电压为24L01模块供电。
NRF24l01使用手册以及函数指令寄存器介绍芯片简介NRF24L01 是NORDIC 公司最近生产的一款无线通信通信芯片,采用FSK 调制,内部集成NORDIC 自己的Enhanced Short Burst 协议。
可以实现点对点或是1 对6 的无线通信。
无线通信速度可以达到2M(bps)。
NORDIC 公司提供通信模块的GERBER 文件,可以直接加工生产。
嵌入式工程师或是单片机爱好者只需要为单片机系统预留5 个GPIO,1 个中断输入引脚,就可以很容易实现无线通信的功能,非常适合用来为MCU 系统构建无线通信功能。
NRF24L01功能框图NRF24L01 的框图如Fig.1 所示,从单片机控制的角度来看,我们只需要关注Fig.1 右面的六个控制和数据信号,分别为CSN、SCK、MISO、MOSI、IRQ、CE。
CSN:芯片的片选线,CSN 为低电平芯片工作。
SCK:芯片控制的时钟线(SPI 时钟)MISO:芯片控制数据线(Master input slave output)MOSI:芯片控制数据线(Master output slave input)IRQ:中断信号。
无线通信过程中MCU 主要是通过IRQ 与NRF24L01 进行通信。
CE:芯片的模式控制线。
在CSN 为低的情况下,CE 协同NRF24L01 的CONFIG 寄存器共同决定NRF24L01 的状态(参照NRF24L01 的状态机)。
NRF24L01状态机NRF24L01 的状态机见Fig.2 所示,对于NRF24L01 的固件编程工作主要是参照NRF24L01 的状态机。
主要有以下几个状态Power Down Mode:掉电模式Tx Mode:发射模式Rx Mode:接收模式Standby-1Mode:待机1 模式Standby-2 Mode:待机2 模式上面五种模式之间的相互切换方法以及切换所需要的时间参照Fig.2。
对24L01 的固件编程的基本思路如下:1)置CSN 为低,使能芯片,配置芯片各个参数。
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。
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通讯模块工作模式由CE和PWR_UP、PRIM_RX两寄存器共同控制:注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命令字节表传输应答信号时不应执行此操作,否则不能传输完整的应答信号。
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引脚为低MASK_MAX_RT4 0 R/W可屏蔽中断MAX_RT1:中断产生时对IRQ没影响0:MAX_RT中断产生时,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激活。
只有重新写状态寄存器(STATUS)才能关闭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)十、示例程序接收模块与发射模块大部分程序代码相同,如下:1.SPI命令和寄存器配置头文件API.h(根据第六、七两点编写)#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 到 nRF24L01SPI_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(STATUS);}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中断标志位}}。