nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。凭借其低功耗、传输速率高、误传率低等的优点,现已广泛应用在各种嵌入式系统中。本文就该模块总结一些学习过程中的经验和心得。

1. NRF24L01模块
   该模块工作电压为3.3V,当该模块与单片机相连时,两者基于SPI通信协议进行数据交换。如果有两个以上的NRF无线模块且当代码中未设置SPI片选信号时,此时可一对多通信(即一个发多个收到该信息)。其外观如下:

NRF24L01模块外观

   下面是该模块的PCB图,其中CE、CSN、IRQ为控制引脚;MOSI、MISO、SCK为SPI通信引脚。上面的这些引脚均可直接接普通的IO口,而不必特意选择SPI外设对应的引脚。下面解释各个引脚的具体含义:

NRF24L01PCB封装

引脚 引脚含义
VCC、GND 电源引脚,注意务必接到3.3V的电源上
CE 使能引脚
CSN SPI片选引脚
SCK SPI时钟信号引脚
MOS、MISOI SPI数据引脚
IRQ 可屏蔽中断引脚

  本文的示例程序应用在两个NRF24L01模块之间相互通信的场合,其通信拓扑关系如下图:

本次实验中的通信关系图    上图中,之所以为了添加上位机与单片机的通信,主要是为了控制和验证通信内容。

2. SPI通信协议
   上面提到了SPI通信协议,了解该协议的主要特点将非常有助于我们的调试工作。下面就讲一讲SPI通信协议:
   SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议。
    SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。
