1.NRF24L01模块的资料百度搜索一下就有很多。这里我就不做介绍本文主要侧重于应用层面实验介绍与分享。

2.先看下原理图。

根据原理图:写出NRF24L01  C语言驱动文件如下:

 #include "nrf1024spi.h"
#include "usart.h" u8 RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0xc3,0x10,0x10,0x25}; //地址 u8 TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0xc3,0x10,0x10,0x25}; //地址 u8 NRFMatched = ;
static uint8_t sta; uint8_t NRF24L01_RXDATA[RX_PLOAD_WIDTH];//nrf24l01 最大发送队列
uint8_t NRF24L01_TXDATA[RX_PLOAD_WIDTH];//nrf24l01 最大发送队列
//写寄存器
uint8_t NRF_Write_Reg(uint8_t reg, uint8_t value)
{
uint8_t status;
SPI_CSN_L();
status = SPI_RW(reg);
SPI_RW(value);
SPI_CSN_H();
return status;
} //读寄存器
uint8_t NRF_Read_Reg(uint8_t reg)
{
uint8_t reg_val;
SPI_CSN_L();
SPI_RW(reg);
reg_val = SPI_RW();
SPI_CSN_H(); return reg_val;
}
//接收模式
void SetRX_Mode(void)
{
SPI_CE_L();
NRF_Write_Reg(FLUSH_RX,0xff);
NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH);//
NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);
NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);
NRF_Write_Reg(NRF_WRITE_REG+RF_CH,);
NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//
NRF_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//
SPI_CE_H(); } //发送模式
void SetTX_Mode(void)
{
SPI_CE_L();
NRF_Write_Reg(FLUSH_TX,0xff);
NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);
NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);
NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);
NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);
NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);
NRF_Write_Reg(NRF_WRITE_REG+RF_CH,);
NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);
NRF_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);
SPI_CE_H(); }
//SPI连接检测
char NRF_check(void)
{ u8 buf[]={0xC1,0xC2,0xC3,0xC4,0xC5};
u8 buf1[]={};
u8 i=; NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,);
NRF_Read_Buf(TX_ADDR,buf1,); for (i=;i<;i++)
{
if (buf1[i]!=0xC1+i)
break;
} if (i==)
{ printf("NRF24L01 found...\r\n");
return ; }
else
{
printf("NRF24L01 check failed...\r\n");
return ;
} } //写缓存
uint8_t NRF_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars)
{
uint8_t i;
uint8_t status;
// SPI_CE_L();
SPI_CSN_L();
status = SPI_RW(reg);
for(i=; i<uchars; i++)
{
SPI_RW(pBuf[i]);
} SPI_CSN_H();
return status;
}
//读缓存
uint8_t NRF_Read_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars)
{
uint8_t i;
uint8_t status;
//SPI_CE_L();
SPI_CSN_L();
status = SPI_RW(reg);
for(i=; i<uchars; i++)
{
pBuf[i] = SPI_RW();
}
SPI_CSN_H();
return status;
} u8 SPI_RW(u8 dat)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, dat);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
} //NRF24L01 引脚初始化
void nfr1024initspi(void)
{ SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //SCK MISO MOSI
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure); //ce pa12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure); //NRF_CSN--PA4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure); //nrf irq
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_4); //SPI_CSN_H(); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //
SPI_InitStructure.SPI_CRCPolynomial = ;
SPI_Init(SPI1, &SPI_InitStructure);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE); }
//读包
u8 NRF24L01_RxPacket_2s(void)
{
uint8_t sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
if(sta & (<<RX_DR))
{
NRF_Read_Buf(RD_RX_PLOAD,NRF24L01_RXDATA,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
//ReceiveDataFormNRF();
NRF_Write_Reg(0x27, sta);
printf("get ===>: %s \r\n",NRF24L01_RXDATA);
sta = ;
return ; }else
{
return ;
} }
//读包
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta;
//SPI2_SetSpeed(SPI_SPEED_4);
sta=NRF_Read_Reg(NRFRegSTATUS);
NRF_Write_Reg(NRF_WRITE_REG+NRFRegSTATUS,sta);
if(sta&RX_OK)
{
NRF_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);
NRF_Write_Reg(FLUSH_RX,0xff);
return ;
}
return ;
}
//发包
u8 NRF24L01_TxPacket(u8 *txbuf)
{ u8 sta;
//SPI1_SetSpeed(SPI_SPEED_8);//
SPI_CE_L();//NRF24L01_CE=0;
NRF_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//
SPI_CE_H();//NRF24L01_CE=1;//
while(NRF24L01_IRQ!=);//
sta=NRF_Read_Reg(NRFRegSTATUS); //
NRF_Write_Reg(NRF_WRITE_REG+NRFRegSTATUS,sta); //
if(sta&MAX_TX)//
{
NRF_Write_Reg(FLUSH_TX,0xff);//
printf("NRF24L01 send max \r\n");
return MAX_TX;
}
if(sta&TX_OK)//
{
printf("NRF24L01 send ok \r\n");
return TX_OK;
}
printf("NRF24L01 send fail \r\n");
return 0xff;//
}
//匹配
void NRFmatching(void)
{
static uint32_t nTs,nT;
static uint32_t writeOvertime = * ;// unit :us do
{
NRFMatched = ;
printf("RX_ADDRESS[4] is %d \r\n",RX_ADDRESS[]);
SetRX_Mode(); // reset RX mode write RX panel address
delay_ms(); // delay is needed after reset NRF
sta = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
printf("NRFmatching read reg staus %d \r\n",sta);
if((sta & 0x0E )== 0x00)
{
printf("match 1 \r\n");
NRFMatched = ; }else
{
printf("match 0 \r\n");
RX_ADDRESS[] ++; //search the next RX_ADDRESS
if(RX_ADDRESS[] == 0xff )
{
RX_ADDRESS[] = 0x00;
}
} }while((sta & 0x0E )== 0x0E); SetRX_Mode(); // reset RX mode }

C文件

 #ifndef __nrf1024spi
#define __nrf1024spi
#include "stm32f10x_it.h"
#include "stm32f10x.h" //*********************************************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 32 // 32 uints TX payload
#define TX_PLOAD_WIDTH 32 // 32 uints TX payload
//***************************************NRF24L01?????*******************************************************
#define NRF_READ_REG 0x00
#define NRF_WRITE_REG 0x20
#define RD_RX_PLOAD 0x61
#define WR_TX_PLOAD 0xA0
#define FLUSH_TX 0xE1
#define FLUSH_RX 0xE2
#define REUSE_TX_PL 0xE3
#define NOP 0xFF
//*************************************SPI(nRF24L01)?????****************************************************
#define CONFIG 0x00 //
#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 //
#define RX_ADDR_P1 0x0B //
#define RX_ADDR_P2 0x0C //
#define RX_ADDR_P3 0x0D //
#define RX_ADDR_P4 0x0E //
#define RX_ADDR_P5 0x0F //
#define TX_ADDR 0x10 //
#define RX_PW_P0 0x11 //
#define RX_PW_P1 0x12 //
#define RX_PW_P2 0x13 //
#define RX_PW_P3 0x14 //
#define RX_PW_P4 0x15 //
#define RX_PW_P5 0x16 //
#define FIFO_STATUS 0x17 //
//**************************************************************************************
#define RX_DR 6 //
#define TX_DS 5 //
#define MAX_RT 4 #define MAX_TX 0x10
#define TX_OK 0x20
#define RX_OK 0x40 #define SPI_CE_H() GPIO_SetBits(GPIOA, GPIO_Pin_12)
#define SPI_CE_L() GPIO_ResetBits(GPIOA, GPIO_Pin_12) #define SPI_CSN_H() GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define SPI_CSN_L() GPIO_ResetBits(GPIOA, GPIO_Pin_4) #define NRF24L01_IRQ PAin(15) //IRQ
void nfr1024initspi(void); uint8_t NRF_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars); uint8_t NRF_Read_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars); u8 SPI_RW(u8 dat); void NRFmatching(void);
u8 Nrf_Irq(void);
void SetRX_Mode(void); uint8_t NRF_Write_Reg(uint8_t reg, uint8_t value); uint8_t NRF_Read_Reg(uint8_t reg); #endif

