基于STM32F407无线通信实验(有代码)

本文介绍了基于STM32F407的无线通信实验,使用NRF24L01模块进行数据传输。内容包括NRF24L01模块特性、硬件设计、软件设计以及下载验证过程。通过SPI接口连接,实现点对点无线通信,并展示了如何配置SPI参数以匹配NRF24L01的通信要求。
摘要由CSDN通过智能技术生成

引言

STM32F4 开发板带有一个无线模块(WIRELESS接口,采用 8 脚插针方式与开发板连接,可以用来连接 NRF24L01/RFID 等无线模块。本次实验将以 NRF24L01模块为例介绍 STM32F4 开发板上实现无线通信。在本次实验中,我们将使用两块探索者 STM32F4 开发板,一块用于发送收据,另外一块用于接收,从而实现无线数据传输。

1 NRF24L01 无线模块简介

NRF24L01 无线模块,采用的芯片是 NRF24L01,该芯片的主要特点如下:
1)2.4G 全球开放的 ISM 频段,免许可证使用。
2)最高工作速率 2Mbps,高校的 GFSK 调制,抗干扰能力强。
3)125 个可选的频道,满足多点通信和调频通信的需要。
4)内置 CRC 检错和点对多点的通信地址控制。
5)低工作电压(1.9~3.6V)。
6)可设置自动应答,确保数据可靠传输。
该芯片通过 SPI 与外部 MCU 通信,最大的 SPI 速度可以达到 10Mhz。该模块的外形和引脚图如图:
在这里插入图片描述
模块 VCC 脚的电压范围为 1.9~3.6V,建议不要超过 3.6V,否则可能烧坏模块,一般用 3.3V电压比较合适。除了 VCC 和 GND 脚,其他引脚都可以和 5V 单片机的 IO 口直连,正是因为其兼容 5V 单片机的 IO,故使用上具有很大优势。

2 硬件设计

本实验功能简介:开机的时候先检测 NRF24L01 模块是否存在,在检测到 NRF24L01模块之后,根据 KEY0 和 KEY1 的设置来决定模块的工作模式,在设定好工作模式之后,就会不停的发送/接收数据,同样用 DS0 来指示程序正在运行。
所要用到的硬件资源如下:
1) 指示灯 DS0
2) KEY0 和 KEY1 按键
3) TFTLCD 模块
4) NRF24L01 模块
NRF24L01 模块属于外部模块,这里我们仅介绍开发板上 NRF24L01 模块接口和 STM32F4的连接情况,他们的连接关系如图 :
在这里插入图片描述
这里NRF24L01也是使用的SPI1,和W25Q128共用一个SPI接口,所以在使用的时候,他们分时复用SPI1。我们需要把W25Q128的片选信号置高,以防止这个器件对NRF24L01的通信造成干扰。

另外,NRF_IRQ和RS485_RE共用了PG8,所以,他们不能同时使用,不过我们一般用不到NRF_IRQ这个信号,因此,RS485和NRF一般也可以同时使用。由于无线通信实验是双向的,所以至少要有两个模块同时能工作,这里我们使用2套STM32F4开发板来演示。

3 软件设计

NRF24L01底层驱动函数:

const u8 TX_ADDRESS[TX_ADR_WIDTH]={
   0x34,0x43,0x10,0x10,0x01}; //发送地址
const u8 RX_ADDRESS[RX_ADR_WIDTH]={
   0x34,0x43,0x10,0x10,0x01}; //发送地址
void NRF24L01_SPI_Init(void)
{
   
SPI_InitTypeDef SPI_InitStructure;
SPI_Cmd(SPI1, DISABLE); //失能 SPI 外设
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //工作模式:主 SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;// 8 位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //空闲状态为低电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//第 1 个跳变沿数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信号软件管理
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
//预分频值为 256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//数据传输从 MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure); //初始化外设 SPIx 寄存器
SPI_Cmd(SPI1, ENABLE); //使能 SPI 外设
}
//初始化 24L01 的 IO 口
void NRF24L01_Init(void)
{
    
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOG, 
ENABLE);//使能 GPIOB,G 时钟
 //GPIOB14 初始化设置:推挽输出
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
 GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 PB14
//GPIOG6,7 推挽输出
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
 GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化 PG6,7
//GPIOG.8 上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
 GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化 PG8
 GPIO_SetBits(GPIOB,GPIO_Pin_14);//PB14 输出 1,防止 SPI FLASH 干扰 NRF 的通信
 
 SPI1_Init(); //初始化 SPI1 
NRF24L01_SPI_Init();//针对 NRF 的特点修改 SPI 的设置
NRF24L01_CE=0; //使能 24L01
NRF24L01_CSN=1; //SPI 片选取消
}
//检测 24L01 是否存在
//返回值:0,成功;1,失败
u8 NRF24L01_Check(void)
{
   
u8 buf[5]={
   0XA5,0XA5,0XA5,0XA5,0XA5};<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值