STM32F103ZET6驱动NRF24L01

合集下载

STM32驱动NRF24L01 C语言程序

STM32驱动NRF24L01 C语言程序

184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
#define MAX_TX #define TX_OK #define RX_OK /********* #define #define #define #RX_ADR_WIDTH TX_PLOAD_WIDTH RX_PLOAD_WIDTH
Page 3
// // // // // //
/**SPI1 GPIO Configuration PA5 ------> SPI1_SCK PA6 ------> SPI1_MISO PA7 ------> SPI1_MOSI */ GPIO_InitStruct.Pin = SCK_Pin|MISO_Pin|MOSI_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF0_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE END 0 */ SPI_HandleTypeDef hspi1; /* SPI1 init function */ void MX_SPI1_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; if (HAL_SPI_Init(&hspi1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) { GPIO_InitTypeDef GPIO_InitStruct; if(spiHandle->Instance==SPI1) { /* USER CODE BEGIN SPI1_MspInit 0 */ /* USER CODE END SPI1_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_SPI1_CLK_ENABLE();

基于STM32F103控制的NRF24L01多路无线通信设计研究

基于STM32F103控制的NRF24L01多路无线通信设计研究

基于STM32F103控制的NRF24L01多路无线通信设计研究作者:朱重儒任哲昆来源:《中国新通信》 2018年第1期【摘要】本文基于STM32F103 控制的NRF24L01 多路无线通信系统,设计了组网、串口通信模块,因具有功耗少、有一定的抗干扰能力,但传输的距离少,适合范围较小的无线系统网络。

【关键词】 STM32F103 NRF24L01 多路无线通信设计随着智能技术、信息技术的发展,无线通信传输需求明显增强,如针对智能家具系统。

本次研究尝试设计基于STM32F103 控制的NRF24L01 多路无线通信系统。

一、基本设计1、NRF24L01 无线传输模块与组网。

无线传输模块通过计算机、数据系统主要设备,传输图像具有数据量大优势,目前比较流行的是2.4GHz 无线收发芯片,NRF24L01 芯片,该频段是全球开放的频段,能够避免低频信号、各类家电干扰,提高系统的便捷性。

在增加天线的情况下传输200m,可以通过SPI 接口进行配置,功耗比较低,放射模式发射功率约为-6dBm 时消耗电流9mA,接收模式消耗12.3mA[1]。

NRF24L01 模式下在ShockBurst 模式下,可以接收6 路通道的数据,每个数据都可以采用不同的地址,但采用前文提到的全球开放的频段,实现多路无线通信。

收到数据后,通过NRF24L01 的中断引角IRQ,将核心模块处理程序引入中断,将数据从无线模块RXFIFO 寄存器读取中来。

2、STM32F103 单片机。

STM32F103 系列32 位闪存微控制器是一种基于嵌入式开发的突破性ARM Cortex-M3 内核,系列不仅大幅度提升中断响应速度,同时具有功效低等优势,最高工作频率72MHz,有256K 字节的闪存,64K 字节静态存储器,有太网接口、2 个CAN 总线接口等接口配备,80 个输入输出接口,2 个12 位ADC 模数转换器,多种定时器。

数据采集可以选择SD 存储卡、GPS 接收模块、各种类型的感受模块等。

关于使用STM32硬件SPI驱动NRF24L01

关于使用STM32硬件SPI驱动NRF24L01

关于使用STM32硬件SPI驱动NRF24L01+ 今天是大年初一总算有时间做点想做很久的事了,说到NRF2401可能很多电子爱好者都有用过或是软件模拟驱动又或是用单片机自带的硬件SPI来驱动,但不管是用哪种方法来驱动我想都在调试方面耗费了不少的时间(可能那些所谓的电子工程师不会出现这种情况吧!)网上的资料确实很多,但大多数都并没有经过发贴人认真测试过,有的只是理论上可以行的通但上机测试只能说是拿回来给他修改。

本文作者也是经过无助的多少天才算是调试成功了(基于STM32硬件SPI,软件模拟的以前用51单片机已经调通了今天就不准备再拿来讲了,当然如果以后有朋友有需要也可以告诉我,我也可以重新写一篇关于51的驱动的只要有时间是没有问题的。

)因为我用的是STM32F103C8T6的系统而且是刚接触不知道别的系统和我用的这个系统有多大的差别所以我不会整个代码全贴上来就完事了,我将就着重思路配合代码写出来,这样对于刚接触单片机的朋友会有很好的作用,但是还有一点请大家要原谅,可能会存在一些说的不好的地方,毕竟我没有经过正规渠道系统地学习过电子知识,对于前辈来说存在这样那样的问题不可避免的,在此也希望大家指教!贴个图先:NRF2401+的资料大家上网查一下,我输字的速度有点不好说!下面我来说一下整个调试流程吧1.先把STM32串口一调通(因为我不知道STM32 I/O口不知可不可以像51那样并口输出数据,如果可以那就更方便啰)。

2.与NRF2401建立起通信(这个才是问题的关键);3.利用读NRF2401的一个状态寄存器(STATUS)的值并通过串口发送到PC后通过51下载软件的串口助手显示出来(如果你用液晶来调试那你太有才了,你液晶和NRF2401存在牵连可能就会给寻找不成功的原因造成困难,而且还有不少硬件工作要做)在这说一下本文只调试发送程序,致于接收只改一个程序参数就行了。

我们先来调试STM32F103C8T6的串口1吧(也就是USART1)!它是STM32F103C8T6的片上外设之一,使用它时相对来说简单了不少。

nRF24L01无线模块讲解解读

nRF24L01无线模块讲解解读

数据通道
nRF24L01 在接收模式下可以接收6 路不同通道的数据。
数据通道
• 每一个数据通道使用不同的地址,但是共用相同的频道。 也就是说6 个不同的nRF24L01 设置为发送模式后可以与 同一个设置为接收模式的nRF24L01 进行通讯,而设置为 接收模式的nRF24L01 可以对这6 个发射端进行识别。 • 数据通道是通过寄存器EN_RXADDR 来设置的,默认状 态下只有数据通道0 和数据通道1 是开启状态的。 • nRF24L01在确认收到数据后记录地址,并以此地址为目 标地址发送应答信号,在发送端,数据通道0被用作接收 应答信号,因此属通道0 的接收地址要与发送地址端地址 相等,以确保接收到正确的应答信号。
封装引脚及其引脚功能
nRF单端50Ω射频输出原理图
nRF24L10与单片机应用电路图
举例:NRF24L01模块口与STM32连接原理图中断
• nRF24L01 的中断引脚(IRQ)为低电平触发,当状态寄 存器中TX_DS(数据发送完成中断位)、RX_DR(接收 数据中断位) 或MAX_RT(达到最多次重发中断位)为 高时触发中断。 • 当MCU 给中断源写‘1’时,中断引脚被禁止。可屏蔽中 断可以被IRQ 中断屏蔽。通过设置可屏蔽中断位为高,则 中断响应被禁止。默认状态下所有的中断源是被禁止的。
nRF24l01的SPI通信时序
增强型ShockBurstTM 发送模式
• 1、 配置寄存器位PRIM_RX 为低 • 2、 当MCU 有数据要发送时,接收节点地址(TX_ADDR) 和有效数据(TX_PLD)通过SPI 接口写入nRF24L01。发送 数据的长度以字节计数从MCU 写入TX FIFO。当CSN 为 低时数据被不断的写入。发送端发送完数据后,将通道0 设置为接收模式来接收应答信号,其接收地址 (RX_ADDR_P0)与接收端地址(TX_ADDR)相同。 例:在上图 中数据通道5 的发送端(TX5)及接收端(RX)地 址设置如下: TX5:TX_ADDR=0xB3B4B5B605 TX5:RX_ADDR_P0=0xB3B4B5B605 RX:RX_ADDR_P5=0xB3B4B5B605

STM32F103ZET6驱动NRF24L01.pdf

STM32F103ZET6驱动NRF24L01.pdf
STM32 驱动无线模块,已调好可用
#include "bsp.h"
u8 TX_ADDRESS[TX_ADR_WIDTH]={0x02,0x02,0x02,0x02,0x02}; //发送地址
u8 RX_ADDRESS[RX_ADR_WIDTH]={0x02,0x02,0x02,0x02,0x02}; //发送地址
GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOB,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
NRF2写入的地址
for(i=0;i<5;i++)
//检测读到的数据是否正确
{
//PG6 -- CE PG7 -- CS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //PG6 7 推挽 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定 IO //IRQ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOG, &GPIO_InitStructure);

STM32驱动NRF24L01

STM32驱动NRF24L01

STM32驱动NRF24L01
1. 简介
NRF24L01 是nordic 的无线通信芯片,它具有以下特点:
1)2.4G 全球开放的ISM 频段(2.400 - 2.4835GHz),免许可证使用;
2)最高工作速率2Mbps,高校的GFSK 调制,抗干扰能力强;
3)125 个可选的频道,满足多点通信和调频通信的需要;
4)内置CRC 检错和点对多点的通信地址控制;
5)低工作电压(1.9~3.6V),待机模式下状态为26uA;掉电模式下为
900nA;
6)可设置自动应答,确保数据可靠传输;
7)工作于EnhancedShockBurst 具有Automatic packet handling,Auto packet transaction handling ,可以实现点对点或是 1 对 6 的无线通信,速度可以达
到2M(bps),具有可选的内置包应答机制,极大的降低丢包率。

8)通过SPI 总线与单片机进行交互,最大通信速率为10Mbps;
1.1 结构框图
如图右侧为六个控制和数据信号,分别为CSN、SCK、MISO、MOSI、IRQ、CE。

信号线功能
CSN 芯片的片选线,CSN 为低电平芯片工作
SCK 芯片控制的时钟线(SPI 时钟)
MISO 芯片控制数据线(Master input slave output)
MOSI 芯片控制数据线(Master output slave input)
IRQ 中断信号。

无线通信过程中MCU 主要是通过IRQ 与NRF24L01 进。

SPI方式STM32F103与2.4G模块NRF24L01收发通讯

SPI方式STM32F103与2.4G模块NRF24L01收发通讯

1.简介通过SPI方式与NRF24L01模块进行通讯,接收到的数据通过串口1打印出来,实时监测是否收到数据,发送的数据是“2.4G TEST”,当收不到数据时打印“no data”。

一块STM32F103ZET6开发板接收数据,另一块STM32F103RBT6开发板发送数据,两个淘宝买的2.4G NRF24L01模块。

还用到一块USB转TTL模块用来电平转换传送数据,串口调试助手接收串口发送数据。

2.代码部分---------nrf24l01.h-----------#ifndef __24L01_H#define __24L01_H#include "sys.h"/////////////////////////////////////////////////////////////////////////////// /////////////////////////////NRF24L01寄存器操作命令#define NRF_READ_REG 0x00 //读配置寄存器,低5位为寄存器地址#define NRF_WRITE_REG 0x20 //写配置寄存器,低5位为寄存器地址#define RD_RX_PLOAD 0x61 //读RX有效数据,1~32字节#define WR_TX_PLOAD 0xA0 //写TX有效数据,1~32字节#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用#define REUSE_TX_PL 0xE3 //重新使用上一包数据,CE为高,数据包被不断发送.#define NOP 0xFF //空操作,可以用来读状态寄存器//SPI(NRF24L01)寄存器地址#define CONFIG 0x00 //配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;//bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能#define EN_AA 0x01 //使能自动应答功能 bit0~5,对应通道0~5#define EN_RXADDR 0x02 //接收地址允许,bit0~5,对应通道0~5#define SETUP_AW 0x03 //设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节;#define SETUP_RETR 0x04 //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时 250*x+86us#define RF_CH 0x05 //RF通道,bit6:0,工作通道频率;#define RF_SETUP 0x06 //RF寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益#define STATUS 0x07 //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发//bit5:数据发送完成中断;bit6:接收数据中断;#define MAX_TX 0x10 //达到最大发送次数中断#define TX_OK 0x20 //TX发送完成中断#define RX_OK 0x40 //接收到数据中断#define OBSERVE_TX 0x08 //发送检测寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器#define CD 0x09 //载波检测寄存器,bit0,载波检测;#define RX_ADDR_P0 0x0A //数据通道0接收地址,最大长度5个字节,低字节在前#define RX_ADDR_P1 0x0B //数据通道1接收地址,最大长度5个字节,低字节在前#define RX_ADDR_P2 0x0C //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define RX_ADDR_P3 0x0D //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define RX_ADDR_P4 0x0E //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define RX_ADDR_P5 0x0F //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define TX_ADDR 0x10 //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等#define RX_PW_P0 0x11 //接收数据通道0有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P1 0x12 //接收数据通道1有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P2 0x13 //接收数据通道2有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P3 0x14 //接收数据通道3有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P4 0x15 //接收数据通道4有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P5 0x16 //接收数据通道5有效数据宽度(1~32字节),设置为0则非法#define NRF_FIFO_STATUS 0x17 //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RXFIFO满标志;bit2,3,保留//bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.0,不循环;////////////////////////////////////////////////////////////////////////////////////////////////////////////24L01操作线#define NRF24L01_CE_High GPIO_SetBits(GPIOB,GPIO_Pin_4) //24l01片选#define NRF24L01_CE_Low GPIO_ResetBits(GPIOB,GPIO_Pin_4) //24L01片选信号#define NRF24L01_CSN_High GPIO_SetBits(GPIOB,GPIO_Pin_5) //SPI片选信号#define NRF24L01_CSN_Low GPIO_ResetBits(GPIOB,GPIO_Pin_5)#define NRF24L01_IRQ GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6) //IRQ主机数据输入//24L01发送接收数据宽度定义#define TX_ADR_WIDTH 5 //5字节的地址宽度#define RX_ADR_WIDTH 5 //5字节的地址宽度#define TX_PLOAD_WIDTH 32 //32字节的用户数据宽度#define RX_PLOAD_WIDTH 32 //32字节的用户数据宽度void NRF24L01_Init(void); //初始化void NRF24L01_RX_Mode(void); //配置为接收模式void NRF24L01_TX_Mode(void); //配置为发送模式u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);//写数据区u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s); //读数据区u8 NRF24L01_Read_Reg(u8 reg); //读寄存器u8 NRF24L01_Write_Reg(u8 reg, u8 value); //写寄存器u8 NRF24L01_Check(void); //检查24L01是否存在u8 NRF24L01_TxPacket(u8 *txbuf); //发送一个包的数据u8 NRF24L01_RxPacket(u8 *rxbuf); //接收一个包的数据#endif-----------nrf24l01.c----------------#include "24l01.h"#include "delay.h"#include "usart.h"///////////////////////////////////////////////////////////////////////////////const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//初始化24L01的IO口void NRF24L01_Init(void){GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOBGPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI 单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步时钟的空闲状态为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器//使能SPI外设GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4|GPIO_Pin_5; //PB12上拉防止W25X的干扰GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PG6 输入GPIO_Init(GPIOB, &GPIO_InitStructure);//使能SPI外设SPI_Cmd(SPI2, ENABLE);NRF24L01_CE_Low; //使能24L01NRF24L01_CSN_High; //SPI片选取消}//SPIx 读写一个字节//TxData:要写入的字节//返回值:读取到的字节u8 SPI2_ReadWriteByte(u8 TxData){while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); //检查指定的SPI标志位设置与否:发送缓存空标志位SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据delay_us(2);while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);//检查指定的SPI标志位设置与否:接受缓存非空标志位return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据delay_us(2);}//检测24L01是否存在//返回值:0,成功;1,失败u8 NRF24L01_Check(void){u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};u8 i;//SPI2_SetSpeed(SPI_BaudRatePrescaler_4); //spi速度为9Mhz(24L01的最大SPI 时钟为10Mhz)NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址for(i=0;i<5;i++)if(buf[i]!=0XA5)break;if(i!=5)return 1;//检测24L01错误return 0; //检测到24L01}//SPI写寄存器//reg:指定寄存器地址//value:写入的值u8 NRF24L01_Write_Reg(u8 reg,u8 value){u8 status;NRF24L01_CSN_Low; //使能SPI传输status =SPI2_ReadWriteByte(reg);//发送寄存器号SPI2_ReadWriteByte(value); //写入寄存器的值NRF24L01_CSN_High; //禁止SPI传输return(status); //返回状态值}//读取SPI寄存器值//reg:要读的寄存器u8 NRF24L01_Read_Reg(u8 reg){u8 reg_val;NRF24L01_CSN_Low; //使能SPI传输SPI2_ReadWriteByte(reg); //发送寄存器号reg_val=SPI2_ReadWriteByte(0XFF);//读取寄存器内容NRF24L01_CSN_High; //禁止SPI传输return(reg_val); //返回状态值}//在指定位置读出指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len){u8 status,u8_ctr;NRF24L01_CSN_Low; //使能SPI传输status=SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//读出数据NRF24L01_CSN_High; //关闭SPI传输return status; //返回读到的状态值}//在指定位置写指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len){u8 status,u8_ctr;NRF24L01_CSN_Low; //使能SPI传输status = SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); //写入数据NRF24L01_CSN_High; //关闭SPI传输return status; //返回读到的状态值}//启动NRF24L01发送一次数据//txbuf:待发送数据首地址//返回值:发送完成状况u8 NRF24L01_TxPacket(u8 *txbuf){u8 sta;// SPI2_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)NRF24L01_CE_Low;NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节NRF24L01_CE_High;//启动发送//while(NRF24L01_IRQ!=0);//等待发送完成sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志if(sta&MAX_TX)//达到最大重发次数{NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器return MAX_TX;}if(sta&TX_OK)//发送完成{return TX_OK;}return 0xff;//其他原因发送失败}//启动NRF24L01发送一次数据//txbuf:待发送数据首地址//返回值:0,接收完成;其他,错误代码u8 NRF24L01_RxPacket(u8 *rxbuf){u8 sta;//SPI2_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI 时钟为10Mhz)sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志if(sta&RX_OK)//接收到数据{NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器return 0;}return 1;//没收到任何数据}//该函数初始化NRF24L01到RX模式//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR//当CE变高后,即进入RX模式,并可以接收数据了void NRF24L01_RX_Mode(void){NRF24L01_CE_Low;NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);/ /写RX节点地址NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通信频率NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式NRF24L01_CE_High; //CE为高,进入接收模式}//该函数初始化NRF24L01到TX模式//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR//PWR_UP,CRC使能//当CE变高后,即进入RX模式,并可以接收数据了//CE为高大于10us,则启动发送.void NRF24L01_TX_Mode(void){NRF24L01_CE_Low;NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACKNRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通道为40NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断NRF24L01_CE_High;//CE为高,10us后启动发送}-------usart.h----------#ifndef __USART_H#define __USART_H#include "stdio.h"#include "sys.h"/////////////////////////////////////////////////////////////////////////////// void uart_init(u32 bound);void usart1_send_string(u8 *BuffToSend);#endif---------usart.c---------------#include "sys.h"#include "usart.h"/////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);//使能USART1,GPIOA时钟//USART1_TX GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_ART_BaudRate = bound;//串口波特率USART_ART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_ART_StopBits = USART_StopBits_1;//一个停止位USART_ART_Parity = USART_Parity_No;//无奇偶校验位USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART1, ENABLE); //使能串口1}//打印字符串void usart1_send_string(u8 *BuffToSend){u8 i=0;while(BuffToSend[i]!='\0'){USART_SendData(USART1, BuffToSend[i]);while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);i++;}}收发主函数是分开写的,因为用的不同的芯片。

STM32学习笔记-STM32F103ZET6

STM32学习笔记-STM32F103ZET6

STM32F103 系列芯片的系统架构:系统结构:在每一次复位以后,所有除SRAM 和FLITF 以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR 来打开该外设的时钟。

GPIO 输入输出,外部中断,定时器,串口。

理解了这四个外设,基本就入门了一款MCU。

时钟控制RCC:-4~16M 的外部高速晶振-内部8MHz 的高速RC 振荡器-内部40KHz低速RC 振荡器,看门狗时钟-内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL 倍频后得到- 外部低速32.768K 的晶振,主要做RTC 时钟源ARM存储器映像:数据字节以小端格式存放在存储器中。

一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。

存储器映像与寄存器映射:ARM 存储器映像4GB0X0000 00000X1FFF FFFF0X2000 00000X3FFF FFFF0X4000 00000X5FFF FFFF寄存器名称相对外设基地址的偏移值编号位表读写权限寄存器位功能说明使用C语言封装寄存器:1、总线和外设基地址封装利用地址偏移(1)定义外设基地址(Block2 首地址)(2)定义APB2总线基地址(相对外设基地址偏移固定)(3)定义GPIOX外设基地址(相对APB2总线基地址偏移固定)(4)定义GPIOX寄存器地址(相对GPIOX外设基地址偏移固定)(5)使用 C 语言指针操作寄存器进行读/写//定义外设基地址#define PERIPH_BASE ((unsigned int)0x40000000) 1)//定义APB2 总线基地址#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) 2)//定义GPIOC 外设基地址#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) 3)//定义寄存器基地址这里以GPIOC 为例#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00) 4)#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)//控制GPIOC 第0 管脚输出一个低电平5)GPIOC_BSRR = (0x01<<(16+0));//控制GPIOC 第0 管脚输出一个高电平GPIOC_BSRR = (0x01<<0);2、寄存器封装利用结构体、外设基地址和寄存器地址偏移typedef unsigned int uint32_t; /*无符号32 位变量*/typedef unsigned short int uint16_t; /*无符号16 位变量*//* GPIO 寄存器列表*/typedef struct{uint32_t CRL; /*GPIO 端口配置低寄存器地址偏移: 0x00 */uint32_t CRH; /*GPIO 端口配置高寄存器地址偏移: 0x04 */uint32_t IDR; /*GPIO 数据输入寄存器地址偏移: 0x08 */uint32_t ODR; /*GPIO 数据输出寄存器地址偏移: 0x0C */uint32_t BSRR; /*GPIO 位设置/清除寄存器地址偏移: 0x10 */uint32_t BRR; /*GPIO 端口位清除寄存器地址偏移: 0x14 */uint16_t LCKR; /*GPIO 端口配置锁定寄存器地址偏移: 0x18 */}GPIO_TypeDef;只要给结构体设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构体的形式访问寄存器。

STM32驱动NRF24L01

STM32驱动NRF24L01

STM32驱动NRF24L01
STM32驱动NRF24L01
1. 简介
NRF24L01 是nordic 的无线通信芯片,它具有以下特点:
1)2.4G 全球开放的ISM 频段(2.400 - 2.4835GHz),免许可证使用;
2)最高工作速率2Mbps,高校的GFSK 调制,抗干扰能力强;
3)125 个可选的频道,满足多点通信和调频通信的需要;
4)内置CRC 检错和点对多点的通信地址控制;
5)低工作电压(1.9~3.6V),待机模式下状态为26uA;掉电模式下为
900nA;
6)可设置自动应答,确保数据可靠传输;
7)工作于EnhancedShockBurst 具有Automatic packet handling,Auto packet transaction handling ,可以实现点对点或是1 对 6 的无线通信,速度可以达
到2M(bps),具有可选的内置包应答机制,极大的降低丢包率。