h文件

接收机Main 入口

         int main(void)
{ u8 redata[];
Stm32_Clock_Init();
delay_init();
uart_init(,);
nfr1024initspi();
NRF_check();
SetRX_Mode(); while()
{
printf("V2019-9-6 \r\n");
delay_ms();
if(!NRF24L01_RxPacket(redata))
{
printf("%s \r\n",redata);
} }
return ;
}

Main

发送机Main入口

 int main(void)
{
static char ledsta;
u8 a,b;
u8 redata[];
SystemClock_HSI(); //系统时钟初始化,时钟源内部HSI
SysTick_Config(SystemCoreClock / ); //SysTick开启系统tick定时器并初始化其中断,1ms
UART1_init(SysClock,uart1baudSet); //串口1初始化 delay_ms();
NRF24L01_INIT(); //NRF24L01初始化
SetTX_Mode(); //设无线模块为发送模式 while ()
{
printf("V2019-9-6 \r\n");
delay_ms();
for(a =;a<;a++)
{
redata[a] = 0x31 +a;
}
redata[]= '\0';
NRF24L01_TxPacket(redata);
printf("sent string %s \r\n",redata);
}
return ; }

发送机Main入口

看下 串口打印调试的效果

STM32F103芯片SPI控制NRF24L012.4G无线模块交互通信实验的更多相关文章

  1. 2.4G无线模块NRF2401

    RF24L01+,是工作在2.4~2.5GHz 频段的,具备自动重发功能,6 个数据传输通道,最大无线传输速率为2Mbits.MCU 可与该芯片通过SPI 接口访问芯片的寄存器进行配置,达到控制模块. ...

  2. 联发科Mediatek工业路由芯片上网稳定低功耗的Router模块WiFi中继——无线AP定制方案

    Router模块又名路由器模块,是指将路由器的接口类型及部分扩展功能是可以根据实际需求来进行无线接入服务,允许其他无线设备接入,通过局域无线端或联网远程端,进行数据访问,对无线设备进行远程控制.常见的 ...

  3. STC8H开发(五): SPI驱动nRF24L01无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  4. 51单片机对无线模块nRF24L01简单的控制收发程序

    它的一些物理特性如工作频段.供电电压.数据传输速率就不详细介绍了,直接上代码. 1.首先是发送端: // Define SPI pins #include <reg51.h> #defin ...

  5. CC1101 433无线模块,STM8串口透传

    CC1101 433无线模块,STM8串口透传   原理图:http://download.csdn.net/detail/cp1300/7496509 下面是STM8程序 CC1101.C /*** ...

  6. STC8H开发(十五): GPIO驱动Ci24R1无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  7. STC8H开发(十六): GPIO驱动XL2400无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  8. nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)

    俗话说:每个人一生下来什么都会的,都是通过自己努力和探索出来的,NRF系列芯片,刚开始都好奇心加兴趣才来捣鼓它的,刚开始做硬件和软件,没有收发数据弄得整个人头都快炸开了,所以在此和大家分享一下前辈的经 ...

  9. 4G DTU模块的功能和作用是什么

    4G DTU模块我们可以简单将它理解为使用4G无线通信网络来进行远距离无线传送的终端设备.4G DTU模块基于4G方式进行远距离的数据传输,是专门用于将串口数据转换为IP数据或将IP数据转换为串口数据 ...

