NRF24L01无线发射简易教程_第1页
NRF24L01无线发射简易教程_第2页
NRF24L01无线发射简易教程_第3页
NRF24L01无线发射简易教程_第4页
NRF24L01无线发射简易教程_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、NRF24L01 简易教程先来看接口电路,使用的 IO 口不是唯一的哦,可随意定义接口,当然是在使用 IO 口模 拟 SPI 且 IRQ 中断引脚不使用的使用查询方法判断接收状态的情况下了。作为初探我们就是 用简单的 IO 模拟 SPI 的方法了,中断使用查询的方式。那么该教程讲解的接口与单片机的 连接如下:首先您需要了解 NRF24L01,请参阅“NRF24L01 芯片中文资料”或者“NRF24L01 芯片英 文资料”。我们的教程是以一个简单的小项目为大家展示 NRF24L01 的使用方法与乐趣。我们所写 的教程均是以这种方式的呢,让您在学习的时候明白它能做什么,使您学起来不至于枯燥 无味。

2、作为简易的教程,我们只需要知道它是怎么使用的就够了,我们本教程的目的是用 NRF24L01 发送数据和接收数据,且接收方会对比发送的数据与接收的数据,若完全相同则 控制 LED 闪烁一次,并且把接收到的数据通过串口发送到 PC 端,通过串口工具查看接收到 的数据。具体的要求如下:1、 具备发送和接收的能力。2、 发送 32 个字节的数据,接收方接收到正确数据之后给予提示,通过 LED 闪烁灯形 式。3、 把接收到的数据传送到 PC 进行查看。4、 发送端每隔大约 1.5 秒发送一次数据,永久循环。 以上是程序的要求,若您想自行设计出硬件接口,您也是可以添加一条呢:使用 DIY 方式设计 NRF

3、24L01 的接口板,且包含含单片机平台,使用 PCB 方式或者万用板方式均可。如 果您想让自己学的很扎实,那么推荐您自行做出接口板子呢。当然若您的能力不足,那么我 们不推荐自行做板呢,因为这样会增加您学习的难度,反而起到了反效果呢。我们使用的方式是画 PCB 的方式呢,若您自己做了接口板子,那么您可以对比下一呢,O(_)O!我们知道 NRF24L01 的供电电压是 1.9V3.6V 不能超过这个范围,低了不工作,高了可 能烧毁 NRF24L01 芯片。我们常用的 STC89C52 的单片机的供电电压是 5V,我们不能直接给 24L01 这个模块供电,我们需要使用 AMS1117-3.3V 稳

4、压芯片把 5V 转成 3.3V 的电压为 24L01 模块供电。为此我们的设计原理图如下:包含单片机最小系统、供电系统、下载程序接口、5V 转 3.3V 电路、NRF24L01 模块接口。并且全部引出单片机的 IO 口,另外还加了 5 个电源输出接 口,为扩展使用。还包括了电源指示 LED 以及一个 IO 口独立控制的 LED,这个独立控制的 用于 NRF24L01 接收成功闪烁指示。为了保证系统的稳定性,在设计中添加了两个滤 波电容。JP1JP2P10P11 P12 P13 P14 P15 P16 P17 RST P30 P31 P32 P33 P34 P35 P36 P37 X1 X2 V

5、CC P02P03P00P01 P04 P05 P06P07 EAALE PSENP27P26 P25P24P23 P22 P21P20HEADER 20 HEADER 20GNDIO扩展VCCC4104U1VCC J5VCCJ2GNDVCC 12345P10P11 P12 P13 P14 P15 P16 P17 RST P30 P31 P32 P33 P34 P35 P36 P37 X1 X2 GND 4039 38 3736 3534 3332 3130 ALE29 PSEN 28 P2727 P26 26 P2525 P24 24 P2323 P22 22 P21 21 P20排阻J3J