8)通过SPI 总线与单片机进行交互,最大通信速率为10Mbps;
1.1 结构框图
如图右侧为六个控制和数据信号,分别为CSN、SCK、MISO、MOSI、IRQ、CE。

信号线功能
CSN 芯片的片选线,CSN 为低电平芯片工作
SCK 芯片控制的时钟线(SPI 时钟)
MISO 芯片控制数据线(Master input slave output)
MOSI 芯片控制数据线(Master output slave input)
IRQ 中断信号。

无线通信过程中MCU 主要是通过IRQ 与NRF24L01 进。

使用STM32F030F4P6的SPI协议和NRF24L01模块进行通讯实现无线数据的收发

使用STM32F030F4P6的SPI协议和NRF24L01模块进行通讯实现无线数据的收发

使⽤STM32F030F4P6的SPI协议和NRF24L01模块进⾏通讯实现⽆线数据的收发单⽚机这块纯属个⼈业余爱好, 有很多不⾜的地⽅还请⼤家多多指教, 代码中有些命名不规范的地⽅还请⼤家多多包涵.本⽂只实现⽆线模块的简单的点亮(能收发⼀个字节数据), ⼀直想diy⼀个⽆线遥控的⼩车, 就要使⽤到⽆线模块, 找了好久发现NRF24L01(下⾯简称NRF)是最便宜的⼀款⽆线模块(除过WiFi和蓝⽛模块), 就买了⼏个, 由于stm32f103涨价, 就选择了便宜的stm32f030, ⽹上找了很多资料对于stm32f030的资料很少, 他和stm32f103代码⼤同⼩异, 就试着在stm32f103代码的基础上修改⼀下, 就是不能通讯, 只能发送成功, 不能接收到数据, 搁置了好久最后从新选择了⼀块 HC-12 的⽆线通讯模块, 这个模块⽐较贵⾸次购买⼀套(收发两个模块)⽐较便宜, 空旷视野最远通讯距离1公⾥(没有实测量过), 他使⽤的是串⼝通讯, 写好代码烧录进去后可以通讯, 最后成功diy了⽆线遥控⼩车, 利⽤HC-12感觉⼤材⼩⽤了, 最后闲来⽆事就⼜琢磨⼀下这个NRF模块, 终于可以相互通讯了, 也不知道哪⾥出问题了, 唯⼀不同的是, 之前的是在⽹上找的资料上修修改改, 没有使⽤中断, 只使⽤了while循环进⾏检测, 这次重头开始编写的时候使⽤了中断, 在调试了⼀下就可以通讯.遇到的⼀些问题:1.原理图上PA4 是SPI1的⽚选spi1_nss的复⽤, 配置的时候把PA4也配置成了复⽤模式, 发现不能成功, 需要配置成输出模式解决了问题2.NRF的IRQ脚配置中断的时候需要配置为下降沿触发3.stm32板⼦和NRF模块进⾏连接的时候数据输出和输⼊线不能交叉连接(MCU 的MISO 和 NRF的 MISO 相连, MOSI同理)以下是代码 , 适⽤于stm32f0301. spi配置#ifndef __bsp_spi_h#define __bsp_spi_h#include "stm32f0xx_gpio.h"#define SPIx SPI1 //SPI_1#define SPI1_PORT GPIOA //PA 端⼝#define PORTA_LCK RCC_AHBPeriph_GPIOA //GPIO 时钟#define SPI_LCK RCC_APB2Periph_SPI1//spi 时钟#define SPI1_CSN GPIO_Pin_1 //PA1 NSS#define SPI1_SCK GPIO_Pin_5 //PA5 SCK#define SPI1_MISO GPIO_Pin_6 //PA6 MISO#define SPI1_MOSI GPIO_Pin_7 //PA7 MOSIvoid SPI_Config(void);u8 SPI_SendByte(u8 byte);void Pin_CSN(u8 u);#endifbsp_spi.h#include "bsp_spi.h"#include "stm32f0xx_gpio.h"//初始化void SPI_Config(){GPIO_InitTypeDef GPIO_InitStruct;SPI_InitTypeDef SPI_InitStruct;//端⼝初始化RCC_AHBPeriphClockCmd(PORTA_LCK , ENABLE);//开启GPIO时钟RCC_APB2PeriphClockCmd(SPI_LCK, ENABLE);//开启SPI_1时钟//复⽤模式GPIO_PinAFConfig(SPI1_PORT,GPIO_PinSource5,GPIO_AF_0);//SCKGPIO_PinAFConfig(SPI1_PORT,GPIO_PinSource6,GPIO_AF_0);//MISOGPIO_PinAFConfig(SPI1_PORT,GPIO_PinSource7,GPIO_AF_0);//MOSIGPIO_InitStruct.GPIO_Pin = SPI1_SCK | SPI1_MISO | SPI1_MOSI;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(SPI1_PORT, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = SPI1_CSN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_Init(SPI1_PORT , &GPIO_InitStruct);//spi初始化//SPI_I2S_DeInit(SPIx); //将寄存器重设为缺省值//SPI_Cmd(SPIx, DISABLE);//SPI_Direction_2Lines_FullDuplex SPI_Direction_1Line_Rx SPI_Direction_1Line_TxSPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI_Mode_Master 主机 SPI_Mode_Slave 从机SPI_InitStruct.SPI_Mode = SPI_Mode_Master;SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;//SPI_CPOL_Low SPI_CPOL_HighSPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;//SPI_CPHA_1Edge SPI_CPHA_2EdgeSPI_InitStruct.SPI_NSS = SPI_NSS_Soft;SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;//SPI_FirstBit_MSB SPI_FirstBit_LSBSPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStruct.SPI_CRCPolynomial = 7;SPI_Init(SPIx, &SPI_InitStruct);//SPI_I2S_IT_TXE SPI_I2S_IT_RXNE SPI_I2S_IT_ERRSPI_I2S_ITConfig(SPIx, SPI_I2S_IT_TXE | SPI_I2S_IT_RXNE, ENABLE);//中断SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF); //重要,把应答数据位设置为 8 位 SPI_Cmd(SPIx, ENABLE);//使能}//SPI 收发⼀个字节u8 SPI_SendByte(u8 byte){//设置时间溢出u32 SPITimeout = 0xffff;/* 等待发送缓冲区为空,TXE 事件 */while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET){if ((SPITimeout--) == 0) return0;}/* 写⼊数据寄存器,把要写⼊的数据写⼊发送缓冲区 */SPI_SendData8(SPIx, byte);//SPI_I2S_SendData16//设置时间溢出SPITimeout = 0xfffff;/* 等待接收缓冲区⾮空,RXNE 事件 */while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET){if ((SPITimeout--) == 0) return0;}/* 读取数据寄存器,获取接收缓冲区数据 */return SPI_ReceiveData8(SPIx);}//设置⽚选⾼低电平void Pin_CSN(u8 u){if(u==0){SPI1_PORT->BRR = SPI1_CSN;}else{SPI1_PORT->BSRR = SPI1_CSN;}}bsp_spi.c2.nrf配置#ifndef __bsp_nrf0241_h#define __bsp_nrf0241_h#include "stm32f0xx_gpio.h"#define NRF_PORT GPIOA //PA 端⼝#define KEY0 GPIO_Pin_0 //KEY0#define LED0 GPIO_Pin_4 //LED0#define NRF_CE GPIO_Pin_2 //PA2 CE#define NRF_IRQ GPIO_Pin_3 //PA3 IRQ#define NOP 0xFF // 空操作。

