原帖地址:http://www.dowellbbs.com/forum.php?mod=viewthread&tid=570&extra=page%3D1
程序下载地址:http://www.dowellbbs.com/forum.php?mod=viewthread&tid=571&extra=page%3D1
温馨提示:如果您是新手推荐您按照我们写的顺序看哦!若您第一遍看的不是很明白,那么只要能够用起来就可以了,使用多了慢慢就会更深入明白这个无线模块(NRF24L01)了。
先来看接口电路,使用的IO口不是唯一的哦,可随意定义接口,当然是在使用IO口模拟SPI且IRQ中断引脚不使用的使用查询方法判断接收状态的情况下了。作为初探我们就是用简单的IO模拟SPI的方法了,中断使用查询的方式。那么该教程讲解的接口与单片机的连接如下:
首先您需要了解NRF24L01,请参阅“NRF24L01芯片中文资料”或者“NRF24L01芯片英文资料”。
我们的教程是以一个简单的小项目为大家展示NRF24L01的使用方法与乐趣。我们所写的教程均是以这种方式的呢,让您在学习的时候明白它能做什么,使您学起来不至于枯燥无味。欢迎您光临我们小店:myworlded.taobao.com,您的支持就是我们最大的动力。
作为简易的教程,我们只需要知道它是怎么使用的就够了,我们本教程的目的是用NRF24L01发送数据和接收数据,且接收方会对比发送的数据与接收的数据,若完全相同则控制LED闪烁一次,并且把接收到的数据通过串口发送到PC端,通过串口工具查看接收到的数据。
具体的要求如下:
1、 具备发送和接收的能力。
2、 发送32个字节的数据,接收方接收到正确数据之后给予提示,通过LED闪烁灯形式。
3、 把接收到的数据传送到PC进行查看。
4、 发送端每隔大约1.5秒发送一次数据,永久循环。
以上是程序的要求,若您想自行设计出硬件接口,您也是可以添加一条呢:使用DIY方式设计NRF24L01的接口板,且包含含单片机平台,使用PCB方式或者万用板方式均可。如果您想让自己学的很扎实,那么推荐您自行做出接口板子呢。当然若您的能力不足,那么我们不推荐自行做板呢,因为这样会增加您学习的难度,反而起到了反效果呢。
我们使用的方式是画PCB的方式呢,并且做出了成品PCB,若您自己做了接口板子,那么您可以对比下一呢,O(∩_∩)O!
我们知道NRF24L01的供电电压是1.9V~3.6V不能超过这个范围,低了不工作,高了可能烧毁NRF24L01芯片。我们常用的STC89C52的单片机的供电电压是5V,我们不能直接给24L01这个模块供电,我们需要使用AMS1117-3.3V稳压芯片把5V转成3.3V的电压为24L01模块供电。
为此我们的设计原理图如下:包含单片机最小系统、供电系统、下载程序接口、5V转3.3V电路、NRF24L01模块接口。并且全部引出单片机的IO口,另外还加了3.3v、电池电源输出接口,为扩展使用。还包括了电源指示LED以及一个IO口独立控制的LED,这个独立控制的LED用于NRF24L01接收成功闪烁指示,另外还有个独立按键,用作门铃设计也是可以的哦。作为第三版我们添加了蜂鸣器,以及锂离子电池的支持,使该系统能有更好的价值。温馨提示:由于本教程是针对NRF24L01的,所以并未在教程中给予LCD1602的使用讲解,但是我们给您提供了程序供您参考。
PCB布线图如下:
成品效果图如下:
背面图:
大家有兴趣也可以自己做呢,有提供原理图,库没有提供了,提供的库为上一版本的系统板库文件。也可以到我们小店选购呢。是一套两个板哦!
也许大家有疑问,能不能用呢?放心好了,我们的例程就是以这个板子为基板的,没有任何问题。这个板子是不是感觉很不错呢,呵呵!它不仅仅是可作为最小系统使用,而且还是NRF24L01的接口板呢,省去了另外还要做电源转接板以及各种插线的痛苦,O(∩_∩)O!写这个教程时我也觉得非常好使呢。
我们看看24L01怎么来操作吧,这也是本教程的重点呢。我们呢就按照上面的功能要求来设计这个程序。在程序设计之前先了解下NRF24L01。
NRF24L01是 NORDIC公司最近生产的一款无线通信通信芯片,采用 FSK调制,内部集成 NORDIC自己的 Enhanced Short Burst 协议。可以实现点对点或是 1对 6的无线通信。无线通信速度可以达到 2M(bps)。NORDIC公司提供通信模块的 GERBER文件,可以直接加工生产。嵌入式工程师或是单片机爱好者只需要为单片机系统预留 5个 GPIO,1个中断输入引脚,就可以很容易实现无线通信的功能,非常适合用来为MCU系统构建无线通信功能。
功能描述:
 真正的 GFSK单片式收发芯片
 内置硬件链路层
 增强型 ShockBurstTM功能
 自动应答及自动重发功能
 地址及 CRC检验功能
 无线速率: 1或 2Mbps
 SPI接口速率:0~8Mbps
 125个可选工作频道
 很短的频道切换时间,可用于跳频
 与 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_ADDR