6、121VCC EA_ENVCCD1 R2VCC GNDSTC89C52LED5.1KGND电源及其扩展STC89C52主控C1 X130pF XTAL1GNDC212MHzX230pF晶振电路VCCKEY2RSTC310uFRSTR1 10KGND复位电路1234567891011121314151617181920C5 220uF3. 3VCC123DC1 GND 1KEY1Switch2DCIN1P10VCCP11P00P12P01P13P02P14P03P15P04P16P05P17P06RSTP07P30EA/VPP31ALE/P P32/INT0 PSEN P33/INT1 P27P

7、34/T0P26P35/T1P25P36/WRP24P37/RDP23X1P22X2P21GNDP202345678910111213141516171819201P002P013P024P0356P04P0578P06P079EA C6C710uFGND OUTU2 LM1117_3.3V10uFGND12345 GNDGND1 23 45 67 8P13.3P24P22 P20P25P23 P21CECSNSCKMISOIRQ R3P26LED5.1KHeader 4X2 VCCD21234567891011121314151617181920J4VCC12 P30 3 P314串口下载G

8、NDPCB 布线图如下:207 26 23 20 111213 4 5 6 7 8 9 10 1112131415161718192 7 5 3 152112 8 64 2434039 38 37 36 35 34 33 32 31 30292825242221212 111234567892 11 6 5 41 212 212212121212 25 3 2 14 1212345678910 1112131415 16 171819 2031132424 3 2 1 2 21234567891112131415 16 171819 201完成效果图如下:背面图:上 面 PCB 的 背 面有

9、个 小芯 片 和两 个 0805 的 元件 , 他 们是 什 么呢 ? 他们 就 是AMS1117-3.3V 和两个贴片的滤波电容,为 NRF24L01 提供 3.3V 电源的电源转换部分。 大家有兴趣也可以自己做呢。也许大家有疑问,能不能用呢?放心好了,我们的例程就是以这个板子为基板的,没有 任何问题。这个板子是不是感觉很不错呢,呵呵!它不仅仅是可作为最小系统使用,而且还 是 NRF24L01 的接口板呢,省去了另外还要做电源转接板以及各种插线的痛苦,O(_)O! 写这个教程时我也觉得非常好使呢。板子做好了,我们看看 24L01 怎么来操作吧,这也是本教程的重点呢。我们呢就按照上 面的功能要

10、求来设计这个程序。在程序设计之前先了解下 NRF24L01。NRF24L01 是 NORDIC 公司最近生产的一款无线通信通信芯片,采用 FSK 调制,内部集 成 NORDIC 自己的 Enhanced Short Burst 协议。可以实现点对点或是 1 对 6 的无线通信。 无线通信速度可以达到 2M(bps)。NORDIC 公司提供通信模块的 GERBER 文件,可以直接 加工生产。嵌入式工程师或是单片机爱好者只需要为单片机系统预留 5 个 GPIO,1 个中断 输入引脚,就可以很容易实现无线通信的功能,非常适合用来为 MCU 系统构建无线通信功 能。功能描述:真正的 GFSK 单片式收

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

12、些就是使用此无线技术实现的呢。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 M

13、ode:掉电模式 Tx Mode:发射模式Rx Mode:接收模式Standby-1Mode:待机 1 模式Standby-2 Mode:待机 2 模式我们使用的模式主要为发射模式和接收模式。下面来看看怎么配置这些模式吧。我们知道NRF24L01 的通信协议为SP(I SPI的协议请大家查阅相应资料,百度一下你就会有收获哦!),所以我们看看 SPI 协议怎么写(IO 口模拟,STC89C52 没有硬件 SPI,若您会了 STC12C5Axxxx系列的单片机那么您可以使用硬件的 SPI,将会更加的方便高效)。调用是用下面的语句进行的。以上为 IO 口模拟 SPI 的代码,通用于任何拥有可操作 I