STM32F0无法使NRF2401工作,求达人指点迷津!(amoBBS阿莫电子论坛)

STM32F0无法使NRF2401工作,求达人指点迷津!(amoBBS阿莫电子论坛)

STM32F0无法使NRF2401工作,求达人指点迷津!(amoBBS阿莫电子论坛)首先,说一下情况:参考STM32F0开发板的例程中的推挽输出(参照GPIO),上拉输入(参照EXTI),复用输出(参照UART),然后照着正点原子的ALIENTEK MINISTM32 实验无线通信实验完成了连线以及配置,但是,无法使这两个板子通讯,经过检测,发现F0的板子的NRF24L01_Check()一直无法过去,while在那里,现在传上代码,请达人们给予指点,谢谢了程序很简单,就是初始化24L01及检测它的存在主函数部分int main(void){NRF24L01_Init(); //初始化NRF24L01while(NRF24L01_Check());//检测24L01,一直死在这里,很不解while (1){}}24L01函数部分const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址//初始化24L01的IO口void NRF24L01_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOC, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ; //推挽输出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ; //推挽输出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_4);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN ; //上拉输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOC, &GPIO_InitStructure);SPIx_Init(); //初始化SPIClr_NRF24L01_CE; //使能24L01 NRF24L01_CESet_NRF24L01_CSN; //SPI片选取消NRF24L01_CSN}void SPIx_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE );GPIO_DeInit(GPIOA);/* Connect pin to Periph */GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);/* Configure pins as AF pushpull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStructure);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //选择了串行时钟的稳态:时钟悬空低电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第一个时钟沿SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI1, ENABLE); //使能SPI外设SPIx_ReadWriteByte(0xff);//启动传输}//检测24L01是否存在//返回值:0,成功;1,失败u8 NRF24L01_Check(void){u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};u8 i;SPIx_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz (24L01的最大SPI时钟为10Mhz)NRF24L01_Write_Buf(NRF24L01_WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址for(i=0;i<5;i++)if(buf[i]!=0XA5)break;if(i!=5)return 1;//检测24L01错误return 0; //检测到24L01}//SPIx 读写一个字节//TxData:要写入的字节//返回值:读取到的字节u8 SPIx_ReadWriteByte(u8 TxData){u8 retry=0;while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位{retry++;if(retry>200)return 0;}SPI_I2S_SendData16(SPI1, TxData); //通过外设SPIx发送一个数据retry=0;while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志位{retry++;if(retry>200)return 0;}return SPI_I2S_ReceiveData16(SPI1); //返回通过SPIx最近接收的数据}红色部分和原子的不一样,因为F0的SPI部分有void SPI_SendData8(SPI_TypeDef* SPIx, uint8_t Data)uint8_t SPI_ReceiveData8(SPI_TypeDef* SPIx)。

如何通过STM32驱动nRF24L01发送数据

如何通过STM32驱动nRF24L01发送数据

如何通过STM32驱动nRF24L01发送数据最近在一个项目中用到了nRF24L01这个无线2.4G收发芯片,项目中有主机和分机,默认都是使用数据通道0,主机通过nRF24L01发送数据后,对应地址的分机在收到数据后会返回一个确认数据包给主机(注意:这个确认数据包并不是nRF24L01自动应答时的数据包,而是自定义的一个数据包,说明了就是双方都能进行收发),在经过长时间的摸索之后,终于将接收和发送都调通了,基本的SPI驱动我使用的是正点原子的教程,我是使用的中断法来处理相应的收发工作。

我的软件硬件环境大致如下:服务端:STM32F103VET6+u/COS-III从机端:STM32F103RBT6+u/COS-III库函数是使用的3.5版本的。

在这里我只是列出主机部分的代码,从机上的都是差不多的。

下面是nRF24L01的驱动部分头文件部分(24l01.h):#ifndef__24L01_H#define__24L01_H#include“config.h”#ifnRF24L01_EN》0u#include“sys_temp.h”/*---------------------------------------------------------------------------------------------NRF24L01寄存器操作命令及寄存器地址-----------------------------------------------------------------------------------------------*/#defineSPI_READ_REG0x00//读配置寄存器,低5位为寄存器地址#defineSPI_WRITE_REG0x20//写配置寄存器,低5位为寄存器地址#defineRD_RX_PLOAD0x61//读RX有效数据,1~32字节#defineWR_TX_PLOAD0xA0//写TX有效数据,1~32字节。

毕业论文——蔬菜大棚温湿度控制系统设计

毕业论文——蔬菜大棚温湿度控制系统设计

毕业论文(设计)蔬菜大棚温湿度控制系统设计院系名称信息科学与工程系姓名学号专业电子信息工程指导教师年月摘要近些年,蔬菜大棚技术发展十分迅速,相关技术日益成熟,蔬菜大棚的数量也日益增加,研究蔬菜大棚可以提高蔬菜产量和质量,从而更好的为现代人服务;本文旨在设计出一套蔬菜大棚温湿度控制系统,代替人工,更好的控制蔬菜大棚内的温湿度,满足生产的需求。

本文基于物联网技术设计了一套蔬菜大棚温湿度控制系统;在系统中引入了nRF24L01技术组网和GSM通信技术,使用本系统,我们可以很方便的采集蔬菜大棚内的空气温湿度等环境参数,并通过LCD液晶显示器显示蔬菜大棚中的温湿度等环境参数,当系统出现异常时,可以通过GSM网络将警告信息发送给用户,此外,用户还可以通过按键控制湿度控制器和温度控制器调节蔬菜大棚环境参数。

本系统由一个主节点和多个从节点构成。

主要工作内容如下所示:1.主节点控制系统选择STM32F103ZET6单片机作为主控制器,主控制器连接nRF24L01无线模块、SIM808模块等外围设备;从节点控制系统选择STC89C52单片机作为控制器,控制器连接温湿度传感器和nRF24L01;2.一个主节点可以通过nRF24L01无线模块和多个从节点进行通信。

主节点控制系统中主控制器STM32FZET6外围连接SIM808模块,当系统出现故障的时候,将通过GSM网络自动向用户发送一条报警信息,以便用户能及时发现排除故障。

关键词:nRF24L01,STM32F103ZET6,STC89C52,SIM808模块IAbstractIn recent years, the development of vegetable greenhouse technology is very rapid, related technology matures, the number of greenhouses increasing, vegetable greenhouse is conducive to open our door to wisdom, improve the yield and quality of vegetables, so as to better serve for the modern people; the purpose of this paper is to design a set of vegetable greenhouse temperature and humidity control system, instead of manual, temperature and humidity better control of vegetable greenhouse, meet the demand of the production.This paper based on IOT technology to design a set of vegetable greenhouse temperature and humidity control system; nFR24L01 network technology and GSM communication technology is introduced in the system, the use of the system, we can easily collect greenhouse air humidity and other environmental parameters, and through the LCD liquid crystal display in vegetable greenhouse temperature and humidity etc. the environmental parameters, when the system is abnormal, the warning information can be sent to the user through the GSM network, in addition, users can also through the buttons to control the humidity controller and a temperature controller of greenhouse environment parameters.The system consists of a master node and multiple slave nodes. The main work is as follows:1.Master node control system selects STM32F103ZET6 MCU as the main controller, the main controller is connected with the nFR24L01 wireless module,SIM808 module and other peripheral equipment; from the choice of the STC89C52 as the controller node control system, the controller is connected with a temperature humidity sensor and nFR24L01;2.A master node can communicate via nFR24L01 wireless module and multiple slave nodes. The main control node main controller connected to the SIM808STM32FZET6 peripheral module in the system, when the system fails, will be automatically sent to the user through the GSM network an alarm information, so that users can find out fault.Key Word:nFR24L01, STM32F103ZET6, STC89C52, SIM808 ModuleII目录1 引言 (1)1.1.课题背景 (1)1.2.国内外研究现状 (1)1.2.1.国内现状分析 (1)1.2.2. 国外现状分析 (2)1.2.3. 研究状况总结 (3)1.3.本课题的研究内容 (3)2总体设计 (4)2.3蔬菜大棚温湿度控制系统核心技术 (6)2.3.1 nRF24L01组网技术 (6)2.3.2 GSM通信技术 (6)2.4本章小结 (6)3嵌入式系统设计 (7)3.1主节点控制系统设计 (7)3.1.1主控制器选择 (8)3.1.2主从节点间通信方式 (8)3.1.3 .LCD选型及电路设计 (10)3.2从节点控制系统设计 (13)3.2.1单片机选型和设计 (13)3.2.2传感器接口电路设计 (15)3.3本章小结 (16)4 结论 (45)参考文献 (45)致谢 (45)III1 引言1.1.课题背景蔬菜大棚技术在我国很早就已经发展起来了,并且已经趋于成熟,传统的蔬菜大棚技术全部采用人工的方式,其特点是使用竹子或钢筋的骨架结构,在其上面覆上保温塑料膜,如此一来,便就形成了一个密闭的温室空间。

基于STM32的防长者走失智能报警系统

基于STM32的防长者走失智能报警系统

基于STM32的防长者走失智能报警系统文昊翔罗欢摘要:该文设计了一款基于stm32的防长者走失追踪报警系统。

系统主要实现自动报警与长者定位功能,系统主要包含发射机和接收机两部分并且以STM32F103ZET6为核心控制器。

其中,发射机控制NEO-6M-0-001 GPS定位芯片和SIM900A芯片以获取目标的位置信息,然后向指定号码发送短信以实现报警功能作用,最后通过NRF24L01将定位数据发射到接收机。

接收机接到定位信息后,通过串口将信息上传至电脑以实现地图上定位。

经测试表明系统稳定性强,使用方便,具有较大的应用前景。

关键词:stm32;防长者走失;GPS;自动报警中图分类号:TP273 文献标识码:A 文章编号:1009-3044(2018)04-0170-03The Alarm System for Lost Elderly based on STM32WEN Hao-xiang, LUO Huan(Institute of Physics and Mechanical & Electrical Engineering, Shaoguan University,Shaoguan 512005, China)Abstract:An alarm system for lost elderly based on STM32 is proposed in this paper. The system is used to locate the elderly and send a warning. The system mainly has two components, a transmitter and a receiver. The two components are controlled by a microcontroller STM32F103ZET6. The transmitter locates objections with a location module NEO-6M-0-001 and a GSM module SIM900A, and then sends this location information as well as a warning message to a certain mobile phone. At the same time, the transmitter also sends the location information to the receiver with NRF24L01. After the receiver receives the data from the transmitter by NRF24L01, it sends the location data to PC with the serial port and locates the target on the map in PC screen. The experimental results indicate that the proposed system has great prospects for its strong stability and easy controllability.Key words:stm32; anti-elderly lost; GPS; H.264; automatic alarm1 概述目前,老人走失的事件常见诸报端,因此追踪定位产品诸如防长者走失报警系统正为社会所需。

基于STM32和nRF24l01的智能车无线监控平台设计

基于STM32和nRF24l01的智能车无线监控平台设计

基于STM32和nRF24l01的智能车无线监控平台设计作者:赫玉莹来源:《科技创新导报》 2014年第13期赫玉莹(中南大学信息科学与工程学院湖南长沙 410083)摘要:在飞思卡尔智能车竞赛的基础上,设计了基于STM32和nrf24l01的智能车监控平台,可实现无线数据接收、远程遥控,触屏控制,具备可靠性、灵活性、便捷性,方便智能车的调试。

该文针对其主要功能模块详细介绍了其实现方法和软件设计流程。

关键词:STM32 nRF24l01 无线通信监控中图分类号:TN92文献标识码:A 文章编号:1674-098X(2014)05(a)-0074-01在进行智能车的开发和调试过程中,需要不断地验证程序和算法的有效性,从而调节智能车的各项参数。

大多数参赛队员都是采用和电脑相连接的方法进行调试,这种方法一是无法显示车辆高速行驶过程中的实时状况,二是调试监控十分不便,因此,开发一种上位机进行无线监视和控制成为一种必然趋势和选择。

目前比较成熟的短距离无线传输网络的技术有:蓝牙、wifi、超带宽技术、Zigbee技术等,但是上述技术开发起来较为复杂,开发周期较长、成本较高[1]。

因此,本设计选用stm32和nRF24l01进行模块开发,并能很好地实现相应功能。

1 系统的结构设计本设计采用nRF24l01以无线通信方式与附近的其他模块或系统进行数据交换,其基本原理如图1所示。

XS128单片机采集智能车参数,如传感器数据信息、舵机打角、行驶速度等。

然后将信息传输到车载nrf24l01中,以人为设置的固定匹配波特率发送出去,在这一端,将以相同的波特率进行接收。

同时,采用stm32上的配套触摸液晶屏可进行实时显示。

通过对传输的数据进行分析,可根据预想情况进行控制,通过触摸屏和机械按键的结合,可更改设置参数并控制小车的启动和运行状况。

2 系统实现分析STM32通过SPI与外部MCU通信,最大SPI速度可以达到10MHz。

基于STM32F103ZET6的无线语音控制小车设计与实现

基于STM32F103ZET6的无线语音控制小车设计与实现

基于STM32F103ZET6的无线语音控制小车设计与实现作者:王芷郁王善伟曾胜艳来源:《电脑知识与技术》2018年第12期摘要:本文以STM32F103ZET6单片机作为控制核心,通过LD3320语音识别模块识别用户通过麦克风输入的语音指令,通过nRF2401无线模块实现遥控器与小车间的无线通信,小车收到动作指令后,通过单片机控制小车底部电机动作实现前进、后退、左转、右转灯操作。

采用C语言进行编程,进行语音的识别,以及模块间的通信与控制。

最终测试结果表明:系统能够识别使用者的语音命令并通过无线传输指令来控制智能小车的运行。

关键词:STM32F103ZET6;语音识别;智能小车中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)12-0197-03Abstract: This paper takes STM32F103ZET6 microcontroller as control core, through the LD3320 speech recognition module user input through a microphone voice commands, wireless communication and remote control car through the nRF2401 wireless module, the car received instruction, through the MCU to control the car bottom motor realize forward and backward,turning left and right lamp operation. C language is used to program, speech recognition, and communication and control between modules. The final test results show that the system can identify the user's voice command and control the operation of the smart car through the wireless transmission instruction.Key words: STM32F103ZET6; Speech recognition; intelligent car1 引言语音识别以语音为研究对象,这是语音信号处理的一个重要研究方向语音识别语音,模式识别是一个涉及许多领域生理学,心理学,语言学,计算机科学,信号处理,其最终目的是人与机器进行自然语言通信,用语言操作电脑[1]。

