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
20-STM32F1 2.4G_24L01模块
最新推荐文章于 2024-07-24 17:31:16 发布