14、O 的微处理器,需要做好位运算 处理。代码的解释如程序中的注释所示。非常详细的注释哦!也采用了自己喜欢的编程风格, 您也可以借鉴的呢!我们主要是来看看它的配置过程。我想对于一种芯片它的正确配置是大家最为关心的, 有时您也许会为了这些配置问题而伤脑筋。我们先来看发射模式改怎么配置的。发射模式的配置顺序:1.设置 TX 节点的地址,也就是发射地址,接收端需与这个地址相同,否则接收不 到数据。寄存器为:TX_ADDR2.设置 RX 节点的地址,也就是接收时的地址,如果是在发射模式下那么功能是为 自动应答服务的(AUTO ACK)。寄存器为:RX_ADDR_P03.允许 AUTO ACK 功能,意思是

15、发送数据后都会等待接收端的应答信号,目的是保 证数据正确发送。寄存器为:EN_AA4.设置允许的接收通道,总共有 6 个通道,我们只使用通道 0,其他通道的功能应 用大家熟悉了 NRF24L01 之后尝试吧。寄存器为:EN_RXADDR5.配置自动重发次数。寄存器为:SETUP_RETR6.选择通信的频率。寄存器为:RF_CH7.设置接收通道 0 的接收数据有效宽度,与第四步对应。寄存器为:RX_PW_P08.配置发射的参数,主要为低噪放大器增益、发射的功率、无线传输的速率。寄存 器为:RF_SETUP9.配置收发状态(这时配置为发射模式),CRC 校验模式以及收发状态响应方式。 寄存器为:C

16、ONFIGTX 发射模式的配置就是如此了。我们从第一行看看他是什么意思。 第一步设置 TX 的地址,调用了函数 SPI_Write_Buf(),它的原型是:WRITE_REG 是写寄存器指令的基地址,TX_ADDR 是相对于基地址的偏移量,WRITE_REG+ TX_ADDR 就是设置发送地址的寄存器了。若您不明白这些概念,也没关系,知道是这样使 用的就行了。这两个常量是用宏定义来定义的,原型如下:TX_ADDRESS 就是要设置的地址了,NRF24L01 的地址是 5 个字节的,也就是 40 位。TX_ADR_WIDTH 就是致命这个地址的长度了。他们的定义如下:有这些命令和数据,再结合 S

17、PI_Write_Buf()这个函数就可以实现对 NRF24L01 本地发射 地址的设置了。由 SPI_Write_Buf()这个函数我们可以看到,它的写入方式是:先设置将要操 作的寄存器地址(这里是本地发射地址寄存器),然后再连续写入地址数据的信息,也就是 TX_ADDRESS 数组中的地址数据。注意接收端的地址与这个必须一模一样。那么第二句也是跟第一句同理的,操作的方式一模一样,只是选择的地址和写入的数据 不一样而已。如果您想深入了解,那么就是用编译器 keil 的跟踪功能查看各个寄存器的意义吧,程序 和硬件我们都有配套提供。后面的寄存器操作使用的函数都是 SPI_RW_Reg(),原型如

18、下:可以看到它的功能是选择一个寄存器然后写入这个寄存器的操作命令,是单字节进行的。 那么它是如何操作的呢?它也是 SPI_Write_Buf()类似,先选择寄存器然后向这个寄存器写入 命令或数据。到这呢我想对于很多刚学习不久的朋友来说,这些寄存、寄存器的数据或命令 都是一些字节数据 8 位、16 位或者其他,总是搞不清楚他们到底是怎么一回事,说实话这 些在当时也困扰了我很长时间,这主要是这样的概念我们还没接受导致的,原来老师也总是 跟我们将教室的门牌号和教室里学生之间的关系,由于刚接触很难真正理解。总之简单一句 话,如果你想找到在教室 101 房间的一个同学,那么你就得先找到 101 这个教室