2.             设置RX节点的地址,也就是接收时的地址,如果是在发射模式下那么功能是为自动应答服务的(AUTO ACK)。寄存器为:RX_ADDR_P0
3.             允许AUTO ACK功能,意思是发送数据后都会等待接收端的应答信号,目的是保证数据正确发送。寄存器为:EN_AA
4.             设置允许的接收通道,总共有6个通道,我们只使用通道0,其他通道的功能应用大家熟悉了NRF24L01之后尝试吧。寄存器为:EN_RXADDR
5.             配置自动重发次数。寄存器为:SETUP_RETR
6.             选择通信的频率。寄存器为:RF_CH
7.             设置接收通道0的接收数据有效宽度,与第四步对应。寄存器为:RX_PW_P0
8.             配置发射的参数,主要为低噪放大器增益、发射的功率、无线传输的速率。寄存器为:RF_SETUP
9.             配置收发状态(这时配置为发射模式),CRC校验模式以及收发状态响应方式。寄存器为:CONFIG
10.          清除NRF24L01的指定通道中断状态标志,注意发送和接收这部分清除的通道的选择必须一致。寄存器为:STATUS
TX发射模式的配置就是如此了。我们从第一行看看他是什么意思。
第一步设置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来举例说明:
下一篇接着。

STC89C52 STC89LE52 NRF24L01无线 教程 (一)相关推荐

  1. STC89C52 STC89LE52 NRF24L01无线 教程 (二)

    原帖地址:http://www.dowellbbs.com/forum.php?mod=viewthread&tid=570&extra=page%3D1 程序下载地址:http:// ...

  2. 基于Arduino单片机的nRF24L01+无线遥控装置设计(爆肝制作)

    目录 前言 一.总体思路 二.硬件介绍 (一)主机 (二)从机 三.电路设计 (一)主机 (二)从机 四.程序代码 (一)主机 (二)从机 五.总结及改进 六.所用到的文献链接 前言 此文章只涉及单片 ...

  3. 外设驱动库开发笔记26:nRF24L01无线通讯驱动

    现在无线在我们的生活中无处不在.而我们开发的物联网产品也大量使用无线通讯.在这一篇文章中,我们将讨论nRF24L01无线通讯模块驱动程序的开发与实现. 1.功能概述 nRF24L01是一款工作在2.4 ...

  4. 2.4G NRF24L01无线模块总结

    前言   最近野火STM32论坛(www.firebbs.cn)发起了一个开源平衡车的项目,于是就跟着大家一起动手做起了开源平衡车,其中就用到了2.4G NRF24L01无线模块.通过对NRF24L0 ...

  5. Arduino连接nRF24L01无线收发模块

    Arduino连接nRF24L01无线收发模块 nRF24L01是一款工作在 2.4~2.5GHz 世界通用ISM频段的单片无线收发器芯片,输出功率.频道选择和协议的设置可以通过SPI接口进行设置.有 ...

  6. nRF24L01无线通信模块使用简介(接收端)

    nRF24L01无线通信模块使用简介(STC51)接收端 书接上回,上篇博客给出了nRF24L01搭配C51单片机进行无线通信的发送端代码.这里给出接收端代码. 接收端 接收端的功能主要是接收发送端发 ...

  7. STM32CubeMX系列08——SPI通信(W25Q64、NRF24L01无线模块)

    文章目录 1. 准备工作 1.1. 所用硬件 1.2. SPI 简介 1.3. 生成工程 1.3.1. 创建工程选择主控 1.3.2. 系统配置 1.3.3. 配置工程目录 2. 读写EEPROM实验 ...

  8. NRF24L01无线模块设置发射接受模式方法

    NRF24L01无线模块设置发射接受模式 NRF24L01无线模块通过设置CONFIG寄存器的最后一位,实现发射和接收模式的设定. CONFIG寄存器的内容: 具体程序如下: /函数:void Set ...

  9. Arduino开发遥控小车(三)基于nRF24L01无线模块实现舵机转向和直流电机调速

    Arduino开发遥控小车(三)基于nRF24L01无线模块实现舵机转向和直流电机调速 前面和大家分享了通过nRF24L01无线模块实现数据发送和接收的基本方法,本次继续和大家分享最终实现遥控小车转向 ...