智能儿童视力测试仪

智能儿童视力测试仪

智能儿童视力测试仪作者:吴家耿林剑萍余振超来源:《数字技术与应用》2018年第01期摘要:为方便家长定期、自主检测儿童视力,实现儿童眼疾早期发现、早期预防和治疗,以STM32F103ZET6作为主控制器,结合TFT真彩屏、NRF24L01无线传输模块、LD3320语音模块,设计了一智能儿童视力测试仪。

该测试仪可通过按键或语音输入来判断屏幕上闪出的视标开口方向,以达到测试的目的。

测试结果通过串口传至上位机进行存储、打印,以便对视力变化情况进行查询、分析。

同时,测试过程还可以以答题的方式进行,具有一定的趣味性。

通过测试验证,该测试仪使用方便、测试准确,在一定程度上可以起到预防近视的作用。

关键词:视力测试仪;STM32;NRF24L01;LD3320中图分类号:R197.39 文献标识码:A 文章编号:1007-9416(2018)01-0157-021 引言目前我们采用的主要是国标标准视力表和缪天容创立的对数视力表[1]。

此种测试方法所需要的设备比较简单,容易操作,但受光线、指示棒干扰,测试质量较差。

后期逐渐出现利用红外原理进行屈光度的检查,并且可以自动的显示,度数也可打印出来[2]。

