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. unity疯狂牧场完整项目源码 - Frenzy Farming time management game kit V1.0

    You will love this game kit! Have you ever wondered what it would be like to run your own farm? Look ...

  2. shared_ptr 引用计数

    https://zh.cppreference.com/w/cpp/memory/shared_ptr 引用计数

  3. python 设计模式之桥接模式 Bridge Pattern

    #写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...

  4. 各类型变量所占字节数,sizeof()

    与操作系统位数和编译器都有关. 可用sizeof()得到,当前主流编译器一般是32位或64位. 类型       16位       32位 64位 char 1            1 1 sho ...

  5. redis删除多个键

    DEL命令的参数不支持通配符,但我们可以结合Linux的管道和xargs命令自己实现删除所有符合规则的键.比如要删除所有以“user:”开头的键,就可以执行redis-cli KEYS "u ...

  6. Linux 服务器远程管理

    一.Linux 常用远程管理工具 点击下载 二.查看服务器 ip 地址命令 1.通过 ip addr 查看网卡 ip 地址 ip addr 2.通过 ifconfig 查看网卡 ip 地址 最小化安装 ...

  7. Nginx之https配置 - 运维笔记 (http->https强转)

    一.Nginx安装(略)安装的时候需要注意加上 --with-http_ssl_module,因为http_ssl_module不属于Nginx的基本模块.Nginx安装方法: # ./configu ...

  8. 安卓 android studio 报错 Could not find com.android.tools.build:gradle:3.2.1.

    报错截图如下: 解决方法:在project的builde.gradle做如下操作分别加上google()

  9. 123457123456#1#----com.ppGame.BaoBaoiMiYu35--前拼后广--miyu_pp

    com.ppGame.BaoBaoiMiYu35--前拼后广--miyu_pp

  10. 纯java代码对音频采样率进行转换

    转换成16KHz采样率(含文件头) void reSamplingAndSave(byte[] data) throws IOException, UnsupportedAudioFileExcept ...