最新文章

  1. mysql-master/slave同步问题:Slave_IO_Running: No
  2. 51.1AP!单阶段检测器的新纪录,TOOD:即插即用的检测器换头术,显著提升性能
  3. 转 多租户SaaS架构
  4. shell脚本if参数太多_Shell脚本用for循环遍历参数的方法技巧
  5. linux shell 除法运算符,Linux shell 基本运算符详解
  6. GLSL Optimizer
  7. php 访问类的属性,PHP OOP如何访问类的父属性范围解析运算符(::)?
  8. 枚举编写单例是可以保证在多线程中的安全性
  9. Helm 3 完整教程(十八):Helm 流控制结构(2)with 语句
  10. 单链表反转(递归和非递归)
  11. 【转载】深入浅出VA函数
  12. 易经入门(体系最完整,推荐书目最完备,易经周易入门必收藏)
  13. 图(3)——邻接链表法
  14. [量化-038]python代码-根据roe估算公司的pb值
  15. Word 注重页面细节才专业(添加页眉页脚,调整页边距,消灭孤行) | 职场人就应该这样用 Word
  16. 使用Au进行人声噪声混合
  17. 指针真得比数组快吗?函数调用会拖慢程序多少?++i 比i = i+1 快吗?
  18. 手机自动关机故障分析与维修
  19. 安卓开源库 安卓相机开源库
  20. Ubuntu安装QT未找到编译器解决方法

热门文章

  1. kafka删除队列_没想到 Kafka 还会这样问,学会这些带你轻松搞定大厂面试!
  2. java stream流_Java-8-流(1)
  3. 单片机最小系统硬件电路图_经验分享:学单片机,51通则百通
  4. unity 下一帧执行_理解Unity中的优化(三):协程(Coroutines)
  5. php cgi路径解析,php.ini中的cgi.fix_pathinfo选项
  6. oracle+connect+by+level,oracle connect by用法篇
  7. initramfs下启动linux_和菜鸟一起学linux之initramfs方式启动
  8. CTO问:WebSocket 是啥玩意?
  9. B 站硬件大佬在 GitHub 上开源了一款神器
  10. 数据结构之动态规划问题