这种方式大大的提高了效率,操作简单,速度快,但是检查的准确性确是受大众争议的一点。

后期市场上又逐步出现了视网膜电图、人眼相差干涉仪、自动验光仪法等产品,这几种方法要么价格昂贵,要么操作不方便,要么只针对于小众群体,不具有推广性。

针对这种状况,设计了一款集便利性、趣味性、准确性为一体的视力测试仪,解决了目前儿童视力测试上的缺陷,在一定程度上可以起到预防近视的作用,达到保护眼睛的效果。

2 系统硬件设计本设计是采用STM32F103ZET6作为主控制器,NRF24L01无线传输模块来实现遥控操作,测试结果在显示屏上显示,并通过语音模块进行播报,同时可通过串口传至上位机进行打印或存储以供查询。

系统总体框图如图1所示。

2.1 主控模块STM32F103ZET6是一款基于ARM的微型控制器,最高工作频率是72MHz。

基于stm32f103zet6之使用FSMC驱动TFT的学习

基于stm32f103zet6之使用FSMC驱动TFT的学习

基于stm32f103zet6之使用FSMC驱动TFT的学习【转自】在完成IO驱动彩屏的试验后,就准备着手使用FSMC来驱动彩屏,先了解一下预备知识一、所谓的FSMC机制简单介绍FSMC在这篇博文里面很清楚,推荐一下/king_bingge/article/details/8718566然后还有就是这篇学习笔记,也还行/hduxyc/archive/2011/05/17/2048099.html个人觉得有了这两篇博文再加上我们的参考手册足够搞定FSMC驱动彩屏了二、FSMC之我见开始只是谈到别人对FSMC的理解,注意这里只讨论FSMC控制TFT,也就是在FSMC的NOR\PSRAM模式控制LCD,所以我们以下的分析都是基于这种模式的。