(1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;
(2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;
(3)SCLK – Serial Clock,时钟信号,由主设备产生;
(4)CS – Chip Select,从设备使能信号,由主设备控制。
SPI通信的内部简明图如下:

  从图中可以看出, 主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输。寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
   SPI 主要特点有: 可以同时发出和接收串行数据; 可以当作主机或从机工作; 提供频率可编程时钟; 发送结束中断标志; 写冲突保护; 总线竞争保护等。
   SPI 总线四种工作方式 SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果 CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位( CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果 CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。 SPI 主模块和与之通信的外设备时钟相位和极性应该一致。
SPI时序图如下:

SPI通信时序图

3. 软件设计
    本次实验在stm32f10xxx单片机上学习NRF无线模块的通信特点。代码中主要包含:NRF24L01模块的驱动程序(如初始化、发送/接收数据等函数的编写)、串口通信等。软件流程如下:
(1)初始化NRF无线模块和其他必要的外设;
(2)进入默认发送数据状态;
(3)监控串口中断,确认是否要修改通信状态——切换发送/接收信息状态;
   由于代码量较大,这里只展示主函数和串口中断服务函数如下:

#include "stm32f10x.h"
#include "delay.h"
#include "24l01.h"
#include "timer.h"
#include "spi.h"
#include <stdio.h>
#include "usart.h"u8 mode;
int main()
{u8 i;u8 hell[] = "Hello! NRF24L01",buff;mode=1;delay_init();uart_init(115200);  //设置串口波特率NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级  NRF24L01_Init(); //初始化NRF24L01模块delay_ms(50);while(NRF24L01_Check()) //如果通信模块有问题会通过串口向上位机发送警告信息{printf("ERROR!\n"); //向上位机报错delay_ms(500);}while(1){if(mode){NRF24L01_TX_Mode();for(i=0;hell[i]!='\0';i++){while(NRF24L01_TxPacket(&hell[i]) != TX_OK); //发送一个字节}printf("%s",hell); //发送完后,再向上位机汇报所发送的内容}else{NRF24L01_RX_Mode();i = 0;while(NRF24L01_RxPacket(&buff));  //向上位机发送接收到的数据printf("%c",buff);}}
}void USART1_IRQHandler(void)   //串口1中断服务程序,通过串口修改NRF24L01模块的工作状态
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){mode =USART_ReceiveData(USART1)-'0';   //读取接收到的数据}
}

4. 总结
   嵌入式通信的调试工作一直是最复杂的任务之一,因此,本着开源的精神,笔者将此次调试好的、完整的C语言项目共享在公众号“24K纯学渣”上面,回复“NRF无线通信”即可获取!另外,限于作者水平,难免出现一些纰漏,以上所述如有不妥,欢迎大家评论交流!

NRF24L01无线通信模块使用示例和调试心得总结相关推荐

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

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

  2. NRF24L01 无线通信模块使用方法

    原文出处:http://blog.csdn.net/mc_hust/article/details/39473913 昨天登录百度账号,无意间发现漏看了好多朋友的私信,其中不少是找我探讨关于NRF24 ...

  3. nrf24l01无线通信模块与51单片机工作原理

    资源获取码:aaaa . 实物测试成功 . . 功能描述: 1 本无线用了NRF24l01作为无线模块,进行发射与接收. 2 当左边板的一个按键按下不放,右边板一盏灯点亮. 3 当左边板的一个按键松开 ...

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

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

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

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

  6. 5G/4G外置型无线通信模块

    5G/4G外置型无线通信模块TD210,全网通5G/4G/3G/2G网络,数据透传.加密传输,RS485/RS232/TTL电平接口,支持TCP/UDP/环保212/MQTT协议,工业级32位通信处理 ...

  7. 基于Arduino开发板使用HC-12远程无线通信模块

    在本篇文章中,我们将学习如何使用HC-12无线串行通信模块,该模块能够在多个Arduino开发板之间进行远程无线通信,距离可达1.8km.其中,我列举了两个基本的例子,来解释了如何连接HC-12模块并 ...

  8. 基于STM32的无线通信模块使用——A7130

    基于STM32的无线通信模块使用-A7130 2.4G Hz的无线通信芯片A7130.本文简单介绍A7130的使用. 注:相关资源在这里 A7130简介 A7130 SPI接口 A7130寄存器配置及 ...

  9. 小体积、高速率的nRF24L01芯片通信模块

    在选择纯硬件通信模块时, 面对上述问题,AS01提供了很好的解决办法. AS01系列模块是工作在2.4GHz(ISM频段)的纯硬件模块.此系列基于NORDIC原装nRF24L01P芯片方案开发,提供多 ...

  10. BC28无线通信模块 NB-IOT模块 多频段小尺寸 NB-IOT模块快速入门指导

    产品描述: BC28是一款紧凑.高性能.低功耗的多频段NB-loT无线通信模块,支持B1/B3/B8/B5/B20/B28*频段.BC28在设计上兼容移远通信 GSM/GPRS系列的M26模块,方便客 ...

最新文章

  1. 计算机 配置不过4000,台式机4000元以上免谈,非主流配置免谈
  2. 关于谷歌自动换行的奇异效果
  3. Programming Computer Vision with Python (学习笔记六)
  4. PMCAFF问答精选 | 对于用户反馈,产品经理需要第一时间给出回应吗?
  5. 交叉编译mysql客户端libmysql
  6. struts2 html post large data,struts2文件上传限制大小问题
  7. Struts2结果页面配置(Result)
  8. 锐捷交换机配置命令大全_锐捷交换机常用配置命令汇总
  9. 计算机专业论文选题网站方面,5大网站汇总,搞定新颖的计算机专业毕业设计网站汇总...
  10. HDU 5729 Rigid Frameworks (联通块计数问题)
  11. 软考——论文写作基本介绍
  12. 如何快速取消大量的合并单元格并向下填充数据
  13. IP 伪装简易使用说明
  14. 一个生肖一首诗,看看你是哪一首?
  15. 数学竞赛书单该怎么选?金牌牛娃用的书都在这里了!
  16. python是什么专业术语-python术语大全
  17. 论语之宪问第十四、卫灵公第十五、季氏第十六
  18. 在Linux上搭建nim服务器安装AIX
  19. 期货开户手续费怎么计算?
  20. java宠物之王-龙灵传说,《宠物之王-龙灵传说》的流程攻略(上)

热门文章

  1. t9.php,TPHP框架
  2. java 中的builder_Java设计中的Builder模式的介绍
  3. 在android studio开发中,关于绘制GifView异常,硬件加速问题的解决办法
  4. mtk无线网卡 linux,在树莓派上使用基于MT7601的无线网卡(如360/百度/腾讯Wifi)
  5. python数据爬虫项目
  6. 来了 | Python 官方发布整套中文PDF文档(共27本)
  7. PDF文件如何自动生成目录书签
  8. SnowNLP简易教程:分词、词性标注、情感分析、繁体转换、关键字抽取、相似度计算
  9. linux go语言运行环境,linux下怎么安装go语言环境
  10. svga文件预览_Shu文件预览