nRF24L01无线通信模块使用手册
奋斗STM32开发板Tiny NRF24L01转USB虚拟串口例程手册

奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验NRF24L01+转 USB 虚拟串口实验实验平台:奋斗版STM32开发板Tiny 实验内容:板子通过USB加电后,先向串口1输出一串测试数据,然后USB被PC识 别出来,虚拟出一个串口号给这个USB设备,此时可以通过在PC端的串口助手类 软件选择该串口号。
进入串口软件界面,可以通过软件无线收发一帧长度最长 为32字节的数据。
该例程可以和V3及MINI板的NRF24L01 UCGUI例程配合使用。
预先需要掌握的知识 2.4G通信模块NRF24L01 1. 产品特性2.4GHz 全球开放ISM 频段,最大0dBm 发射功率,免许可证使用 支持六路通道的数据接收 低工作电压:1.9 1.9~3.6V 低电压工作 高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率) 多频点:125 频点,满足多点通信和跳频通信需要 超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线) 低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。
低应用成本:NRF24L01 集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等, NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口, 便于使用低成本单片机。
便于开发:由于链路层完全集成在模块上,非常便于开发。
自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制 自动存储未收到应答信号的数据包 自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程 载波检测—固定频率检测 内置硬件CRC 检错和点对多点通信地址控制 数据包传输错误计数器及载波检测功能可用于跳频设置 可同时设置六路接收通道地址,可有选择性的打开接收通道 标准插针Dip2.54MM 间距接口,便于嵌入式应用2.基本电气特性淘宝店铺:1奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验3. 引脚定义:4.工作方式NRF2401有工作模式有四种: 收发模式 配置模式 空闲模式 关机模式 工作模式由CE 和寄存器内部PWR_UP、PRIM_RX 共同控制,见下表:淘宝店铺:2奋斗版 STM32 开发板例程手册———NRF24L01+转 USB 虚拟串口实验4.1 收发模式收发模式有Enhanced ShockBurstTM收发模式、ShockBurstTM收发模式和直接收发模式三种,收发模式由器件配置字决定,具体 配置将在器件配置部分详细介绍。
nRF24L01无线模块讲解解读

数据通道
nRF24L01 在接收模式下可以接收6 路不同通道的数据。
数据通道
• 每一个数据通道使用不同的地址,但是共用相同的频道。 也就是说6 个不同的nRF24L01 设置为发送模式后可以与 同一个设置为接收模式的nRF24L01 进行通讯,而设置为 接收模式的nRF24L01 可以对这6 个发射端进行识别。 • 数据通道是通过寄存器EN_RXADDR 来设置的,默认状 态下只有数据通道0 和数据通道1 是开启状态的。 • nRF24L01在确认收到数据后记录地址,并以此地址为目 标地址发送应答信号,在发送端,数据通道0被用作接收 应答信号,因此属通道0 的接收地址要与发送地址端地址 相等,以确保接收到正确的应答信号。
封装引脚及其引脚功能
nRF单端50Ω射频输出原理图
nRF24L10与单片机应用电路图
举例:NRF24L01模块口与STM32连接原理图中断
• nRF24L01 的中断引脚(IRQ)为低电平触发,当状态寄 存器中TX_DS(数据发送完成中断位)、RX_DR(接收 数据中断位) 或MAX_RT(达到最多次重发中断位)为 高时触发中断。 • 当MCU 给中断源写‘1’时,中断引脚被禁止。可屏蔽中 断可以被IRQ 中断屏蔽。通过设置可屏蔽中断位为高,则 中断响应被禁止。默认状态下所有的中断源是被禁止的。
nRF24l01的SPI通信时序
增强型ShockBurstTM 发送模式
• 1、 配置寄存器位PRIM_RX 为低 • 2、 当MCU 有数据要发送时,接收节点地址(TX_ADDR) 和有效数据(TX_PLD)通过SPI 接口写入nRF24L01。发送 数据的长度以字节计数从MCU 写入TX FIFO。当CSN 为 低时数据被不断的写入。发送端发送完数据后,将通道0 设置为接收模式来接收应答信号,其接收地址 (RX_ADDR_P0)与接收端地址(TX_ADDR)相同。 例:在上图 中数据通道5 的发送端(TX5)及接收端(RX)地 址设置如下: TX5:TX_ADDR=0xB3B4B5B605 TX5:RX_ADDR_P0=0xB3B4B5B605 RX:RX_ADDR_P5=0xB3B4B5B605
2.4G无线通信使用教程

2
1.3.1 NRF24L01 驱动程序
打开 nrf24l01.c 文件,代码如下: #include "nrf24l01.h" #include "spi.h"
const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; // 发送地址 const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //初始化 24L01 的 IO 口 void NRF24L01_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; //使能 PB,F,D 端口时钟 //PF8-CE PF9-CSN PD3-IRQ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPI OF|RCC_APB2Periph_GPIOD, ENABLE);
1.2 硬件设计
本实验功能简介:开机时系统先检测 NRF24L01 模块是否存在,在检测到 NRF24L01 模块之后,根据 K_UP 和 K_DOWN 按键来决定模块的工作模式,在设 定好工作模式之后,就会开发发送/接收数据,同样用 D1 指示灯来指示程序正 在运行。 开发板上并没有集成 NRF24L01 无线模块,而是预留了一个模块接口, 所以我 们需要知道模块接口与开发板对应的管脚原理图,如图 1.2.1 所示:
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; }
nRF24LE1中文手册