1、我们之前通过使用GPIO来模拟8080/6800时序从而达到驱动彩屏的,同样需要明白的一点就是我们也只是使用FSMC来模拟8080/6800时序,只不过这个读写速度有些快(使用了总线嘛),仅此而已!如果不明白8080/6800时序是怎样的或许在这个文库里面能找到你想要的/view/a8c98600cc1755270722083e.html简单一点就是:8080是通过“读使能(RE)”和“写使能(WE)”两条控制线进行读写操作。

6800是通过“总使能(E)”和“读写选择(W/R)”两条控制线进行2、那么了解到FSMC的三总线如下!数据线:这个可以分为8位的和16位,这个不难理解,就是之指一次穿上红8位还是16位数据,我的是16位的,8位的有一个懒得用。

地址线:既然我们访问的外NOR FLASH,那么一定会有相应的地址线,那么这些地址线在哪里呢?肯定是通过GPIO引脚复用的。

有A0 -- A23 24根,能够控制访问16M的空间,也就是一个子bank;控制总线:它的控制总线只有三根:读使能信号,写使能信号,片选信号。

所以这里和我们8080时序相比,少了复位信号线和数据/命令控制线,怎么办?继续看!3、了解了FSMC会有这三总线的概念,那么接下来就是如何转化为我们需要的时序了。

