STM32+NRF24L01无线

发布者:幸福之舞最新更新时间:2016-05-27 来源: eefocus关键字:STM32  NRF24L01 手机看文章 扫描二维码
随时随地手机看文章
硬件SPI和模拟SPI源码:

nrf24发送(模拟SPI)BHS-STM32.rar

nrf24接收(模拟SPI)BHS-STM32.rar

nrf24发送(硬件SPI)BHS-STM32.rar

nrf24接收(硬件SPI)BHS-STM32.rar

NRF24L01资料

NRF24.rar

 

部分代码:

#define TX_PLOAD_WIDTH  20   // 20 uints TX payload 

u8 TxBuf[32]={0}; 


#define  CE_POUT   PB1 
#define  CSN_POUT  PB0 

#define CE_H()   {CE_POUT=1;} 
#define CE_L()   {CE_POUT=0;} 
#define CSN_H()  {CSN_POUT=1;} 
#define CSN_L()  {CSN_POUT=0;} 

///*********************************************NRF24L01************************************* 
#define TX_ADR_WIDTH    5    // 5 uints TX address width 
#define RX_ADR_WIDTH    5    // 5 uints RX address width 

#define RX_PLOAD_WIDTH  20   // 20 uints TX payload 
u8  TX_ADDRESS[TX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7}; //本地地址 
u8  RX_ADDRESS[RX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7}; //接收地址 
///***************************************NRF24L01寄存器指令******************************************************* 
#define READ_REG        0x00   // 读寄存器指令 
#define WRITE_REG       0x20  // 写寄存器指令 
#define RD_RX_PLOAD     0x61   // 读取接收数据指令 
#define WR_TX_PLOAD     0xA0   // 写待发数据指令 
#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令 
#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令 
#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令 
#define NOP             0xFF   // 保留 
///*************************************SPI(nRF24L01)寄存器地址**************************************************** 
#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式 
#define EN_AA           0x01  // 自动应答功能设置 
#define EN_RXADDR       0x02  // 可用信道设置 
#define SETUP_AW        0x03  // 收发地址宽度设置 
#define SETUP_RETR      0x04  // 自动重发功能设置 
#define RF_CH           0x05  // 工作频率设置 
#define RF_SETUP        0x06  // 发射速率、功耗功能设置 
#define NRFRegSTATUS    0x07  // 状态寄存器 
#define OBSERVE_TX      0x08  // 发送监测功能 
#define CD              0x09  // 地址检测            
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址 
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址 
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址 
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址 
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址 
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址 
#define TX_ADDR         0x10  // 发送地址寄存器 
#define RX_PW_P0        0x11  // 接收频道0接收数据长度 
#define RX_PW_P1        0x12  // 接收频道1接收数据长度 
#define RX_PW_P2        0x13  // 接收频道2接收数据长度 
#define RX_PW_P3        0x14  // 接收频道3接收数据长度 
#define RX_PW_P4        0x15  // 接收频道4接收数据长度 
#define RX_PW_P5        0x16  // 接收频道5接收数据长度 
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置 
///************************************************************************************** 

u8 SPI_WR_Reg(u8 reg, u8 value); 
u8 SPI_Read_Buf(u8 reg, u8 *pBuf, u8 Len); 
u8 SPI_Write_Buf(u8 reg, u8 *pBuf, u8 Len); 
u8 nRF24L01_RxPacket(unsigned char* rx_buf); 
void nRF24L01_TxPacket(unsigned char * tx_buf); 
u8 SPI_RD_Reg(u8 reg); 

#define NRF24SPI_Send_Byte   SPI_Send_Byte 

///****************************************************************************************** 
///*延时函数,非精确延时 
///******************************************************************************************/ 
void Delay_us(u32 n) 
{ 
u32 i; 

while(n--) 
{ 
     i=2; 
     while(i--); 
  } 
} 

