【STM32】STM32F103C8T6+nrf24l01收发示例


  • 项目基于Hal库开发
  • 项目架构

接收端24l01.c代码,SPI引脚定义在初始化函数中

#include "24l01.h"
#include "spi.h"const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x02};
//SPI对接nrf24l01的4个函数//SPI写寄存器
//reg:指定寄存器地址
//value:写入的值
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{u8 status; NRF24L01_CSN=0;                 //使能SPI传输status =SPI1_ReadWriteByte(reg);//发送寄存器号 SPI1_ReadWriteByte(value);      //写入寄存器的值NRF24L01_CSN=1;                 //禁止SPI传输    return(status);                  //返回状态值
}//读取SPI寄存器值
//reg:要读的寄存器
u8 NRF24L01_Read_Reg(u8 reg)
{u8 reg_val;        NRF24L01_CSN = 0;          //使能SPI传输       SPI1_ReadWriteByte(reg);   //发送寄存器号reg_val=SPI1_ReadWriteByte(0XFF);//读取寄存器内容NRF24L01_CSN = 1;          //禁止SPI传输         return(reg_val);           //返回状态值
}   //在指定位置读出指定长度的数据
//reg:寄存器(位置)
//*pBuf:数据指针
//len:数据长度
//返回值,此次读到的状态寄存器值
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{u8 status,u8_ctr;         NRF24L01_CSN = 0;           //使能SPI传输status=SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值       for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI1_ReadWriteByte(0XFF);//读出数据NRF24L01_CSN=1;       //关闭SPI传输return status;        //返回读到的状态值
}//在指定位置写指定长度的数据
//reg:寄存器(位置)
//*pBuf:数据指针
//len:数据长度
//返回值,此次读到的状态寄存器值
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{u8 status,u8_ctr;      NRF24L01_CSN = 0;          //使能SPI传输status = SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI1_ReadWriteByte(*pBuf++); //写入数据     NRF24L01_CSN = 1;       //关闭SPI传输return status;          //返回读到的状态值
}
//初始化24L01的IO口
void NRF24L01_IO_Init(void)
{   GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;            //PB0-CE  PB1-CSN  PA4-IRQRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;  //PF8 9 推挽 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化指定IOGPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1);//PF0 1下拉RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA4 输入  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_4);//PA4下拉SPI1_Init();          //初始化SPI     SPI_Cmd(SPI1, DISABLE); // SPI外设不使能SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //SPI设置为双线双向全双工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_16;        //定义波特率预分频的值:波特率预分频值为16SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  //数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;  //CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器SPI_Cmd(SPI1, ENABLE); //使能SPI外设SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)NRF24L01_CE=0;             //使能24L01NRF24L01_CSN=1;           //SPI片选取消
}//下面固定不变,只需要实现上面的5个函数
void NRF24L01_Init(void)
{NRF24L01_IO_Init();NRF24L01_CE=0;   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+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启 NRF24L01_CE = 1;
}
//检测24L01是否存在
//返回值:0,成功;1,失败
u8 NRF24L01_Check(void)
{u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};u8 i;     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
}//该函数初始化NRF24L01到RX模式
//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR
//当CE变高后,即进入RX模式,并可以接收数据了
void NRF24L01_RX_Mode(void)
{NRF24L01_CE=0;      NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址,主要为了使能ACK      NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度         NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 NRF24L01_CE = 1; //CE为高,进入接收模式
}                   //该函数初始化NRF24L01到TX模式
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR
//PWR_UP,CRC使能
//当CE变高后,即进入RX模式,并可以接收数据了
//CE为高大于10us,则启动发送.
void NRF24L01_TX_Mode(void)
{                                                        NRF24L01_CE=0;        NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址,主要为了使能ACK       NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断NRF24L01_CE=1;//CE为高,10us后启动发送
}//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
u8 NRF24L01_TxPacket(u8 *txbuf)
{u8 sta;   NRF24L01_CE=0;NRF24L01_Write_Buf(NRF_WRITE_REG + RX_ADDR_P0, (u8*)TX_ADDRESS, TX_ADR_WIDTH);    // 装载帧头(对方的)地址    NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节NRF24L01_CE=1;//启动发送     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;                                           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 RX_OK; }    return 0xff;//没收到任何数据
}       

程序源码(包含一套参考程序)

链接:https://pan.baidu.com/s/1E5hjnmBLoLXIOhVIHpGSFg
提取码:hpiz

  伤痛使你更坚强,眼泪使你更勇敢,心碎使你更明智。感谢过去,带给我们一个更好的未来。