基于nRF24L01的嵌入式无线下载系统设计

基于nRF24L01的嵌入式无线下载系统设计

No1Feb第1期(总第224期)2021 年2 月机 械 工 程 与 自 动 化MECHANICAL ENGINEERING & AUTOMATION文章编号=672-6413(2021)01-0060-03基于nRF24L01的嵌入式无线下载系统设计櫜陈聪(江苏航空职业技术学院,江苏镇江212132)摘要:无线数据传输和控制系统解决了有线数据传输和控制系统在特殊现场条件下无法实现或难以做到的问题,例如系统的应用程序更新。

设计了一种基于nRF24L01模块的无线数据传输技术进行STM32处理器应用程序下载更新的系统,并详细介绍了该系统的设计方案。

该系统利用上位机将需更新的程序下载到主机中,主机通过nRF24L01无线通信模块更新多个从机的程序,从而可以实现特殊场合的从机程序更新,大大节省了人力。

关键词:nRF24L01;无线下载系统;设计中图分类号: TP273 文献标识码: A0引言本文主要研究利用无线数据传输技术进行嵌入式 应用程序下载更新。

系统的设计立足于企业实际生产 测试需求,与企业生产的产品测试对接的硬件测试设 备无需人工进行嵌入式程序下载更新,直接利用无线 通信技术将最新设计的测试程序传输给相应的测试设 备。