19、,然后再去 找你想找的同学。程序中的寄存器和寄存器中的数据跟这个也是相同的概念,你要操作一个 命令位或者字节,那么你得先定位它的位置(寄存器),才能对它正确无误的操作。言归正 传,我们在操作一个芯片时,对其的控制都是以这种方式进行的:先选择寄存器然后向这个 寄存器写入(或读出)命令(状态)或数据。以上的这些需要大家慢慢体会了,不明白也不影响我们使用这个 NRF24L01 的,呵呵! 紧接着就是第三步到第九步了,我想大家又会有疑问了:为什么寄存器后面写入的数据要是那样的呢?这就需要知道他们各个位的意义了。我们看下图就能明白了。我们那 EN_AA 来举例说明:可以看到它的寄存器偏移是 0x01,这

20、里说明一下,如果想要进行写操作那么操作的寄 存器地址是 WRITE_REG + EN_AA,也就是 EN_AA 加上写指令的基地址,若是读操作那么是 READ_REG + EN_AA,也就是 EN_AA 加上读指令的基地址。我们看看 EN_AA 这个寄存器的功能是什么。它的位为 8 位初始化的值为 00111111 即。0x3f,每个位的功能上表已经很详细了 这个送的数据是 0x01,那么表示什么意思呢?意思是允许数据通道 0 自动应答,而其他的通 道禁止,明白了吧。其他的都是这个样子滴。这是 NRF24L01 设置发射模式时的初始化过程。下面我们看看怎么用 NRF24L01 进行无 线数据发

21、射传输。我们从主函数 main 开始。主函数很简单,我们为您提供了两个模式的发射方式:手动发射(按键控制)和自动发 射(每隔一段时间发送一次数据)。这是模式 1,该模式为自动发射。可以看到主函数调用的就是模式 1,对于模式 0 手动 方式,大家把主函数的 Mode1 改为 Mode0 就可以验证了。详细请看程序源码。在 Mode1()这个函数中我们看看是怎么样的一个操作顺序。先延时 1500ms 左右,然后 装载数据到 NRF24L01,LED 的操作就很简单了只是一个提示的作用,最后再清除 NRF24L01 的状态标志位,为下一次发送数据准备。大家要了解数据的发送是这个样子的。SPI_RW_

22、Reg() 这 个函 数 就 不多 说 了, 目 的与 前 面所 说 的 是一 样 的。 我 们 来看 看NRF24L01_TxPacket 这个函数。注释的部分是装载接收端的地址,也就是为应答信号服务的,由于在初始化的时候已经 初始化过了,所以这里可以不需要,但是当您使用 NRF24L01 跟多的功能时,如使用了多通 道通信,需要应答时,这句就有用了,需要设置为对应接收通道的地址才能收到应答信号。 这些功能大家知道就可以了,本教程也是让大家会用 NRF24L01,后续还是靠大家自行努力 了。接着是装载数据了,WR_TX_PLOAD 是装载数据的命令地址,tx_buf 是接收的数据指针,TX_

23、PLOAD_WIDTH 是指要发送的数据字节数。定义如下:注意 TX_PLOAD_WIDTH 最大为 32 字节,不得操作此数。 数据装载完成后需要的是发送命令了。这句就是设置了为发送 的状态,在 CE 被拉高的时间里自动启动发送。那么紧接着 CE=1 就是此目的了。CONFIG 为什么设置数据为 0x0e 就是发送呢,那么看下这个寄存器各个位的功能就明白 了。看看最低位的功能:1 接收模式0 发射模式,这明白了吧。其他位大家自己看看是什 么功能吧。这样一个完整的发射过程就完成了,刚才说了 Mode1()是循环发射模式,一次完成后就 会进入下一次发射了。那么到这里我们的项目任务算是完成了一半了