///**************************************************************************************** 
///*NRF24L01初始化 
///***************************************************************************************/ 
void init_NRF24L01(void) 
{ 
 u8 buf[5]={0}; 
  
  Delay_us(100); 


  CE_L();    // chip enable 
  CSN_H();   // Spi disable  
   
  SPI_Read_Buf(TX_ADDR, buf, TX_ADR_WIDTH);//debug 测试原来的本地地址:复位值是:0xE7 0xE7 0xE7 0xE7 0xE7 
   
// SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址 
// SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 

// 
// SPI_WR_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动 ACK应答允许 
// SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21   
// SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 设置自动重发时间和次数:500us + 86us, 10 retrans... 
// SPI_WR_Reg(WRITE_REG + RF_CH, 22);        //   设置信道工作为2.4GHZ,收发必须一致 
// SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 
// SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x07);    //设置发射速率为1MHZ,发射功率为最大值0dB 
//   
//  SPI_RD_Reg(WRITE_REG + EN_AA); 
//  SPI_RD_Reg(WRITE_REG + EN_RXADDR); 
//  SPI_RD_Reg(WRITE_REG + RF_CH); 
//  SPI_RD_Reg(WRITE_REG + RX_PW_P0); 
//  SPI_RD_Reg(WRITE_REG + RF_SETUP); 
} 

///**************************************************************************************************** 
///*函数:uchar SPI_Read(u8 reg) 
///*功能:NRF24L01的SPI时序 
///****************************************************************************************************/ 
u8 SPI_RD_Reg(u8 reg) 
{ 
u8 reg_val; 

CSN_L();                // CSN low, initialize SPI communication... 
NRF24SPI_Send_Byte(reg);            // Select register to read from.. 
reg_val = NRF24SPI_Send_Byte(0);    // ..then read registervalue 
CSN_H();                // CSN high, terminate SPI communication 

return(reg_val);        // return register value 
} 

