• 在无线通信中,NORDIC公司生产的NRF24L01无线收发模块是许多玩家的选择,它是2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片,具有功能较强而控制较方便并且价格便宜的优点。一块NRF24L01可以同时接收6个通道的发送...

    在无线通信中,NORDIC公司生产的NRF24L01无线收发模块是许多玩家的选择,它是2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片,具有功能较强而控制较方便并且价格便宜的优点。一块NRF24L01可以同时接收6个通道的发送数据,同时可以采用变频手段改变通信频道来避免无线通信干扰,下面简单介绍一下这种芯片的使用。

    本次采用了两块单片机进行无线通信,一块型号为:STC90C51 16RD+        ,接收器:NRF24L01

                                                                          另一块为:STC12C5A60S2             ,发送器:NRF24L01

    一、硬件方面

    1>引脚介绍


    引脚1:GND,接地端;引脚2:VCC,1.9V~3.6V

    引脚3:CE, NRF24L01模式控制端

    引脚4:CSN,片选信号

    引脚5:SCK,SPI时钟输入端

    引脚6:MOSI,SPI数据输入端

    引脚7:MISO,SPI数据输出端

    引脚8:IRQ,中断输出端,低电平使能,即中断输出低电平

    对于电源不要超过3.6V,否则可能损坏芯片

    对于端口引脚,可以耐压5V,即可以接TTL端口

    2>工作模式


    3>增强型shockburst模式

    NRF24L01默认是增强型shockburst模式,即能自动应带,此模式下可减轻单片机负担,可使程序简化,本次将采用默认方式发送接收数据。

    在此方式下,通讯协议如下:

    对发送方(配置PRIM_RX为低):发送方启动发送后,即CE拉高至少10us,发送方发送数据,发送完数据后使用通道0接收终端应答ASK信号,如果没有收到ASK,发送方将重发相同的数据包,直到收到应答信号或重发次数超过设定最大值为止。若超过最大次数,将会产生MAX—RT中断,IRQ输出低电平。若收到了ASK信号,发送发认为发送成功,将产生TX_DS中断。

    对接收方(配置PRIM_RX为高):接收方启动接收后,即CE拉高至少10us,若接收到的数据通过CRC校验正确,则将数据存储在RX_FIFO中。

    4>数据通道地址配置方法


               

    图示中,以地址宽度为5字节示例

    对于NRF24L01(发送方、接收方)通道0地址32位数据均可配置

    对于接收方,而通道1-通道5中前4字节地址必须相同,第五字节不能相同

    对于发送方,通道0地址 和 发送地址 必须一致,而且与接收方所要通信通道地址相同!

    5>SPI指令设置

    每一条完整指令的写入都必须通过一次CSN由高到低的变化

    6>SPI指令格式


    访问多字节寄存器时,应该先读/写低字节的高位。当多字节寄存器在写完之前若结束SPI写操作,则高位字节内容可保持不变。

    对于中断,若向中断源TX_DS、RX_DR、MAX_RT写入1,则中断响应被屏蔽。

    7>SPI时序

    写NEF24L01中寄存器时必须处于待机或掉电模式!


    8>寄存器表格

    共有18个寄存器,而对于点对点通信的NRF24L01只用到不到10个寄存器即可,其它可保持默认配置,详情见程序配置,寄存器说明见NORDIC公司的datasheet。

    二、软件部分

    下篇继续》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

    ****************************************************************************************************************

    详情请咨询:                                                 http://shop108408772.taobao.com/

    **************************************************************************************************************

    展开全文
  • 先展示我的硬件部分图片: 要求完成的功能: ...代码如何实现呢,只要你对我之前的文章《2.4G无线模块(NRF24L01)学习(1)——串口实现两个模块之间信息交互》学习完之后再来实现这个功能那就太简单了,简...

    先展示我的硬件部分图片:

    要求完成的功能:

    1.两个模块和两个单片机相连,分别称为单片机A,单片机B

    2.功能:单片机A上的两个按键控制单片机B上的P2口等四个灯的亮灭;单片机B上的两个按键控制单片机A上的P2口等四个灯的亮灭

    代码如何实现呢,只要你对我之前的文章《2.4G无线模块(NRF24L01)学习(1)——串口实现两个模块之间信息交互》学习完之后再来实现这个功能那就太简单了,简直就不值得下手的感觉,但我认为虽然简单,但为了学好这个NRF24L01模块还是值得的,只有这样才能逐步达到灵活使用模块。

    代码如下:

    【提示】这里的2401.h代码依然没有改动,因此这里就不涉及2401.h代码,直接使用。下面主要看两个主函数文件的代码如何实现的?

    单片机A代码:

    #include"2401.h"
    
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit KEY1=P3^5;	 				//发送按键 
    sbit KEY2=P3^4;	 				//发送按键 
    
    
    sbit beep=P1^7;					//喇叭 
    sbit LED6=P1^6;	 				//发送数据时显示灯+接收到数据后的功能实现灯
    
     
    /*------------------------------------------------
    延时函数
    ------------------------------------------------*/
    void delay_ms(uint z)			//延时函数 
    {
    	uint y;
    	while(z--)
    		for(y=110;y>0;y--);
    }
    /*------------------------------------------------
    main函数
    ------------------------------------------------*/
    void main()
    {
         uchar Tx_Buf1[]={1};			//发送的信息1 
         uchar Rx_Buf[32];  				//接收到的数据暂存器,最多32字节数据 
    	 LED6=1;				//初始灯6熄灭   
    	 init_NRF24L01();		//初始化24L01
    
    	 while(NRF24L01_Check())					//检查不到24l01则报警 
    	 {
    		beep=0;
    		delay_ms(200);
    		beep=1;
    		delay_ms(200);
    	 }
    	 while(1)
    	 {	
    		RX_Mode();							//接收模式  
    		while(!nRF24L01_RxPacket(Rx_Buf)) 	//等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式  
    	    {
    			if(KEY1==0)	 					//按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式 
    			{	
    				delay_ms(5);//消抖动 
    				if(KEY1==0)
    				{
    			 		while(!KEY1);
                        Tx_Buf1[0]=1;
    					TX_Mode();	 //发送模式 
    			    	nRF24L01_TxPacket(Tx_Buf1);		//发送命令数据
    					LED6=0;
    			    	delay_ms(300);
    					LED6=1;
    			    	delay_ms(300);					//发送后LED6闪一下 
    					break;							//退出最近的循环,从而变回接收模式,这句关键
    				 }	
    			 }
                 if(KEY2==0)	 					//按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式 
    			{	
    				delay_ms(5);//消抖动 
    				if(KEY2==0)
    				{
    			 		while(!KEY2);
                        Tx_Buf1[0]=2;
    					TX_Mode();	 //发送模式 
    			    	nRF24L01_TxPacket(Tx_Buf1);		//发送命令数据
    					LED6=0;
    			    	delay_ms(300);
    					LED6=1;
    			    	delay_ms(300);					//发送后LED6闪一下 
    					break;							//退出最近的循环,从而变回接收模式,这句关键
    				 }	
    			 }
    		 }
    		switch(Rx_Buf[0]){//对数据进行分析来控制灯亮
    		case 1:
    			Rx_Buf[0]=0;				//清空数据
                P2=0X0F; 
                LED6=0;
    			delay_ms(300);			
                LED6=1;
    			delay_ms(300);	
    			break;
    		case 2:
    			Rx_Buf[0]=0;				//清空数据 
    		    P2=0XF0;
                LED6=0;
    			delay_ms(300);
                LED6=1;
    			delay_ms(300);	
    			break;
            default:
                break;
    		}
    	 }
    }
    

     

    单片机B的代码:

    #include"2401.h"
    
    #define uint unsigned int
    #define uchar unsigned char
    
    sbit KEY1=P3^5;	 				//发送按键 
    sbit KEY2=P3^4;	 				//发送按键 
    
    sbit beep=P1^7;					//喇叭 
    sbit LED6=P1^6;	 				//发送数据时显示灯
    
    
    void delay_ms(uint z)			//延时函数 
    {
    	uint y;
    	while(z--)
    		for(y=110;y>0;y--);
    }
    void main()
    {
    	 uchar Tx_Buf1[]={1};	//发送的信息1 
    	 uchar Rx_Buf[32];  	//接收到的数据暂存器,最多32字节数据  
    	 init_NRF24L01();
    	 LED6=1;				//初始灯6熄灭   
    
    	while(NRF24L01_Check())					//检查不到24l01则报警 
    	{
    		beep=0;
    		delay_ms(200);
    		beep=1;
    		delay_ms(200);
    	}
    	while(1)
    	{	
    		RX_Mode();							//接收模式  
    		while(!nRF24L01_RxPacket(Rx_Buf)) 	//等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式  
    	    {
    			if(KEY1==0)	 					//按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式 
    			{	
    				delay_ms(5);//消抖动 
    				if(KEY1==0)
    				{
    			 		while(!KEY1);
                        Tx_Buf1[0]=1;
    					TX_Mode();	 //发送模式 
    			    	nRF24L01_TxPacket(Tx_Buf1);		//发送命令数据
    					LED6=0;
    			    	delay_ms(300);
    					LED6=1;
    			    	delay_ms(300);					//发送后LED6闪一下 
    					break;							//退出最近的循环,从而变回接收模式,这句关键
    				 }	
    			 }
                 if(KEY2==0)	 					//按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式 
    			{	
    				delay_ms(5);//消抖动 
    				if(KEY2==0)
    				{
    			 		while(!KEY2);
                        Tx_Buf1[0]=2;
    					TX_Mode();	 //发送模式 
    			    	nRF24L01_TxPacket(Tx_Buf1);		//发送命令数据
    					LED6=0;
    			    	delay_ms(300);
    					LED6=1;
    			    	delay_ms(300);					//发送后LED6闪一下 
    					break;							//退出最近的循环,从而变回接收模式,这句关键
    				 }	
    			 }
    		 }
    		switch(Rx_Buf[0]){//对数据进行分析来控制灯亮
    		case 1:
    			Rx_Buf[0]=0;				//清空数据
                P2=0X0F; 
                LED6=0;
    			delay_ms(300);			
                LED6=1;
    			delay_ms(300);	
    			break;
    		case 2:
    			Rx_Buf[0]=0;				//清空数据 
    		    P2=0XF0;
                LED6=0;
    			delay_ms(300);
                LED6=1;
    			delay_ms(300);	
    			break;
            default:
                break;
    		}	 	
    	}
    }
    

    你会发现这两个代码基本一致,因为这两个代码中都有发送和接受的过程,而且实现是一样的效果。

    效果展示:

    展开全文
  • 最近在研究2.4G芯片的一些应用,一般这种芯片都是通过SPI或者IIC的接口与MCU相连接,通过对SPI或IIC的编程读写芯片的寄存器从而达到控制的效果。 最近在用WL1600的一个2.4G的芯片,该芯片可以通过SPI与stm32相连接。...
    最近在研究2.4G芯片的一些应用,一般这种芯片都是通过SPI或者IIC的接口与MCU相连接,通过对SPI或IIC的编程读写芯片的寄存器从而达到控制的效果。
    最近在用WL1600的一个2.4G的芯片,该芯片可以通过SPI与stm32相连接。于是我就做了一个类似透传模组的试验,使用两块1600和两个stm32分别控制,既然要做透传也就是说芯片不但要工作在接收状态(RX)当串口有数据的时候还要工作在发送状态(Tx),这样就要求每种模式都要是非阻塞的模式下才能满足这个要求。
    另外每个1600在开始工作以前要设置一些寄存器的初始化,也就是一些硬件参数校验码等。这样收发的准确率会很高,参考值每个芯片手册都会给出的。
    收发的而数据都是通过一个fifo寄存器来存储的。
    发送过程:首先往fifo里填写数据,之后打开Tx mode,等待fs结束标志,其他的一些参数也可以设置,比如打开CRC,FEC等。
    接收过程:设置成Rx mode ,然后去检测接收标志位是非起来,起来说明收到数据,这个时候就可以去fifo里将数据读出,也可通过校验CRC是否正确来判断数据的对错。
    fifo的大小是64Byte,也就是一次最多能发送64个字节,当然还有其他的模式可以发送更多的字节数,这个以后再说
    

    为了将数据分类,可以得知那个模组发出的做了如下规划:
    这里写图片描述
    为了做透传模组需要使用AT指令来控制模组的收发情况。
    这里写图片描述
    代码以后上传 谢谢

    展开全文
  • 本代码主要是stm32控制2.4g无线模块的收发,以及实现的一些功能
  • 2.4G无线模块概述  VT-CC2510-M1 无线模块采用TI chipcon高性能无线SOC芯片CC2510开发。是一种完整的低成本、高度集成2.4GHz收发器,专为低功耗无线应用设计。 我们将提供完整硬件、软件参考方案,缩短产品研发...


    2.4G无线模块概述

          VT-CC2510-M1 无线模块采用TI chipcon高性能无线SOC芯片CC2510开发。是一种完整的低成本、高度集成2.4GHz收发器,专为低功耗无线应用设计。

    我们将提供完整硬件、软件参考方案,缩短产品研发周期,为您节省成本投入。

     

    基本特点

      · 高性能和低功耗的8051微控制器核

      · 2400-2483.5MHz 低成本低功耗无线收发模块

      · SMD元件24mm×29mm×2.2 mm,内置PCB天线,体积小

      · 支持 2-FSK/GFSK/MSK

      · 可编程控制的输出功率,对所有的支持频段可达+1dBm

      · 可灵活配置多种通讯信道,快速频点切换特点,可满足跳频系统的需要

      · 可编程配置传输数率1.2k - 500 kbps

      · 低功耗 3.3V 供电

      · RSSI输出和载波侦听指示

     

    应用范围

      · 无线键盘鼠标

      · 无线语音传输

      · 电子消费产品

      · RKE-两路远程无键登录

      · 低功耗遥感勘测

      · 无线运动休闲装备

      · 无线报警与安全系统

      · 工业监测与控制

      · 无线传感器网络

     

    技术参数

    未指明时测试条件为:Ta=25°C,VCC=3.3V

    技术指标

    参数

    备注

    工作电压

    直流2.4-3.6V

     

    工作频率

    2400~2483.5MHz

     

    频率误差

    +/-30KHz

     

    调制方式

    2-FSK/GFSK/MSK

    可编程配制

    输出功率

    -30dBm ~+1dBm

    可编程配制

    接收灵敏度

    -105dBm

    1.2 Kbps

    接收电流

    <23mA

    1.2 Kbps

    发射电流

    <27mA

    Po=+1dBm,与输出功率有关

    待机电流

    2uA

     

    传输速率

    1.2-500Kbps

    可编程配制

    芯片闪存

    32KB

     

    芯片RAM

    4KB

     

    天线形式

    PCB天线

     

    接口方式

    双列24针1.27排针

     

    通讯距离

    100m

    +1dBm output power,

     9.6Kbps可视距离

    存贮温度

    -50~125°C

     

    工作温度 

    -20~75 °C 

     

    外形尺寸

    24mmx29mmx2.2mm

     

     

     

    备注:

           1. 模块的通信速率会影响通信距离和接收灵敏度,速率越高,通信距离越近,灵敏度越低。

           2. 模块的供电电压会影响发射功率,在工作电压范围内,电压越低,发射功率越小。

           3. 模块的工作温度变化时,中心频率会改变,只要不超出工作温度范围,不影响应用。

           4. 天线对通信距离有很大的影响,请选用匹配的天线并正确安装。

           5. 模块的安装方式会影响通信距离

    展开全文
  • 作者:李剀 出处:https://www.cnblogs.com/kevin-nancy/ 或者 ... 欢迎转载,但也请保留上面这段声明。谢谢!...写在前面:这一篇先介绍一下两个51单片机之间通过nRF24L01模块通信的过程,下一篇我会写 51单片机...

    作者:李剀

    出处:https://www.cnblogs.com/kevin-nancy/

    或者
    https://blog.csdn.net/Kevin_8_Lee/article/details/95667604

    欢迎转载,但也请保留上面这段声明。谢谢!(上面两个都是我的博客,只是在不同平台,大家可以点击链接看一下我的博客哦~~~)

    写在前面:这一篇先介绍一下两个51单片机之间通过nRF24L01模块通信的过程,下一篇我会写 51单片机STM32F407 单片机通信过程。

    关于nRF24L01这个模块,网上可以说是资料非常多了,我参考的是云佳科技的pdf以及官方的datasheet英文数据手册。 另外,关于这个模块的介绍以及能够用来做什么也不过多的废话,数据手册及说明书都有。

    51单片机我使用的是买来的开发板,核心是STC89C52,大家不必担心平台不同,都是使用软件模拟spi,引脚怎么定义都可以,也可以选择跟我使用的不一样的引脚,都Ok的。


    一、硬件介绍


    1、 nRF24L01模块接口电路见下图

    在这里插入图片描述
    单片机是作为主机的,即Master nRF24L01作为从机,即Slave;

    这样大家应该会很好理解MOSI和MISO了,,在我的另一篇博客也有SPI介绍,STM32F407使用MFRC522射频卡调试及程序移植成功
    这个我是在STM32上调试的,可以参考一下里面对spi MOSI和MISO的解释


    1 GND ------>> 接地(与单片机共地)

    2 VCC ------>> 1.9~3.6V (推荐3.3V)

    3 CE ------>> RX 或 TX模式选择 高电平>10us则为发送模式 持续高电平为接收模式
    设为低电平是待机模式

    4 CSN ------>> SPI片选信号 低电平使能,默认状态应该设置为高,以免发生错误的数据传输

    5 SCK ------>> SPI时钟信号

    6 MOSI ------>> 从SPI数据输入脚 (这里解释一下MOSI对应的单片机引脚输出信号, 即单片机输出数据给nRF24L01)

    7 MISO ------>> 从SPI数据输出脚 (MISO对应单片机引脚设置为输入, 即数据从nRF24L01出来送进单片机 )

    注:对于51单片机,无需设置单片机引脚的输入输出,但是STM32单片机需要设置

    8 IRQ ------>> 可屏蔽中断脚 中断 低电平使能


    ** PS:**

    1) VCC电压供电范围要求1.9~3.6V之间,由于51单片机大多是5V,所以自己的开发板上没有无线模块接口的要注意,把VCC另外接到这个范围的电压上,电压过高会烧坏模块。。 推荐 3.3V 其他引脚无电压要求

    2) 用普通单片机IO口模拟SPI协议即可控制该模块,我一般都是用模拟SPI,可移植性高

    该模块使用的芯片方框图如下

    在这里插入图片描述

    2、 单片机2.4G模块引脚接口
    在这里插入图片描述
    3、 单片机按键引脚图

    在这里插入图片描述
    4、 硬件连接实物图(我用的两个相同的51单片机,所以引脚都一样,只是程序里面接收模式和发送模式略微不同)
    在这里插入图片描述
    在这里插入图片描述


    二、软件部分


    对于某个模块写程序是一定要参照datasheet的时序图, 这样才可以保证不出错。

    下面是我从 nRF24L01 datasheet上截的SPI 时序图
    在这里插入图片描述

    变量设置及宏定义 接收端和发射端一样

    // 宏定义
    #define     uchar       unsigned char 
    #define     uint        unsigned int 
    
    #define     TX_ADR_WIDTH    5  // 5字节宽度的发送/接收地址
    #define     TX_PLOAD_WIDTH  4  // 数据通道有效数据宽度
    
    // LED灯及按键位定义
    sbit LED = P1^0;
    sbit KEY1 = P3^0;
    sbit KEY2 = P3^1;
    sbit BEEP = P2^3;
    
    uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};  // 定义一个静态发送地址
    
    uchar RX_BUF[TX_PLOAD_WIDTH];
    uchar TX_BUF[TX_PLOAD_WIDTH];
    uchar flag;
    uchar DATA = 0x01;
    uchar bdata sta;
    sbit  RX_DR     = sta^6;
    sbit  TX_DS     = sta^5;
    sbit  MAX_RT    = sta^4;
    
    // NRF24L01 模块引脚位定义
    sbit CE  =  P1^2;
    sbit CSN =  P1^3;
    sbit SCK =  P1^7;
    sbit MOSI= P1^5;
    sbit MISO= P1^6;
    sbit IRQ = P1^4;
    

    寄存器设置

    /*  
        SPI(nRF24L01) 指令设置
        指令格式
        <命令字  : 由高位到低位(每字节)>
        <数据字节: 低字节到高字节,每一字节高位在前>
     */
    #define READ_REG    0x00  // Define read command to register
    #define WRITE_REG   0x20  // Define write command to register
    #define RD_RX_PLOAD 0x61  // Define RX payload register address
    #define WR_TX_PLOAD 0xA0  // Define TX payload register address
    #define FLUSH_TX    0xE1  // 清除 TX FIFO寄存器  应用于发射模式下
    #define FLUSH_RX    0xE2  // 清除 RX FIFO寄存器  应用于接收模式下。
    #define REUSE_TX_PL 0xE3  // 重新使用上一包有效数据。 当CE=1,数据包被不断重新发射 发射过程中必须禁止数据包重利用功能
    #define NOP         0xFF  // 空操作。可以用来读状态寄存器
    
    /*  
        SPI(nRF24L01) registers(addresses)
     */
    #define CONFIG      0x00  // 'Config' register address
    #define EN_AA       0x01  // 'Enable Auto Acknowledgment' register address
    #define EN_RXADDR   0x02  // 'Enabled RX addresses' register address
    #define SETUP_AW    0x03  // 'Setup address width' register address
    #define SETUP_RETR  0x04  // 'Setup Auto. Retrans' register address
    #define RF_CH       0x05  // 'RF channel' register address
    #define RF_SETUP    0x06  // 'RF setup' register address
    #define STATUS      0x07  // 'Status' register address
    #define OBSERVE_TX  0x08  // 'Observe TX' register address
    #define CD          0x09  // 'Carrier Detect' register address
    #define RX_ADDR_P0  0x0A  // 'RX address pipe0' register address
    #define RX_ADDR_P1  0x0B  // 'RX address pipe1' register address
    #define RX_ADDR_P2  0x0C  // 'RX address pipe2' register address
    #define RX_ADDR_P3  0x0D  // 'RX address pipe3' register address
    #define RX_ADDR_P4  0x0E  // 'RX address pipe4' register address
    #define RX_ADDR_P5  0x0F  // 'RX address pipe5' register address
    #define TX_ADDR     0x10  // 'TX address' register address
    #define RX_PW_P0    0x11  // 'RX payload width, pipe0' register address
    #define RX_PW_P1    0x12  // 'RX payload width, pipe1' register address
    #define RX_PW_P2    0x13  // 'RX payload width, pipe2' register address
    #define RX_PW_P3    0x14  // 'RX payload width, pipe3' register address
    #define RX_PW_P4    0x15  // 'RX payload width, pipe4' register address
    #define RX_PW_P5    0x16  // 'RX payload width, pipe5' register address
    #define FIFO_STATUS 0x17  // 'FIFO Status Register' register address
    

    1 简介一下 Enhanced ShockBurstTM发射流程


    A. 把接收机的地址和要发送的数据按时序送入NRF24L01;

    B. 配置CONFIG寄存器,使之进入发送模式。

    C. 微控制器把CE置高(至少10us),激发NRF24L01进行Enhanced ShockBurstTM发射;

    D. N24L01的Enhanced ShockBurstTM发射

     (1)  给射频前端供电;
    
     (2) 射频数据打包(加字头、CRC校验码); 
    
     (3) 高速发射数据包; 
    
     (4) 发射完成,NRF24L01进入空闲状态。
    

    ********** ** 发射端代码 ** *********
    1) 首先初始化IO口

    // 初始化IO
    void init_io(void)
    {
        CE  = 0;        // 待机
        CSN = 1;        // SPI禁止
        SCK = 0;        // SPI时钟置低
        IRQ = 1;        // 中断复位
        LED = 1;        // 关闭指示灯
    }
    

    2) 通过SPI对24L01进行读写的函数 返回读取的字节

    uchar SPI_RW(uchar byte)
    {
        uchar   bit_ctr;
        // output 8-bits
        for (bit_ctr = 0; bit_ctr < 8; bit_ctr++)
        {
            MOSI = (byte & 0x80);   // output ‘byte’  MSB to MOSI
            byte = (byte << 1);     // shift next bit into MSB..
            SCK = 1;                // Set SCK high.. 24L01 read 1-bit from MOSI and output 1-bit to MISO 
            byte |= MISO;           // capture current MISO bit 
            SCK = 0;                // ..then set SCK low again
        }
    
        return (byte);  // return read byte
    }
    

    3)

    通过SPI协议向寄存器reg 写入数据value

    uchar SPI_RW_Reg(uchar reg, uchar value)
    {
        uchar status;
        CSN = 0;                // CSN low, init SPI transaction, start transmitting data
        status = SPI_RW(reg);   // select register and return status byte
        SPI_RW(value);          // ..and write value to it..
        CSN = 1;                // CSN high again, transmission end
        return(status);         // return nRF24L01 status byte
    }
    

    4) 从寄存器reg中读数据 返回读取的数据

    uchar SPI_Read(uchar reg)
    {
    	uchar reg_val;
        CSN = 0;                    // CSN置低,开始传输数据
    	SPI_RW(reg);                // 选择寄存器
    	reg_val = SPI_RW(0);        // 然后从该寄存器读数据
    	CSN = 1;                    // CSN拉高,结束数据传输
    	return(reg_val);            // 返回寄存器数据
    
    }
    

    5) 从reg寄存器读 bytes 个字节

    uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
    {
        uchar status,byte_ctr;
        CSN = 0;                    // Set CSN low, init SPI tranaction
        status = SPI_RW(reg);       // Select register to read & return status byte
        
        for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
            pBuf[byte_ctr] = SPI_RW(0); //逐个字节从nRF24L01读出
        CSN = 1;                    // set CSN high, stop transaction
        return(status);             // return nRF24L01 status byte
    }
    

    6) 往reg寄存器写入 bytes 个字节

    uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
    {
        uchar status,byte_ctr;
        CSN = 0;                // Set CSN low, init SPI tranaction
        status = SPI_RW(reg);   // Select register to write to & return status byte
        
        for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++) 
            SPI_RW(*pBuf++);    // 逐个字节写入nRF24L01
        CSN = 1;                // Set CSN high again 结束数据传输
        return(status);         // 返回状态寄存器
    }
    

    7) 设置nRF24L01为接收模式的函数,等待接收发送设备的数据包

    void RX_Mode(void)
    {
        CE = 0;
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 接收设备接收通道0使用和发送设备相同的发送地址
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);               // 使能接收通道0自动应答
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);           // 使能接收通道0
        SPI_RW_Reg(WRITE_REG + RF_CH, 40);                 // 选择射频通道0x40
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0选择和发送通道相同有效数据宽度
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);              // CRC使能,16位CRC校验,上电,接收模式
        delay_ms(150);
        CE = 1;                                            // 拉高CE启动接收设备
    }
    

    8) 设置nRF24L01为发送模式

    void TX_Mode(uchar *BUF)
    {
        CE = 0;
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 写入发送地址
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 为了应答接收设备,接收通道0地址和发送地址相同
        SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);                  // 写数据包到TX FIFO
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       // 使能接收通道0自动应答
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道0
        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);  // 自动重发延时等待250us+86us,自动重发10次
        SPI_RW_Reg(WRITE_REG + RF_CH, 40);         // 选择射频通道0x40
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);    // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // CRC使能,16位CRC校验,上电
        delay_ms(150);
        CE = 1;
    }
    

    9) 检查接收设备有无接收到数据包

    uchar Check_ACK(bit clear)
    {
        delay_ms(200);
        while(IRQ);             // 等待数据接收完成
        sta = SPI_RW(NOP);      // 返回状态寄存器
        if(TX_DS)
        {
            LED0 = ~LED0;
            delay_ms(200);
            LED0 = ~LED0;
            delay_ms(200);
            LED0 = ~LED0;
            delay_ms(200); 
        }
        if(MAX_RT)
            if(clear)                         // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
                SPI_RW(FLUSH_TX);
        SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中断标志
        IRQ = 1;
        if(TX_DS)
            return(0x00);
        else
            return(0xff);
    }
    

    10) 按键扫描

    // 按键扫描
    void CheckButtons()
    {
        if(KEY1 == 0)
        {
            delay_ms(10);
            if(KEY1 == 0)
            {
                while(!KEY1);
                TX_BUF[0] = 1;          // 数据送到缓存
                TX_Mode(TX_BUF);        // 把nRF24L01设置为发送模式并发送数据
                Check_ACK(0);           // 等待发送完毕,清除TX FIFO
                delay_ms(250);
                delay_ms(250);
            }
        }
    
        if(KEY2 == 0)
        {
            delay_ms(10);
            if(KEY2 == 0)
            {
                while(!KEY2);
                TX_BUF[0] = 2;          	// 数据送到缓存
                TX_Mode(TX_BUF);            // 把nRF24L01设置为发送模式并发送数据 
                Check_ACK(0);               // 等待发送完毕,清除TX FIFO
                delay_ms(250);
                delay_ms(250);
            }
        }
    }
    

    11) 主函数

    void main(void)
    {
        init_io();                      // 初始化IO
        while(1)
        {
            CheckButtons();           // 按键扫描
        }
    }
    

    2 Enhanced ShockBurstTM接收流程

    A. 配置本机地址和要接收的数据包大小;

    B. 配置CONFIG寄存器,使之进入接收模式,把CE置高。

    C. 130us后,NRF24L01进入监视状态,等待数据包的到来;

    D. 当接收到正确的数据包(正确的地址和CRC校验码),NRF2401自动把字

    头、地址和CRC校验位移去;

    E. NRF24L01通过把STATUS寄存器的RX_DR置位( STATUS一般引起微

    控制器中断 )通知微控制器;

    F. 微控制器把数据从 NewMsg_RF2401 读出;

    G. 所有数据读取完毕后,可以清除STATUS寄存器。NRF2401可以进入

    四种主要的模式之一。

    接收端代码和发射端是一样的

    注意发射端地址和接收端地址一致即可

    接收端主函数

    void main(void)
    {
        init_io();                      // 初始化IO
    	RX_Mode();						// 设置为接收模式
    
        while(1)
        {
            sta = SPI_Read(STATUS);      // 读状态寄存器
            //delay_ms(200);
            if(RX_DR)                    // 判断是否接受到数据
            {
                SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);  // 从RX FIFO读出数据
                flag = 1;
            }
            SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除RX_DS中断标志
    
            if(flag)                   // 接受完成
            {
                if(RX_BUF[0] == 1)// KEY1按下  则蜂鸣器 响1下
                {
                    BEEP = 0;
                    delay_ms(500);
                    BEEP = 1;
                    delay_ms(500);
                }
    
                if(RX_BUF[0] == 2)	// KEY2按下   蜂鸣器响3下
                {
                    BEEP = 0;
                    delay_ms(500);
                    BEEP = 1;
                    delay_ms(500);
                    BEEP = 0;
                    delay_ms(500);
                    BEEP = 1;
                    delay_ms(500);
                    BEEP = 0;
                    delay_ms(500);
                    BEEP = 1;
                    delay_ms(500);
                }
                flag = 0;               // 清标志
                delay_ms(250);
                delay_ms(250);
                LED = 1;                // 关闭LED
            }
        }
    }
    

    上面的代码很详尽了,想要完整工程的可以下载----->>>完整代码工程文件(接收端+发射端)

    凡事不要说“我不会”或“不可能”, 因为你根本还没有去做! 加油吧
    展开全文
  • 无线模块,无线收发模块,无线发射模块,无线接收模块,超外差接收模块,超再生接收模块,低功耗无线模块,无线射频模块,无线数传模块,无线遥控模块,无线通讯模块,RF模块,2.4G模块,2.4G无线模块,2.4G无线双向...
  • 本文详细介绍了基于STC89C52 单片机、NRF24L01 单芯片2.4GHz 收发器、DS18B20单线数字温度传感器的智能无线温度测量系统的设计;给出了硬件电路和软件程序的具体设计;并对系统实际运行的结果进行数据记录与分析。...
  • nRF24L01是底价的2.4G无线传输实现,可以用来做遥控哦。 输出功率频道选择和协议的设置可以通过SPI 接口进行设置。 几乎可以连接到各种单片机芯片,并完成无线数据传送工作。 极低的电流消耗:当工作在发射模式下...
  • 本教程需要51单片机知识,了解什么是2.4G遥控器,冻手能力,信心,耐心(没有这些请绕道) 如果以上这些你都具备那么可以往下面看吧。 1-)准备材料  keil编译软件   stc-isp烧录软件  
  • 这是本人在无线领域多年的积累,希望能给将要从事无线开发的工程师或企业一些经验。
  • 20-STM32F1 2.4G_24L01模块

    2018-08-23 20:39:27
    STM32F1 2.4G无线通信模块 24L01是一个2.4G的无线通信模块,空旷地实测通信距离70-80米左右。 24L01有6个通道,也就是一个无线模块最多可以同时接收6个无线模块的数据,一个通道对应一个。地址一共40位,但是只有...
  • nRF24L01是一款工作在2.4~2.5GHz世界通用ISM频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型SchockBurstTM模式控制器、功率放大器、警惕振荡器、调制器、解调器。输出功率、频道选择和协议的设置可以...
  • STM32F103C8T6 2.4G nrf24l01无线模块通信代码含发送和接收代码,编译通过测试OK,能够正常接收和发送数据
  • 先看模块,如下图:    一个模块的使用,必须先阅读产品文档,我为了学习这个模块,特地将资料文档下载下来,逐一阅读理解,这样以后才能灵活使用其模块。... NRF24L01+模块的使用还是有一定的复杂度的,...
  • 智能校园答题器是基于2.4G无线射频技术特点设计而成的,是一个辅助教师进行课堂互动的工具,是一套集教学互动反馈、教学评测及游戏活动于一体的课堂互动反馈系统。学生人手一个与校园考勤卡融合的答案发送器,根据...
  • NRF24LE1RF24LE1采用了Nordic最新的无线和超低功耗技术,在一个极小封装中集成了包括2.4GHz无线传输,增强型51Flask高速单片机,丰富外设及接口等的单片Flash芯片,是一个综合了性能及成本的完美结合,很适合应用于...
  • 所有的使用Arduino 的朋友大多都会知道大名鼎鼎的XBee 这个土豪级的ZigBee 的通信模块。我们是做产品开发的,对于XBee这个产品可谓是又爱又恨,不得不承认他确实是一个好货,从做工到功能都无须质疑,让人最感到遗憾...
  • 详细资料 一. 产品概述 DT-W5G1模块核心处理器采用超低功耗处理器、2G&5G双频芯片。该芯片在较小尺寸封装中集成了业界领先的32位微型MCU,带有16位精简模式,主频⽀持160 MHz。DT-W5G1拥有完整的Wi-Fi网络功能...
  • 商品规格:六通道2.4G 1.2 WFR06S 2.4G 6通接收机 ■产品规格: 频 段: 2.400GHz-2.483GHz 灵 敏 度: -97dBm 地面直线距离:大于700米 解码方式: PPM/PCMS 1024/PCMS 4096 电 源: 4.8-6V 尺 ...
1 2 3 4 5 ... 20
收藏数 973
精华内容 389