当前位置:文档之家› NRF24L01详细教程..

NRF24L01详细教程..

先来看接口电路,使用的IO 口不是唯一的哦,可随意定义接口,当然是在使用IO 口模拟SPI 且IRQ 中断引脚不使用的使用查询方法判断接收状态的情况下了。

作为初探我们就是用简单的IO 模拟SPI 的方法了,中断使用查询的方式。

那么该教程讲解的接口与单片机的连接如下:首先您需要了解NRF24L01,请参阅“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 模块供电。

为此我们的设计原理图如下:包含单片机最小系统、供电系统、下载程序接口、5V 转3.3V 电路、NRF24L01 模块接口。

并且全部引出单片机的IO 口,另外还加了5 个电源输出接口,为扩展使用。

还包括了电源指示LED 以及一个IO 口独立控制的LED,这个独立控制的LED用于NRF24L01 接收成功闪烁指示。

为了保证系统的稳定性,在设计中添加了两个滤波电容。

上面PCB 的背面有个小芯片和两个0805 的元件,他们是什么呢?他们就是AMS1117-3.3V 和两个贴片的滤波电容,为NRF24L01 提供3.3V 电源的电源转换部分。

NRF24L01 是NORDIC 公司最近生产的一款无线通信通信芯片,采用FSK 调制,内部集成NORDIC 自己的Enhanced Short Burst 协议。

可以实现点对点或是1 对 6 的无线通信。

无线通信速度可以达到2M(bps)。

NORDIC 公司提供通信模块的GERBER 文件,可以直接加工生产。

嵌入式工程师或是单片机爱好者只需要为单片机系统预留 5 个GPIO,1 个中断输入引脚,就可以很容易实现无线通信的功能,非常适合用来为MCU 系统构建无线通信功能。

功能描述:真正的GFSK 单片式收发芯片内置硬件链路层增强型ShockBurstTM 功能自动应答及自动重发功能地址及CRC 检验功能无线速率:1 或2MbpsSPI 接口速率:0~8Mbps125 个可选工作频道很短的频道切换时间,可用于跳频与nRF 24XX 系列完全兼容I/O 可接受5V 电平的输入20 脚QFN 4×4mm 封装极低成本晶振±60ppm使用低成本电感和双面PCB 板低工作电压:1.9~3.6V应用领域:无线鼠标,键盘,游戏机操纵杆无线数据通讯无线门禁安防系统遥控装置遥感勘测智能运动设备工业传感器玩具我们常见的2.4GHz 无线键盘鼠标有些就是使用此无线技术实现的呢。

NRF24L01 引脚功能说明:引脚分别为CSN、SCK、MISO、MOSI、IRQ、CE。

CSN:芯片的片选线,CSN 为低电平芯片工作。

SCK:芯片控制的时钟线(SPI 时钟)MISO:芯片控制数据线(主入从出)MOSI:芯片控制数据线(主出从入)IRQ:中断信号。

无线通信过程中MCU 主要是通过IRQ 与NRF24L01 进行通信。

CE:芯片的模式控制线。

在CSN 为低的情况下,CE 协同NRF24L01 的CONFIG 寄存器共同决定NRF24L01 的状态。

NRF24L01 主要有以下几种工作状态:Power Down Mode:掉电模式Tx Mode:发射模式Rx Mode:接收模式Standby-1Mode:待机1 模式Standby-2 Mode:待机2 模式我们使用的模式主要为发射模式和接收模式。

下面来看看怎么配置这些模式吧。

我们知道NRF24L01 的通信协议为SPI(SPI 的协议请大家查阅相应资料,百度一下你就会有收获哦!),所以我们看看SPI 协议怎么写(IO 口模拟,STC89C52 没有硬件SPI,若您会了STC12C5Axxxx系列的单片机那么您可以使用硬件的SPI,将会更加的方便高效)。

以上为IO 口模拟SPI 的代码,通用于任何拥有可操作IO 的微处理器,需要做好位运算处理。

代码的解释如程序中的注释所示。

非常详细的注释哦!也采用了自己喜欢的编程风格,您也可以借鉴的呢!我们主要是来看看它的配置过程。

我想对于一种芯片它的正确配置是大家最为关心的,有时您也许会为了这些配置问题而伤脑筋。

我们先来看发射模式改怎么配置的。

发射模式的配置顺序:1. 设置TX 节点的地址,也就是发射地址,接收端需与这个地址相同,否则接收不到数据。

寄存器为:TX_ADDR2. 设置RX 节点的地址,也就是接收时的地址,如果是在发射模式下那么功能是为自动应答服务的(AUTO ACK)。

寄存器为:RX_ADDR_P03. 允许AUTO ACK 功能,意思是发送数据后都会等待接收端的应答信号,目的是保证数据正确发送。