//****************************************************************************************************/ 
//*功能:NRF24L01读写寄存器函数 
//****************************************************************************************************/ 
u8 SPI_WR_Reg(u8 reg, u8 value) 
{ 
u8 status; 

CSN_L();                   // CSN low, init SPI transaction 
status = NRF24SPI_Send_Byte(reg);// select register 
NRF24SPI_Send_Byte(value);             // ..and write value to it.. 
CSN_H();                   // CSN high again 

return(status);            // return nRF24L01 status u8 
} 
///****************************************************************************************************/ 
//*函数:uint SPI_Read_Buf(u8 reg, u8 *pBuf, u8 Len) 
//*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数 
//****************************************************************************************************/ 
u8 SPI_Read_Buf(u8 reg, u8 *pBuf, u8 Len) 
{ 
uint status,i; 

CSN_L();                     // Set CSN low, init SPI tranaction 
status = NRF24SPI_Send_Byte(reg);        // Select register to write to and read status u8 

  for(i=0;i

 

关键字:STM32  NRF24L01 引用地址:STM32+NRF24L01无线

上一篇:基于STM32的Doxygen使用简明手册
下一篇:stm32 NRF24L01+USART搞定有线和无线通信

推荐阅读最新更新时间:2024-03-16 14:55

调试好的nRF24L01库文件 单片机源程序
单片机源程序如下: #include nRF24L01Drv.h #include USART.h #include stdio.h #include config.h #include intrins.h #include spi.h /** * 1.改多路方法: * NUM_USED_PIPE 改为使用的路数, RX_ADDRESS 分别指定 RX的地址, * RX_PLOAD_WIDTH 改为每一路的PAYLOAD * NRF24L01_RxPacket 里面知道是哪一路在接收 * * * 2. 发送时自动将CONFIG 备份,然后切换TX后再切换回去 * 并且备份RX_ADDR_P0 * * 3. 通道0,
[单片机]
STM32头文件STM32F10x.h和STM32F10x_lib.h区别
#include stm32f10x_lib.h 是ST公司V2.0的库函数使用的头文件,用MDK3.80A打开。但是,如果你用MDK4.7/MDK5打开,就没法找到了,这也就是为什么,我们老版本的例程,存在高版本的MDK编译的时候,报找不到stm32f10x_lib.h的错误的原因了。而stm32f10x_lib.h里面,经过分析,实际可以用:stm32f10x_map.h和stm32f10x_nvic.h来替代。 #include stm32f10x.h 是ST公司V3.5及以后版本统一使用的库函数头文件了,说白了就是把原来的stm32f10x_lib.h,换成了#include stm32f10x.h ,规范了代码,不需
[单片机]
stm32的PWM输入捕获模式
一、概念理解 PWM输入捕获模式是输入捕获模式的特例,自己理解如下 1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。 2. 同一个TIx输入映射了两个ICx信号。 3. 这两个ICx信号分别在相反的极性边沿有效。 4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。 5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获 一个PWM周期(即连续的两个上升沿或下降沿) ,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。 6. 同样另一个捕获通道捕获触发信号和下一个相反极
[单片机]
STM32的Code/RO/RW/ZI区、Flash/Ram的占用情况、堆栈大小的设置
以cortex-M3为例,例如STM32F103 这篇文章要讲2个问题: 1、编译出的程序(指令)、变量的存放位置、大小? 2、在代码和keil中,“堆、栈”两者的大小如何设置? keil编译完成后,会有提示,形如: Program Size: Code=1148 RO-data=424 RW-data=20 ZI-data=1636 其中: ① Code为代码,本质上就是一大堆ARM指令; ② RO为只读的数据,例如,char *name = TOM ;//TOM三个字符就存放在ROM中作为RO-DATA;又如,为了减小sin的计算量,把sin的各个值直接制作成表,const float sinVal =
[单片机]
<font color='red'>STM32</font>的Code/RO/RW/ZI区、Flash/Ram的占用情况、堆栈大小的设置
stm32: 固件库文件说明
关于固件库文件说明 固件库文件夹STM32F10x_StdPeriph_Lib_V3.5.0下文件说明: 一、Libraries文件夹主要文件有: 1、core_cm3.c , core_cm3.h :CMSIS核心文件,通过进入Cortex_M3内核的接口 2、startup文件夹下是系统启动文件,根据不同的芯片选用启动文件,103系列芯片选用startup_stm32f10x_hd.s 3、system_stm32f10x.c , system_stm32f10x.h :设置系统及总线时钟,其中SystemInit函数在系统启动时,设置时钟系统。 4、stm32f10x.h :系统寄存器定义、声明、内存操作。 二、P
[单片机]
STM32实现DAC输出的相关设置
STM32 DAC简介 大容量的STM32F103具有内部DAC,战舰STM32选择的是STM32F103ZET6属于大容量产品,所以是带有DAC模块的。 STM32的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。 STM32的DAC模块主要特点有: ① 2个DAC转换器:每个
[单片机]
<font color='red'>STM32</font>实现DAC输出的相关设置
STM32—PID控制在直流电机中的应用
一.PID控制算法 1.什么是PID PID:Proportion-Integral-Differential 在过程控制中,我们经常使用的一种算法就是PID算法了,所谓PID控制算法就是对偏差进行比例、积分、微分控制,来使偏差趋于某一固定的值,PID核心由三个单元组成:比例单元(P)、积分单元(I)、微分单元(D),PID实际上就是误差控制。 PID控制系统(模拟)的框图如下: 2.PID系数的理解 理解PID的三个系数,可以结合PID调节时候的响应曲线,要使实际中的响应曲线趋近于理想状态下的响应曲线,无非就是三点灵魂:快速(P)、准确(I)、稳定(D),要想控制的变量保持在完美的状态,这三个灵魂就必须调整好。
[单片机]
<font color='red'>STM32</font>—PID控制在直流电机中的应用
基于STM32的三相多功能电能表解决方案
   背景   电能表作为电能计量的基本设备,受到国家电力部门的长期重视,电能表生产企业更是不遗余力地寻求设计与开发性能俱佳且成本更低的解决方案。目前国内的电能表设计已经走过了由8位MCU向通用DSP甚至专用DSP的变革,通用DSP的应用方案的劣势在于DSP的专业应用和嵌入程度不够深的问题,成本偏高;而专用DSP功能相对固定,这样给电能表设计和生产厂家带来功能差异化空间不足的困难。基于ARM的方案也已经出现,但是适合应用的ARM7 TDMI在性能上不尽人意,同时外设资源不足;而更高端的ARM9系统的复杂程度很高,成本也较高。选择一颗合适且低成本的微处理器日益成为电能表行业的关键所在,直到意法半导体公司(STMicroelect
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved