ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:3.06MB ,
资源ID:5997370      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5997370.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(NRF24L01无线发射简易教程.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

NRF24L01无线发射简易教程.docx

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

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

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

4、用 AMS1117-3.3V 稳压芯片把 5V 转成 3.3V 的电压为 24L01 模块供电。为此我们的设计原理图如下:包含单片机最小系统、供电系统、下载程序接口、5V 转 3.3V 电路、NRF24L01 模块接口。并且全部引出单片机的 IO 口,另外还加了 5 个电源输出接 口,为扩展使用。还包括了电源指示 LED 以及一个 IO 口独立控制的 LED,这个独立控制的 用于 NRF24L01 接收成功闪烁指示。为了保证系统的稳定性,在设计中添加了两个滤 波电容。3. 3VCC C6 C710uFU2 LM1117_3.3V10uF GNDGNDCE CSN SCKMISO IRQ Hea

5、der 4X2 VCCD21234567891011121314151617181920J4 VCCGNDPCB 布线图如下:完成效果图如下:背面图:上 面 PCB 的 背 面有 个 小芯 片 和两 个 0805 的 元件 , 他 们是 什 么呢 ? 他们 就 是AMS1117-3.3V 和两个贴片的滤波电容,为 NRF24L01 提供 3.3V 电源的电源转换部分。 大家有兴趣也可以自己做呢。也许大家有疑问,能不能用呢?放心好了,我们的例程就是以这个板子为基板的,没有 任何问题。这个板子是不是感觉很不错呢,呵呵!它不仅仅是可作为最小系统使用,而且还 是 NRF24L01 的接口板呢,省去了另

6、外还要做电源转接板以及各种插线的痛苦,O(_)O! 写这个教程时我也觉得非常好使呢。板子做好了,我们看看 24L01 怎么来操作吧,这也是本教程的重点呢。我们呢就按照上 面的功能要求来设计这个程序。在程序设计之前先了解下 NRF24L01。NRF24L01 是 NORDIC 公司最近生产的一款无线通信通信芯片,采用 FSK 调制,内部集 成 NORDIC 自己的 Enhanced Short Burst 协议。可以实现点对点或是 1 对 6 的无线通信。 无线通信速度可以达到 2M(bps)。NORDIC 公司提供通信模块的 GERBER 文件,可以直接 加工生产。嵌入式工程师或是单片机爱好者

7、只需要为单片机系统预留 5 个 GPIO,1 个中断 输入引脚,就可以很容易实现无线通信的功能,非常适合用来为 MCU 系统构建无线通信功 能。功能描述:真正的 GFSK 单片式收发芯片 内置硬件链路层增强型 ShockBurstTM 功能 自动应答及自动重发功能 地址及 CRC 检验功能 无线速率: 1 或 2Mbps SPI 接口速率:08Mbps 125 个可选工作频道很短的频道切换时间,可用于跳频 与 nRF 24XX 系列完全兼容I/O 可接受 5V 电平的输入 20 脚 QFN 44mm 封装 极低成本晶振60ppm使用低成本电感和双面 PCB 板 低工作电压:1.93.6V应用领

8、域:无线鼠标,键盘,游戏机操纵杆 无线数据通讯无线门禁 安防系统 遥控装置 遥感勘测 智能运动设备 工业传感器 玩具我们常见的 2.4GHz 无线键盘鼠标有些就是使用此无线技术实现的呢。NRF24L01 引脚功能说明:引脚分别为 CSN、SCK、MISO、MOSI、IRQ、CE。 CSN:芯片的片选线,CSN 为低电平芯片工作。 SCK:芯片控制的时钟线(SPI 时钟) MISO:芯片控制数据线(主入从出) MOSI:芯片控制数据线(主出从入)IRQ:中断信号。无线通信过程中 MCU 主要是通过 IRQ 与 NRF24L01 进行通信。 CE: 芯片的模式控制线。 在 CSN 为低的情况下,C

9、E 协同 NRF24L01 的 CONFIG 寄 存器共同决定 NRF24L01 的状态。NRF24L01 主要有以下几种工作状态:Power Down Mode:掉电模式 Tx Mode:发射模式Rx Mode:接收模式Standby-1Mode:待机 1 模式Standby-2 Mode:待机 2 模式我们使用的模式主要为发射模式和接收模式。下面来看看怎么配置这些模式吧。我们知道NRF24L01 的通信协议为SP(I SPI的协议请大家查阅相应资料,百度一下你就会有收获哦!),所以我们看看 SPI 协议怎么写(IO 口模拟,STC89C52 没有硬件 SPI,若您会了 STC12C5Axx

10、xx系列的单片机那么您可以使用硬件的 SPI,将会更加的方便高效)。以上为 IO 口模拟 SPI 的代码,通用于任何拥有可操作 IO 的微处理器,需要做好位运算 处理。代码的解释如程序中的注释所示。非常详细的注释哦!也采用了自己喜欢的编程风格, 您也可以借鉴的呢!我们主要是来看看它的配置过程。我想对于一种芯片它的正确配置是大家最为关心的, 有时您也许会为了这些配置问题而伤脑筋。我们先来看发射模式改怎么配置的。发射模式的配置顺序:1. 设置 TX 节点的地址,也就是发射地址,接收端需与这个地址相同,否则接收不 到数据。寄存器为:TX_ADDR2. 设置 RX 节点的地址,也就是接收时的地址,如果

11、是在发射模式下那么功能是为 自动应答服务的(AUTO ACK)。寄存器为:RX_ADDR_P03. 允许 AUTO ACK 功能,意思是发送数据后都会等待接收端的应答信号,目的是保 证数据正确发送。寄存器为:EN_AA4. 设置允许的接收通道,总共有 6 个通道,我们只使用通道 0,其他通道的功能应 用大家熟悉了 NRF24L01 之后尝试吧。寄存器为:EN_RXADDR5. 配置自动重发次数。寄存器为:SETUP_RETR6. 选择通信的频率。寄存器为:RF_CH7. 设置接收通道 0 的接收数据有效宽度,与第四步对应。寄存器为:RX_PW_P08. 配置发射的参数,主要为低噪放大器增益、发

12、射的功率、无线传输的速率。寄存 器为:RF_SETUP9. 配置收发状态(这时配置为发射模式),CRC 校验模式以及收发状态响应方式。 寄存器为:CONFIGTX 发射模式的配置就是如此了。我们从第一行看看他是什么意思。 第一步设置 TX 的地址,调用了函数 SPI_Write_Buf(),它的原型是:WRITE_REG 是写寄存器指令的基地址,TX_ADDR 是相对于基地址的偏移量,WRITE_REG+ TX_ADDR 就是设置发送地址的寄存器了。若您不明白这些概念,也没关系,知道是这样使 用的就行了。这两个常量是用宏定义来定义的,原型如下:TX_ADDRESS 就是要设置的地址了,NRF2

13、4L01 的地址是 5 个字节的,也就是 40 位。TX_ADR_WIDTH 就是致命这个地址的长度了。他们的定义如下:有这些命令和数据,再结合 SPI_Write_Buf()这个函数就可以实现对 NRF24L01 本地发射 地址的设置了。由 SPI_Write_Buf()这个函数我们可以看到,它的写入方式是:先设置将要操 作的寄存器地址(这里是本地发射地址寄存器),然后再连续写入地址数据的信息,也就是 TX_ADDRESS 数组中的地址数据。注意接收端的地址与这个必须一模一样。那么第二句也是跟第一句同理的,操作的方式一模一样,只是选择的地址和写入的数据 不一样而已。如果您想深入了解,那么就是

14、用编译器 keil 的跟踪功能查看各个寄存器的意义吧,程序 和硬件我们都有配套提供。后面的寄存器操作使用的函数都是 SPI_RW_Reg(),原型如下:可以看到它的功能是选择一个寄存器然后写入这个寄存器的操作命令,是单字节进行的。 那么它是如何操作的呢?它也是 SPI_Write_Buf()类似,先选择寄存器然后向这个寄存器写入 命令或数据。到这呢我想对于很多刚学习不久的朋友来说,这些寄存、寄存器的数据或命令 都是一些字节数据 8 位、16 位或者其他,总是搞不清楚他们到底是怎么一回事,说实话这 些在当时也困扰了我很长时间,这主要是这样的概念我们还没接受导致的,原来老师也总是 跟我们将教室的门

15、牌号和教室里学生之间的关系,由于刚接触很难真正理解。总之简单一句 话,如果你想找到在教室 101 房间的一个同学,那么你就得先找到 101 这个教室,然后再去 找你想找的同学。程序中的寄存器和寄存器中的数据跟这个也是相同的概念,你要操作一个 命令位或者字节,那么你得先定位它的位置(寄存器),才能对它正确无误的操作。言归正 传,我们在操作一个芯片时,对其的控制都是以这种方式进行的:先选择寄存器然后向这个 寄存器写入(或读出)命令(状态)或数据。以上的这些需要大家慢慢体会了,不明白也不影响我们使用这个 NRF24L01 的,呵呵! 紧接着就是第三步到第九步了,我想大家又会有疑问了:为什么寄存器后面

16、写入的数据要是那样的呢?这就需要知道他们各个位的意义了。我们看下图就能明白了。可以看到它的寄存器偏移是 0x01,这里说明一下,如果想要进行写操作那么操作的寄 存器地址是 WRITE_REG + EN_AA,也就是 EN_AA 加上写指令的基地址,若是读操作那么是 READ_REG + EN_AA,也就是 EN_AA 加上读指令的基地址。我们看看 EN_AA 这个寄存器的功能是什么。它的位为 8 位初始化的值为 00111111 即。0x3f,每个位的功能上表已经很详细了 这个送的数据是 0x01,那么表示什么意思呢?意思是允许数据通道 0 自动应答,而其他的通 道禁止,明白了吧。其他的都是这

17、个样子滴。这是 NRF24L01 设置发射模式时的初始化过程。下面我们看看怎么用 NRF24L01 进行无 线数据发射传输。我们从主函数 main 开始。主函数很简单,我们为您提供了两个模式的发射方式:手动发射(按键控制)和自动发 射(每隔一段时间发送一次数据)。这是模式 1,该模式为自动发射。可以看到主函数调用的就是模式 1,对于模式 0 手动 方式,大家把主函数的 Mode1 改为 Mode0 就可以验证了。详细请看程序源码。在 Mode1()这个函数中我们看看是怎么样的一个操作顺序。先延时 1500ms 左右,然后 装载数据到 NRF24L01,LED 的操作就很简单了只是一个提示的作用

18、,最后再清除 NRF24L01 的状态标志位,为下一次发送数据准备。大家要了解数据的发送是这个样子的。NRF24L01_TxPacket 这个函数。注释的部分是装载接收端的地址,也就是为应答信号服务的,由于在初始化的时候已经 初始化过了,所以这里可以不需要,但是当您使用 NRF24L01 跟多的功能时,如使用了多通 道通信,需要应答时,这句就有用了,需要设置为对应接收通道的地址才能收到应答信号。 这些功能大家知道就可以了,本教程也是让大家会用 NRF24L01,后续还是靠大家自行努力 了。接着是装载数据了,WR_TX_PLOAD 是装载数据的命令地址,tx_buf 是接收的数据指针,TX_PL

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

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

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

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

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

24、亮一段时间(闪烁一下的效果)用于提示。紧接着是 这个 if 条件语句,它就是查询判断 NRF24L01 的接收状态的。我们来看着这个被调用的函数:状态,目的是判断是否有数据接收。的地址。SPI_Read()的源码为:是 STATUS 的宏定义,是状态寄存器前面说了所有的寄存器操作都是先设置寄存器地址,然后在写(或读)数据或命令() 状 态 。 那 么 这 里 呢 SPI_Read() 这 个 函 数 就 不 说 了 。 这 里 值 得 一 提 的 是这个调用,传入的实参是,有很多人不明白这个。这里呢简单说一下,可以看到对于读来说这个数据是没有用的,所以 可以是任何的数据。然而习惯上都爱使用 0

25、xff,希望大家慢慢能够明白。在 NRF24L01_RxPacket()这个函数中还有个特别的变量 sta,它的声明为:可以看到这个使用了位操作,目的是什么呢?这样可以使位操作变得非常简单,对于判 断状态是很有用的。我们来看 STATUS 这个寄存器的意义:可以看到对于接收我们需要判断 RX_DR 这个位是否为 1,为 1 就表示有数据了。那么用 这个定义 就可以直接访问 sta 这个变量的第七位了, 很方便,也不用使用位运算来实现了。当查询到有数据了就会调用 读出数据放到 rx_buf 中也就是主函数的 RxBuf中了(rx_buf 指向的地址为 RxBuf)。这样就 完成了数据的读出操作,

26、下面是置位 这个接收完成且成功标志位。 完成接收后不要忘记状态的清除操作,为下次接收准备。在 NRF24L01_RxPacket()这个函数中的最后就是返回 ReceiveComplete_Flag 这个变量了。 在主函数中用于判断是否有数据接收成功。若接收数据成功了,那么我们接着看主函数。在项目的开始我们要求发送到 PC 端进行 接收数据的查看,为此我们用下面的代码实现:32 次循环依次把接收到的数据通过 Rx_Byte()这个函数由串口发送到 PC。 要求中还有一个是要求是检验接收的数据是否与发送端完全一样,这个怎么完成呢?思路是这样的:我们也定义一个数组 CheckBuf,这个数组中的数

27、据与发送端发送的数组数据 完全一样,然后把接收数组 RxBuf中的数据与 CheckBuf一一对比即可达到检验的目的了。 接收和发送端的数组数据如下图:发送端数据:接收端用于检测的数据:对于这个检验代码如下:以上的设计思路为:在向 PC 每发送一个字节的数据,都会检测一次 RxBuf接收缓冲中 的数据,如果相等那么 Right_Count 正确个数计数器会自加一,32 个数据向 PC 端发送完成 后,检验比较也就完成了,如果相等那么 Right_Count 将会等于 32。然后再判断 Right_Count 是否大于等于 32(特别建议:如果在判断一个变量是否等于某个数时,尽量使用大于等于 或者小于等于判断的方法,可防止出错,是对于程序安全稳定来说的),就可知道接收的数 据是否通过检测没有错误了。如果完全相等,那么会有 LED=0 执行,被点亮用于提示 校验成功。好啦到这里就讲解完成了,大家就仔细研究研究吧。多玩玩程序。PC 端接收的数据如下:可以看到数据也是完全正确的经过我们的下载测试,LED 指示也是完全正确的。大家可以把这个程序下载来看看了。 到这里对于这个小项目的要求就都完成了。您如果成功了是不是很开心呢,O(_)O!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1