寄存器为:EN_AA4. 设置允许的接收通道,总共有6 个通道,我们只使用通道0,其他通道的功能应用大家熟悉了NRF24L01 之后尝试吧。

寄存器为:EN_RXADDR5. 配置自动重发次数。

寄存器为:SETUP_RETR6. 选择通信的频率。

寄存器为:RF_CH7. 设置接收通道0 的接收数据有效宽度,与第四步对应。

寄存器为:RX_PW_P08. 配置发射的参数,主要为低噪放大器增益、发射的功率、无线传输的速率。

寄存器为:RF_SETUP9. 配置收发状态(这时配置为发射模式),CRC 校验模式以及收发状态响应方式。

寄存器为:CONFIGTX 发射模式的配置就是如此了。

我们从第一行看看他是什么意思。

第一步设置TX 的地址,调用了函数SPI_Write_Buf(),它的原型是:WRITE_REG 是写寄存器指令的基地址,TX_ADDR 是相对于基地址的偏移量,WRITE_REG+ TX_ADDR 就是设置发送地址的寄存器了。

若您不明白这些概念,也没关系,知道是这样使用的就行了。

这两个常量是用宏定义来定义的,原型如下:TX_ADDRESS 就是要设置的地址了,NRF24L01 的地址是5 个字节的,也就是40 位。

TX_ADR_WIDTH 就是致命这个地址的长度了。

他们的定义如下:有这些命令和数据,再结合SPI_Write_Buf()这个函数就可以实现对NRF24L01 本地发射地址的设置了。

由SPI_Write_Buf()这个函数我们可以看到,它的写入方式是:先设置将要操作的寄存器地址(这里是本地发射地址寄存器),然后再连续写入地址数据的信息,也就是TX_ADDRESS 数组中的地址数据。

注意接收端的地址与这个必须一模一样。

那么第二句也是跟第一句同理的,操作的方式一模一样,只是选择的地址和写入的数据不一样而已。

如果您想深入了解,那么就是用编译器keil 的跟踪功能查看各个寄存器的意义吧,程序和硬件我们都有配套提供。

后面的寄存器操作使用的函数都是SPI_RW_Reg(),原型如下:可以看到它的功能是选择一个寄存器然后写入这个寄存器的操作命令,是单字节进行的。

那么它是如何操作的呢?它也是SPI_Write_Buf()类似,先选择寄存器然后向这个寄存器写入命令或数据。

到这呢我想对于很多刚学习不久的朋友来说,这些寄存、寄存器的数据或命令都是一些字节数据8 位、16 位或者其他,总是搞不清楚他们到底是怎么一回事,说实话这些在当时也困扰了我很长时间,这主要是这样的概念我们还没接受导致的,原来老师也总是跟我们将教室的门牌号和教室里学生之间的关系,由于刚接触很难真正理解。

总之简单一句话,如果你想找到在教室101 房间的一个同学,那么你就得先找到101 这个教室,然后再去找你想找的同学。

程序中的寄存器和寄存器中的数据跟这个也是相同的概念,你要操一个命令位或者字节,那么你得先定位它的位置(寄存器),才能对它正确无误的操作。

言归正传,我们在操作一个芯片时,对其的控制都是以这种方式进行的:先选择寄存器然后向这个寄存器写入(或读出)命令(状态)或数据。

以上的这些需要大家慢慢体会了,不明白也不影响我们使用这个NRF24L01 的,呵呵!紧接着就是第三步到第九步了,我想大家又会有疑问了:为什么寄存器后面写入的数据要是那样的呢?这就需要知道他们各个位的意义了。

我们看下图就能明白了。

我们拿EN_AA 来举例说明:可以看到它的寄存器偏移是0x01,这里说明一下,如果想要进行写操作那么操作的寄存器地址是WRITE_REG + EN_AA,也就是EN_AA 加上写指令的基地址,若是读操作那么是READ_REG + EN_AA,也就是EN_AA 加上读指令的基地址。

我们看看EN_AA 这个寄存器的功能是什么。

它的位为8 位初始化的值为00111111 即0x3f,每个位的功能上表已经很详细了。

这个送的数据是0x01,那么表示什么意思呢?意思是允许数据通道0 自动应答,而其他的通道禁止,明白了吧。

其他的都是这个样子滴。

这是NRF24L01 设置发射模式时的初始化过程。

下面我们看看怎么用NRF24L01 进行无线数据发射传输。

我们从主函数main 开始。

主函数很简单,我们为您提供了两个模式的发射方式:手动发射(按键控制)和自动发射(每隔一段时间发送一次数据)。

这是模式1,该模式为自动发射。

可以看到主函数调用的就是模式1,对于模式0 手动方式,大家把主函数的Mode1 改为Mode0 就可以验证了。

详细请看程序源码。

在Mode1()这个函数中我们看看是怎么样的一个操作顺序。

相关主题