该技术不仅可以大大节约人力、缩短测试时间,同 时还可以应用于一些特殊生产测试车间,例如无尘车 间及对静电放电敏感产品的测试车间等。

本设计采用 的无线通信模块为工作在2. 4 GHz 的无线收发模块 nRF24L01,该模块采用欧洲顶尖RF 公司设计的无线 芯片,除具有成本低、体积小、产品稳定等特点外,还具 有最大10 dBm 的发射功率、7 mA 的接收电流以及 — 115 dBm 的接收灵敏度,经测试最大距离可达 500 m,远超同类型的2. 4 GHz 无线模块。

1下载系统总体设计系统的总体设计思路是设计一块以STM32为主 芯片的主机(程序下载板),先利用电脑端生成需更新 程序的bn 文件,接着电脑端通过UART 串口将bn 文件发送至主机的STM32 Flash 中存储;更新从机 (客户板)程序时,主机从Flash 中读取bn 文件,并利 用2. 4 GHz 无线通信模块nRF24L01将数据发送到 从机STM32 Flash 中实现程序更新。

STM32F103ZET6驱动NRF24L01

STM32F103ZET6驱动NRF24L01
STM32 驱动无线模块,已调好可用
#include "bsp.h"
u8 TX_ADDRESS[TX_ADR_WIDTH]={0x02,0x02,0x02,0x02,0x02}; //发送地址
u8 RX_ADDRESS[RX_ADR_WIDTH]={0x02,0x02,0x02,0x02,0x02}; //发送地址
NRF24L01_Read_Buf(TX_ADDR,buf,5);
//读出写入的地址
for(i=0;i<5;i++)
//检测读到的数据是否正确
{
if(buf[i]!=0XF0)
break;
}
if(i!=5) return 1;//检测 NRF24L01 失败
return 0;
//检测 NRF24L01 成功
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //MOSI -- PB15 SCK -- PB13
//PB13 -- SPI2_CK PB14 -- SPI2_MOSI PB15 -- SPI2_MISO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);
函数:SPI_Read_Buf()
描述:从 reg 寄存器读出 bytes 个字节,通常用来读取接收通道数据或接收/发送地址
******************************************************************************* */
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/**************************************************** 函数名:SPI 初始化 形参: 返回值: 函数功能:写使能 ****************************************************/ void SPI2_Config(void) {
描述:这个函数设置 nRF24L01 为接收模式,等待接收发送设备的数据包
u8 status; CS_LOW(); // CSN 置低,开始传输数据 SPI2_ReadWriteByte(reg); // 选择寄存器 status=SPI2_ReadWriteByte(0); // 然后从该寄存器读数 CS_HIGH(); // CSN 拉高,结束数据传输
return (status); // 返回寄存器数据 } /****************************************************************************** **
timeout=0;
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == RESET);
{
timeout++;
if(timeout>500)return 0;
}
return SPI_I2S_ReceiveData(SPI2);
}
/************************************************** 函数:SPI_RW_REG()
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //MOSI -- PB15 SCK -- PB13
//PB13 -- SPI2_CK PB14 -- SPI2_MOSI PB15 -- SPI2_MISO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; 分频值为 4
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2,ENABLE);
u8 status,i; CS_LOW(); // CSN 置低,开始传输数据 status = SPI2_ReadWriteByte(reg); // 选择寄存器,同时返回状态字 for(i=0; i<bytes; i++) {
pBuf[i]=SPI2_ReadWriteByte(0); // 逐个字节从 nRF24L01 读出 }
u8 SPI2_ReadWriteByte(u8 data)
{
u32 timeout=0;
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == RESET);
{
timeout++;
if(timeout>500)return 0;
}
SPI_I2S_SendData(SPI2,data);
STM32 驱动无线模块,已调好可用
#include "bsp.h"
u8 TX_ADDRESS[TX_ADR_WIDTH]={0x02,0x02,0x02,0x02,[RX_ADR_WIDTH]={0x02,0x02,0x02,0x02,0x02}; //发送地址
//PG6 -- CE PG7 -- CS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //PG6 7 推挽 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定 IO //IRQ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOG, &GPIO_InitStructure);
SPI2_ReadWriteByte(*pBuf++); // 逐个字节写入 nRF24L01
} CS_HIGH(); // CSN 拉高,结束数据传输 return(status); // 返回状态寄存器
} /****************************************************************************** *
//SPI 主机模
//数据 8 位 //CPOL -
//CPHA - 0 //NSS 信号软
// 波 特 率 预
// 数 据 传 输 从
//CRC 值
CE_LOW();//待机 CS_HIGH(); } /**************************************************** 函数名:NRF24L01 初始化 形参: 返回值: 函数功能:写使能 ****************************************************/
CS_HIGH(); // CSN 拉高,结束数据传输 return(status); // 返回状态寄存器 } /****************************************************************************** **
函数:RX_Mode()
函数:NRF24L01_Read_Reg(BYTE reg)
描述:从 reg 寄存器读一字节
******************************************************************************* */
u8 NRF24L01_Read_Reg(u8 reg) {
函数:SPI_Read_Buf()
描述:从 reg 寄存器读出 bytes 个字节,通常用来读取接收通道数据或接收/发送地址
******************************************************************************* */
u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 bytes) {
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_Init(GPIOB, &GPIO_InitStructure);
//SPI 协议的初始化
/****************************************************
函数名:NRF24L01_Check
形参:无
返回值:0 -- 成功 1 -- 失败
函数功能:检测 24L01 是否存在
****************************************************/
描述: 根据 SPI 协议,写一字节数据到 nRF24L01,同时从 nRF24L01 读出一字节
**************************************************/ u8 NRF24L01_Write_Reg(u8 reg, u8 value) {
u8 status; CS_LOW(); // CSN 置低,开始传输数据 status = SPI2_ReadWriteByte(reg); // 选择寄存器,同时返回状态字 SPI2_ReadWriteByte(value); // 然后写数据到该寄存器
}
/****************************************************
函数名:SPI2_Send_Receive_Byte
形参: data -- 给 FLASH 发送的数据
返回值:flash 返回的数据
函数功能:给 FLASH 发送数据和读取数据
****************************************************/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//SPI2 设置为双线
全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; 0 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 件控制
CS_HIGH(); // CSN 拉高,结束数据传输 return(status); // 返回 }
相关文档
最新文档