20-STM32F1 2.4G_24L01模块

STM32F1 2.4G无线通信模块


24L01是一个2.4G的无线通信模块,空旷地实测通信距离70-80米左右。

24L01有6个通道,也就是一个无线模块最多可以同时接收6个无线模块的数据,一个通道对应一个。地址一共40位,但是只有通道0可以自由设置地址。其他的5路通道只能设置最后8位地址,前面的32位地址是固定的。

自动应答功能,自动重发功能(最多16次),
(实测;距离25cm,最大功率0db、开启自动应答、自动重发16次的情况下,传输30-50次会丢失一次数据)

使用SPI协议通信,最大通信速度10m bps

供电电压1.9-3.6v,一般使用3.3v供电使用(不能使用5v),但是IO口可以容忍5v,可以与5v单片机直接通信。

24L01有不同的工作模式,接收模式、发送模式、掉电模式、待机模式等,数据手册都有说明。

可以产生中断,节省了单片机的查询时间

24L01的指令有点坑,读寄存器的时候直接操作相应寄存器的地址就行。但是在写寄存器的时候就不是直接操作寄存器的地址了,低5位才是寄存器地址,高三位是011.

一般发射数据的时候才设置为发送模式,平时用待机模式就行。

配置寄存器比较多,也不需要全部配置吧,配置一部分就行,代码中有注释。

本实验分为两个工程,一个用于发送,一个用于接收。注释都在发送板的实验里,接收板的注释最好不要看。
发送板功能;上电时如果检测到存在24L01   LED会亮一秒钟才会闪烁。如果不存在24L01模块则上电第一秒LED是黑的。一次发送32个u8的数据,但是只有数组的第11位才是有用的,也就是数组下标为10的那个。如果数据发送成功则LED快闪,一秒钟闪5次。如果没有成功发送数据则LED慢闪,一秒钟一次。
接收板功能;上电后检查24L01模块,如果上电时LED是黑的且LED不闪烁,那就是没有检测到24L01模块,如果上电后LED常亮表示检测到模块但是没有接收到数据,如果LED闪烁就是接收到数据了。

注意;两个工程有部分地方不一样。
1、LED的IO口不一样
2、24L01模块的控制IO不一样,但是SPI口是一样的
3、主函数不一样,一个纯接收一个纯发送当然不一样了

至于具体怎么配置寄存器,发送数据接收数据的流程工程里面的函数都注释的很清楚。
发送板的工程分5个文件,3个c文件,两个h文件
文件 Main.c
#include "sys.h"
#include "delay.h"
#include "spi_24l01.h"
#include "24L01.h"

#define LED(value) GPIO_WriteBit(GPIOE,GPIO_Pin_5,value)


 /************************************************************
功能;LED闪烁,间隔为100ms
其中LED接在PB5上,低电平有效
****************************************************************/

void init_led();





int main(void)
{	
	u16 ms_count=0;
	u8 led_flag=0;
	u8  buf_data[33]={0};//用来存放临时数据
	delay_init();	//延时函数初始化
	init_led();	 //LED初始化。LED是低电平有效
	init_24L01();//无线模块初始化
	
	LED(NRF24L01_Check());//如果检测到无线模块,LED会亮1秒钟
	delay_ms(1000);
	
	NRF24L01_TX_Mode();//设置为发送模式
	
	while(1)
	{
		if(NRF24L01_TxPacket(buf_data) == TX_OK)//其实数据是一直发送的
		{
			buf_data[10]=!buf_data[10];//就拿数组中的一个元素作为LED的标志位吧,
			delay_ms(100);
			LED(buf_data[10]);//如果发送成功,那么接收板和发送板的LED是同步闪烁的
		}
		else//如果发送失败
		{
			ms_count++;
			delay_ms(1);
			if(ms_count>1000)//那就是慢闪了
			{
				ms_count=0;
				led_flag = !led_flag;			
				LED(led_flag);
			}
		}
	}
}

 
 
 
 
 void init_led()  
{
	GPIO_InitTypeDef GPIO_InitStruct;//GPIO结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//打开GPIOB和GPIOE时钟

	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;//PB5
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;//翻转速度=10MHZ
	GPIO_Init(GPIOE, &GPIO_InitStruct);
	GPIO_WriteBit(GPIOE,GPIO_Pin_5,1);//初始化输出1吧
}



文件spi_24l01.c   
好像这样命名文件很不规范,不过无所谓了

#include "spi_24l01.h"


/**********************************
SPI初始化,
这个初始化是给24l01用的,所以在24l01初始化的时候不需要更改SPI初始化的配置
至于24L01的SPI协议中相位选择,高位在前还是低位在前等在24
一、测试距离 0.软件为Keil5,不知道是否支持Keil4(如不行请手动新建Keil4工程) 1.单片机为STM32F103C8,采用硬件SPI 2.nRF24L01+采用3.3V供电,接线如下:       24L01+       STM32 CE   ——   PA3 CS   ——   PA4 SCK  ——   PA5 MISO ——   PA6 MOSI ——   PA7   IRQ未接(采用查询方式,如须用自加外部中断程序) 3.led灯为PC13控制,低电平亮(在User\led.c中修改GPIO);按键为PA0,按下后(接地)才开始发送,默认注释了,如需要可在程序中加上 4.My24L01_Tx为发送端程序,My24L01_Rx为接收端程序; 5.发送端约100ms发送一次,不要ACK;接收端每接收到一次led反转;将程序下载到单片机后可看到接收端led快速闪动,可将接收端的24L01在一定范围内走动,若led闪动变慢,则说明有丢包;led不闪,说明没有收到数据;因此大致可测得发送距离 6.24L01采用0频道,2Mbps, 0dBm, Address 3Bytes,实测距离大于10米(在不同的房间) 二、测试速率 0.软件为Keil5,不知道是否支持Keil4(如不行请手动新建Keil4工程) 
1.单片机为STM32F103C8,采用硬件SPI
 2.nRF24L01+采用3.3V供电,接线如下:
      24L01+       STM32
 CE   ——   PA3
 CS   ——   PA4
 SCK  ——   PA5
 MISO ——   PA6
 MOSI ——   PA7  
 IRQ未接(采用查询方式,如须用自加外部中断程序) 

3.led灯为PC13控制,低电平亮(在User\led.c中修改GPIO);按键为PA0,按下后(接地)才开始发送!!! 

4.My24L01_Tx为发送端程序,My24L01_Rx为接收端程序;

 5.接收端先上电,发送端上电后按下按键后才发送50KB(32B一帧 共32*50帧 32*32=1024=1K),发送端收到ACK后才发下一帧,发完后进入死循环,如须再发要先复位或重新上电;接收端每收到一次led反转;(如未反转说明未成功发送,发送端接收端重新复位后再试)时间可看在接收程序中tim3Count(单位ms 16进制,定时器1ms中断)在Watch1中

 6.发送端我用的是延时等待查询STATUS寄存器,用外部中断IRQ应该会更好(未测试) 

7.24L01采用0频道,2Mbps, 0dBm, Address 3Bytes,实测速率约为50KB/s
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值