4
nRF24LE1 nRF24LU1 模块 多功能编程器 RMB88
低电流消耗,2 Kbps 采样速率下仅 0.1 mA 电压比较器
nRF24LE1 nRF24LU1 模块 多功能编程器 RMB88
nRF24LE1
超低功耗无线片上系统解决方案 产品说明书 V1.6
关键特征
l nRF24L01+2.4 Hz 收发器(250 bps,1 Mbps,2 Mbps 空中速率 l 集成高速单片机(兼容 8051) l 16 kB 片上程序存储器 l 1 kB 片上数据存储器 l 512 字节非易失性数据存储器 l AES 对称加密硬件加速 l 16-32 位乘法除法协处理器 l 6-12 位 ADC l 高灵活性输入输出端口 l 从超低功耗到高效运行的省电模式 l 4*4 mm QFN24 5*5mm QFN32 7*7mm QFN48 封装 l 支持硬件调试器 l 硬件支持固件更新
1 简介
nRF24LE1 是一款高性价比且内置微控制器的智能 2.4GHz 射频收发器家族中的一员。 nRF24LE1 为提供超低功耗无线应用而作了优化。处理器能力,内存,低功耗晶振,实时实 名,计数器,AES 加密加速器,随机数发生器和节电模式的组合为实现射频协议提供了理 想的平台。使用 nRF24LE1 的好处包括严密的协议时序,安全性,低功耗和改善共存的性能。 对于应用层,nRF24LE1 提供了一个丰富的外设包括:SPI,IIC,UART,6 至 12 位 ADC, PWM 和一个用于电压等级系统唤醒的超低功耗模拟比较器。 nRF24LE1 三种封装的差异 超紧凑 4*4mm 24 脚 QFN 封装(7 个通用 IO 引脚),主要用于对大小有严格要求的应用场 合,如 穿戴式运动传感器和手册 5*5mm 32 脚 QFN 封装(15 个通用 IO 引脚)适用于无线鼠标,远程控制和玩具 7*7mm 48 脚 QFN 封装(31 个通用 IO 引脚)为对 I/O 数量要求很高的产品而设计,如无线 键盘
无线模块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的功能特点:1.双向通信:NRF24L01可以同时作为发送器和接收器,实现双向通信。
这意味着可以用它构建各种无线传感器网络。
2. 高速数据传输:NRF24L01的最大数据传输速率为2Mbps,这使得它可以用于高速数据传输的应用场景,如视频传输。
3.高可靠性:NRF24L01具有自动重复传输和错误检测功能。
当传输数据时,NRF24L01会自动重复发送数据,并在接收端检测错误。
这提高了数据传输的可靠性。
4.小尺寸和低功耗:NRF24L01的尺寸小,只有20针的QFN封装,适用于各种空间受限的应用场景。
同时,它的工作电压范围广,只需1.9-3.6V,功耗低。
5.多通道:NRF24L01支持多达125个通道,这使得它可以与其他无线设备同时工作,避免干扰。
二、NRF24L01的使用方法:1. 引脚连接:首先,将NRF24L01的引脚连接到主控制器(如Arduino)上。
连接时需要注意引脚的对应关系,如CE(引脚1)连接到主控制器的数字引脚9上,CSN(引脚2)连接到数字引脚10上,SCK (引脚3)连接到数字引脚13上,等等。
2.配置寄存器:NRF24L01有多个寄存器,用于配置各种参数。
可以通过SPI接口向这些寄存器写入数据来配置NRF24L01、例如,可以通过写入到寄存器地址0x00的数据来配置NRF24L01的发射功率、数据传输速率、等等。
3.发送数据:在发送数据之前,需要将NRF24L01设置为发送模式。
首先,将CE置高,然后向TXFIFO寄存器中写入数据。
NRF24L01会自动将数据传输给接收器,并等待接收器的确认。
4.接收数据:在接收数据之前,需要将NRF24L01设置为接收模式。
首先,将CE置高,然后等待数据的接收。
一旦接收到数据,可以从RXFIFO寄存器中读取数据。
5.错误处理:当数据传输过程中出现错误时,NRF24L01会自动重复发送数据。
最简单的NRF24L01

史上功能最强大使用最简单的NRF24L01模块WLK02F24模块尺寸为什么设计WLK02F24?RFinchina从事数字无线推广已经7个年头,让无线产品应用设计简单再简单是RFinchina 人一直坚持的理念。
只有易用才能真正为使用者带来实实在在的便利,同时针对快速无线通讯的需求,用心打造出WLK02F24!WLK02F24解决了哪些问题?1.简单稳定才是最好的模块上集成MCU完成通讯协议使无线应用简单化、大大提高数据吞吐量,而这一切都是为了分担用户MCU的处理工作,在较为复杂的系统中体现地更为突出设计模块化是高效开发的最佳选择(实时性和稳定性都提高了)!2.快速是大众需要的模块空速最低250kbps ,串口速度最快115200,高速、大数据(上万字节数据包)吞吐量是本模块的特点,可基本满足快速无线应用3.灵活性是重要的可操作性简单,工作频率、收发地址等参数都可以设置切换,通用适合与多点通讯(跳频或者变址轮询通讯)4.通用性是非常方便的UAR丅数据接口可以更方便地与现有设备(如原RS232、RS485设备)进行无缝互联!5.兼容性是不可忽视的多年的无线推广,我们已经感受到一些射频芯片淘汰导致很多用户升级换代困难,这是我们做出兼容性设计的直接原因。
WLK系列模块的接口都兼容用法也一致,所以即使未来更多射频芯片淘汰停产,用户只需更换成其他WLK型号模块即可轻松升级换代。
6.服务是必须到位的如果无线尺寸结构需要调整,可提供定制服务,RFinchina始终从用户需求为己任,让无线简单,再简单!WLK02F24十大特性01:2.4GHz全球免费开放ISM频段02:支持任意字节长度数据包传输03:UAR丅串行数据接口,真简单04:自动收发、自动应答稳定可靠05:频率地址功率等参数可以设置06:支持跳频、寻址方式无线组网07:自测试功能方便信号?盖评估08:用户无需库存压力,降低风险09:如特殊教需求可提供订制服务10:一年无忧质保,终身有偿维护WLK02F24基本工作原理:模块平时处于接收状态,一旦收到数据,就把收到的数据通过UART输出,这时你可以用单片机来个中断接收函数啊,把数据读取存储,发送数据的时候把要发的数据通过UART 送给模块,他就自动发送,发送完毕,自动切换到接收模式WLK02F24硬件连接WLK02F24视频简介(进入优酷搜索WLK02F24请点击观看演示)短距离无线通信简介视频WLK02F24 手册简介视频WLK02F24 参数解析视频WLK02F24 工作模式解析WLK02F24 自测功能演示WLK02F24 基本通信演示WLK02F24 三大指令解析PC02F24 通讯演示视频无线通信基本是以下几种情况1.PC和PC之间无线通信2.MCU和PC之间无线通信3.MCU和MCU之间无线通信上位机(电脑)配套无线模块PC02F24(USB虚拟串口):下位机(MCU)配套无线模块:WLK02F24板载天线体积小,贴片接口参数设置及测试功能模块WLK2303参数选择后一键(写入配置)修改WLK02F24不足之处当然WLK02F24不是万能的,主要适用于智能家居领域,以满足近距离无线数据通信、无数控制。
nRF24L01无线模块讲解解析

发送章节。
• 2、 接收模式由设置CE 为高来启动。
• 3、 130us 后nRF24L01 开始检测空中信息。
第二十一页,共27页。
增强型ShockBurstTM 接收模式
• 4、 接收到有效的数据包后(地址匹配、CRC 检验正确),
• 低工作电压(1.9~3.6V)
第三页,共27页。
封装引脚及其引脚功能
第四页,共27页。
nRF单端50Ω射频输出原理图
第五页,共27页。
nRF24L10与单片机应用电路图
举例:
NRF24L01模块接口与STM32连接原理图
第六页,共27页。
中断
• nRF24L01 的中断引脚(IRQ)为低电平触发,当状态寄存器
接收到数据后有应答信号,以便于发送方检测有无数据丢失。
一旦数据丢失,则通过重新发送功能将丢失的数据恢复。
• 增强型的ShockBurst TM 模式可以同时控制应答及重发功能而
无需增加MCU工作量。
• 在Enhanced ShockBurstTM收发模式下, nRF24L01自动处
理字头和CRC校验码。在接收数据时,自动把字头和CRC
数据(TX_PLD)通过SPI 接口写入nRF24L01。发送数据的长度以字
节计数从MCU 写入TX FIFO。当CSN 为低时数据被不断的写入。发
送端发送完数据后,将通道0 设置为接收模式来接收应答信号,其接
收地址(RX_ADDR_P0)与接收端地址(TX_ADDR)相同。
例:在上图 中数据通道5 的发送端(TX5)及接收端(RX)地址设置如
以确保接收到正确的应答信号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。
三、模块引脚说明四、模块与AT89S52单片机接口电路注:上图为示意连接,可根据自己实际需求进行更改;使用AT89S52MCU模块时,请将Nrf24L01通讯模块每个端口(MOSI、SCK、CSN和CE)接4.7K的排阻上拉到VCC增强其驱动能力(如下图:)。
若使用其它单片机与Nrf24L01通讯模块相连时请串联2K电阻。
五、工作模式控制注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命令字节表2.SPI时序SPI读写时序见下面两图。
在写寄存器之前,一定要进入待机模式或掉电模式。
其中,Cn——SPI指令位;Sn——状态寄存器位;Dn——数据位(低字节在前,高字节在后;每个字节中高位在前)SPI读时序SPI写时序八、模块编程控制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)十、示例程序接收模块与发射模块大部分程序代码相同,如下: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 到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中断标志位}}。