24、,还剩下另一半了。 看了发射模式之后,我们再来看接收模式就不会很困难了。接收模式的配置初始化为:1.设置 RX 节点的地址,也就是接收时的地址,如果是在发射模式下那么功能是为 自动应答服务的(AUTO ACK)。寄存器为:RX_ADDR_P02.允许 AUTO ACK 功能,意思是发送数据后都会等待接收端的应答信号,目的是保 证数据正确发送。寄存器为:EN_AA3.设置允许的接收通道,总共有 6 个通道,我们只使用通道 0,其他通道的功能应 用大家熟悉了 NRF24L01 之后尝试吧。寄存器为:EN_RXADDR4.选择通信的频率。寄存器为:RF_CH5.设置接收通道 0 的接收数据有效宽度。

25、寄存器为:RX_PW_P06.配置发射的参数,主要为低噪放大器增益、发射的功率、无线传输的速率。寄 存器为:RF_SETUP7.配置收发状态(这时配置为接收模式),CRC 校验模式以及收发状态响应方式。 寄存器为:CONFIG注意接收模式的一些设置如第 1、2、3、4、5、6 中的数据参数要与发射模式的一致。为此操作起来就更加简单了。从上面的初始化方式我们可以看到接收与发射的设置基本 一致,只是接收模式中少了 2 个操作,设置 TX 地址和设置重发次数,对于接收这两个设置 时无关紧要的,所以设置不设置我们都不会用,那么我们在接收模式中仍然可以使用发射模 式下的初始化函数 Init_NRF24L

26、01(),我们的例程就是如此。发射与接收模式的不同就在于 CONFIG 这个寄存器的设置不同,发射模式这个寄存器的最后一位需要置 0,那么接收就得置 1,所以在判断接收前把这个位设置一下不就可以了。 我们写一个函数来实现这个功能:在接收模式中我们最需要注意的就是这个接收模式的设置了。向 CONFIG 些 0x0f 就可以 把最后一位设置为 1 了,就成了接收模式了。我们也从主函数出发,看看是怎么操作的。前面的初始化我们需要了解的是 InitUSART()这个函数,我们项目最开始的要求有一项是 接收端接收到的数据需要发送到 PC 进行查看,InitUSART()这个函数就是初始化串口通信的。 看

27、它的原型:这个初始化就不多说了,对于不同的波特率使用注释中给的公式即可算出定时器的初值 了。注意使用的是定时器 1 而不是定时器 0。串口发送数据的函数是 Rx_Byte()源码如下:只要按照 Rx_Byte(Dat)这样调用就能把 Dat 这个数据发送到 PC 了,PC 需要用串口助手 来查看数据,我们使用的 STC-ISP 下载软件即可使用,设置如下:选择到串口助手界面,在下面设置 COM 口和波特率,其他默认就可以了。点击这个按钮就可进入串口助手模式了。我们接着看主函数的代码,LED=1 是熄灭 LED 的,如果接收不到数据那么是长灭的状态, 接收到数据且数据完全正确后才被点亮一段时间(

28、闪烁一下的效果)用于提示。紧接着是 这个 if 条件语句,它就是查询判断 NRF24L01 的接收状态的。我们来看着这个被调用的函数:是读取 NRF24L01 的状态,目的是判断是否有数据接收。的地址。SPI_Read()的源码为:是 STATUS 的宏定义,是状态寄存器前面说了所有的寄存器操作都是先设置寄存器地址,然后在写(或读)数据或命令() 状 态 。 那 么 这 里 呢 SPI_Read() 这 个 函 数 就 不 说 了 。 这 里 值 得 一 提 的 是这个调用,传入的实参是,有很多人不明白这个。这里呢简单说一下,可以看到对于读来说这个数据是没有用的,所以 可以是任何的数据。然而习惯上都爱使用 0xff,希望大家慢慢能够明白。在 NRF24L01_RxPacket()这个函数中还有个特别的变量 sta,它的声明为:可以看到这个使用了位操作,目的是什么呢?这样可以使位操作变得非常简单,对于判 断状态是很有用的。我们来看 STATUS 这个寄存器的意义:可以看到对于接收我们需要判断 RX_DR 这个位是否为 1,为 1 就表示有数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论