【STM32】STM32F103C8T6+nrf24l01收发示例相关推荐

  1. STM32驱动NRF24L01

    前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. 1. 简介 NRF24L01是 nordic 的无线通信芯片,它具有以下特 ...

  2. 【32单片机学习】(6)STM32串口+DMA收发不定长数据

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1.DMA介绍 2.串口接收数据 3.实验现象 1.实验电路图 2.串口收发不定长数据视频演示 3.OLED 显示接收数据 ...

  3. dbus的代码范例 linux_Dbus简介与简单的收发示例程序

    Dbus简介与简单的收发示例程序. D-BUS 是一个大有前途的消息总线和活动系统,正开始深入地渗透到 Linux® 桌面之中.了解创建它的原因.它的用途以及发展前景. D-BUS 本质上是 进程间通 ...

  4. STM8S903K3T6C基于ST Visual Develop开发串口数据收发示例

    STM8S903K3T6C基于ST Visual Develop开发串口数据收发示例 相关篇<STM8S903K3T6C基于IAR寄存器开发串口通讯示例>

  5. STM32 串口DMA收发(二)

    STM32 串口DMA收发数据 一.STM32 DMA简介与功能说明 1.STM32F4 DMA简介 DMA(Direct memory access),即直接存储器访问.用于在外设与存储器之间以及存 ...

  6. 【STM32】NRF24L01模块的收发调试

    NRF24L01 发送端.c文件 发送端.h文件 接收端.c文件 接收端.h文件 接收端main函数 总结: 这里我是用了两块板子来做通信实验,这里我就直接贴发送端和接收端的.c.h文件,一个是用标准 ...

  7. STM32无线通信——nRF24L01通信模块

    不同型号STM32的无线通信--基于一样的nRF24L01芯片模块 在此声明一下全部代码均不允许转发以及在商业上的行为等,-Mannix声明. 本次讲解主要内容 1.实验目的 2.实验硬件 3.芯片模 ...

  8. STM32控制NRF24L01无线模块进行通信

    一.NRF2401无线模块 1.模块介绍 功能介绍 (1)2.4Ghz 全球开放ISM 频段免许可证使 2) 最高工作速率2Mbps,高效GFSK调制,抗干扰能力强,特别适合工业控制场合 (3)126 ...

  9. 船模制作——遥控模块 基于stm32和nrf24l01(固件库开发)

    目录 nrf24l01介绍 引脚图 引脚功能介绍 模式配置方法 官方宏 stm32配置 引脚映射 初始化函数 SPI模拟通信函数 nrf24l01配置函数 nrf24l01发射和接收 nrf24l01 ...

最新文章

  1. c语言中变量的值十进制,C语言中介绍的整型变量 即十进制 十六进制什么的是什么意思 能具体解释一下吗 还有换算什么的 谢谢...
  2. 4t硬盘实际容量是多少_SMR硬盘到底能用不?点进来看看避免踩雷
  3. 十二、ubuntu20.10(Linux)下Pycharm配置pyqt5开发环境
  4. rn 实现上下滑动选择列表_用大前端技术实现的一款仿Boss直聘app(已开源)
  5. 大道至简 读后有感
  6. 第二阶段团队冲刺(五)
  7. 面向对象中多个对象之间的关系
  8. eCognition易康导出样本
  9. 电网调度计算机系统目前有三种,电力系统知识问答(三)
  10. linux系统用虚拟光驱装win7,怎么用虚拟光驱安装系统
  11. paypal php 接口文档,paypal接口开发记录
  12. 用SET工具包制作钓鱼网站
  13. 软件的界面测试是什么?怎么设计的?
  14. 解决pymysql.err.InternalError: (1054, Unknown column '某某某' in 'field list') 的问题
  15. arm el2与el3_ARM下的EL/PL概念
  16. 弘兵金融学院 站在山顶 看不见山
  17. python爬取芒果TV《乘风破浪的姐姐》弹幕数据(已完成)
  18. 备案提示 尊敬的ICP用户: 您的短信核验失败,请您重新验证
  19. 牛客寒假算法基础集训营1 - C - 小a与星际探索(bfs || 暴力)
  20. 能玩游戏的计算机名字,适合玩大型游戏的笔记本电脑排行榜前十名

热门文章

  1. 性价比高的口粮酒推荐,聪明人都选这3款,口感醇厚,纯粮好喝
  2. 电脑怎么连接隐藏的无线WiFi ?
  3. 数组的 find() 和 findIndex() 方法
  4. 企业金融App评测系列——微众银行以App构筑企业金融服务新生态,成为企业的随身数字银行
  5. word文件打开就是只读模式,怎么取消?
  6. 希腊海底失落之城最新打揭秘
  7. 中国互联网办公地变迁史:你的公司为什么也搬家了?
  8. HTML中照片的各种常用属性
  9. 玩游戏机械键盘什么牌子好, 我们聊聊Hyperx游戏机械键盘
  10. Qunar 云原生容器化落地实践