随机推荐

  1. mysql5.6源码部署

    一.准备环境 环境:centos-7.3 一台软件版本:mysql-5.6.39 1.安装依赖yum -y install autoconf libaio bison ncurses-devel 2. ...

  2. 单一职责原则(SRP)

    内聚性:一个模块的组成元素之间的功能相关性.就一个类而言,应该仅有一个引起它变化的原因.当需求变化时,该变化会反映为类的职责的变化,如果一个类承担了多于一个的职责,那么引起它变化的原因就会有多个.如果 ...

  3. python 通过下载包setup.py安装模块

    下载安装包,并解压到相应的位置 1.打开cmd 2.到达安装目录 3.python setup.py build 4.python setup.py install

  4. 项目管理工具_maven的配置

    <parent> <groupId>cn.itcast.maven</groupId> <artifactId>Parent</artifactI ...

  5. T-MAX-冲刺总结

    T-MAX-冲刺总结 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 T-MAX 这个作业的目标 冲刺总结 作业的正文 T-MAX-冲刺总结 其他参考文献 面向B站,百度 ...

  6. k8s 配置文件 详解

    apiVersion: v1 # [必须]版本号kind: Pod # [必选]Podmetadata: # [必选-Object]元数据 name: String # [必选] Pod的名称 nam ...

  7. Windowless

    参考: 浏览器插件(Plugins)开发 - II http://wen-bing.github.io/blog/2013-04-24/NPAPI-plugin-intro-2/ 无窗口型(Windo ...

  8. JVM常量的含义与反编译助记符详解

    1.定义一个常量 public class MyTest2 { public static void main(String[] args) { System.out.println(MyParent ...

  9. 000 centos7下安装elasticsearch7的单节点安装

    在这里,直接使用最新的包进行学习.这里的安装也以前的版本不同,不过因为学习,这部分安装的区别不具体研究了. 这里也是摸索型的记录,所以会出现报错情况,然后针对这种方式进行解决,最后达到安装完成的效果. ...

  10. 微信jaapi签名

    public WeiXinJsSignature(string weixinUrl) { //string url = ConfigurationManager.AppSettings["U ...