参照野火STM32程序调试NRF24L01成功,颇获喜感

nRF24L01是一款工作在2.4~2.5GHz世界通用ISM频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型SchockBurstTM模式控制器、功率放大器、警惕振荡器、调制器、解调器。输出功率、频道选择和协议的设置可以通过SPI接口进行设置。

模块外形图如下图所示:                 PCB和引脚示意图如下图所示:

          

电路图如图所示:

VDD电压范围为1.9V~3.6V,我使用的是3.3V,与单片机的通信接口类型为SPI,读写时序如下图所示:

与开发板硬件连接如下:

* 硬件连接:----------------------------—----|
            |  PA5-SPI1-SCK     : NRF -SCK  |
            |   PA6-SPI1-MISO  : NRF -MISO |
            |   PA7-SPI1-MOSI  : NRF -MOSI |
            |   PA4          : NRF -CE     |
 *          |   PA3                       : NRF -CSN  |
            | PA2          : NRF -IRQ    |
 *           -------------------------------------------

引脚配置如下:

  /*配置 SPI_NRF_SPI的 SCK,MISO,MOSI引脚,GPIOA^5,GPIOA^6,GPIOA^7 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能GPIO_Init(GPIOA, &GPIO_InitStructure);  /*配置SPI_NRF_SPI的CE引脚,GPIOA^4和SPI_NRF_SPI的 CSN 引脚: NSS GPIOC^4*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);/*配置SPI_NRF_SPI的IRQ引脚,GPIOA^2*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;  //上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure); 

SPI配置如下:

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;    //双线全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                   //主模式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_8;    //8分频,9MHzSPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                 //高位在前SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);/* Enable SPI1  */SPI_Cmd(SPI1, ENABLE);

配置进入接收模式:

void NRF_RX_Mode(void)
{NRF_CE_LOW();  SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);    //使能通道0的自动应答    SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址    SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);      //设置RF通信频率    SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度      SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x07); //设置TX发射参数,0db增益,1Mbps,低噪声增益开启   SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f);  //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式NRF_CE_HIGH(); /*CE拉高,进入接收模式*/ delay_ms(100); //CE拉高一段时间
}

配置进入发射模式:

void NRF_TX_Mode(void)
{  NRF_CE_LOW();        SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);    //写TX节点地址; SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK;   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答;    SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址;  SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次;SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);   //设置RF通道为CHANAL;SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x07);  //设置TX发射参数,0db增益,1Mbps,低噪声增益开启;   SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断;
/*CE拉高,进入发送模式*/  NRF_CE_HIGH();delay_ms(100); //CE要拉高一段时间才进入发送模式
}

NRF24L01的开机自检:

u8 NRF_Check(void)
{u8 buf[5]={0xC2,0xC2,0xC2,0xC2,0xC2};u8 buf1[5];u8 i; SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,buf,5); /*写入5个字节的地址.  */  SPI_NRF_ReadBuf(TX_ADDR,buf1,5); /*读出写入的地址 */               for(i=0;i<5;i++)    /*比较*/ {if(buf1[i]!=0xC2)break;}   if(i==5)return SUCCESS ;        //MCU与NRF成功连接 elsereturn ERROR ;        //MCU与NRF不正常连接
}

数据发送:

u8 NRF_Tx_Dat(u8 *txb)
{u8 state;  NRF_CE_LOW(); /*ce为低,进入待机模式1*/                       SPI_NRF_WriteBuf(WR_TX_PLOAD,txb,TX_PLOAD_WIDTH);   /*写数据到TX BUF 最大 32个字节*/NRF_CE_HIGH();     /*CE为高,txb非空,发送数据包 */                                          while(NRF_Read_IRQ()!=0);  /*等待发送完成中断 */    state = SPI_NRF_ReadReg(STATUS); /*读取状态寄存器的值 */ SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state); /*清除TX_DS或MAX_RT中断标志*/  SPI_NRF_WriteReg(FLUSH_TX,NOP);    //清除TX FIFO寄存器 /*判断中断类型*/    if(state&MAX_RT)                     //达到最大重发次数return MAX_RT; else if(state&TX_DS)                  //发送完成return TX_DS;elsereturn ERROR;                 //其他原因发送失败
} 

数据接收,可放在主函数里循环检测,也可更换为中断模式检测:

u8 NRF_Rx_Dat(u8 *rxb)
{u8 state; NRF_CE_HIGH();    //进入接收状态/*等待接收中断*///while(NRF_Read_IRQ()!=0);/// NRF_CE_LOW();     //进入待机状态                state = SPI_NRF_ReadReg(STATUS);  /*读取status寄存器的值*/  if(state&RX_DR)  /*判断是否接收到数据*/  //接收到数据{                                      SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state);/* 清除中断标志*/ SPI_NRF_ReadBuf(RD_RX_PLOAD,rxb,RX_PLOAD_WIDTH);//读取数据
//      SPI_NRF_WriteReg(FLUSH_RX,NOP);          //清除RX FIFO寄存器return RX_DR; }else    return ERROR;                    //没收到任何数据
}

主循环任务程序如下:

void nrf_task(void *pdata)
{while(NRF_Check()!=SUCCESS){<span style="white-space:pre">   </span>delay_ms(100);}NRF_TX_Mode();//主动请求连接nrf_Txbuf[0]='H';nrf_Txbuf[1]='E';nrf_Txbuf[2]='L';nrf_Txbuf[3]='L';nrf_Txbuf[4]='0';do{     status = NRF_Tx_Dat(nrf_Txbuf);}while((status != TX_DS)&(status != MAX_RT));//发送成功或者到达最大重发次数<span style="white-space:pre">    </span>if(status == MAX_RT) {    USART1_printf( USART1,"Connection Failed\r\n");}<span style="white-space:pre">  </span>memset(nrf_Txbuf,0,sizeof(nrf_Txbuf));NRF_RX_Mode();//配置为接收模式while(1){/*等待接收数据*/status = NRF_Rx_Dat(nrf_Rxbuf);/*判断接收状态*/if(status == RX_DR)//接收到数据中断标志{Usb_SendData((char*)nrf_Rxbuf,strlen((char*)nrf_Rxbuf));//通过USB转发}if(0 != strlen((char*)nrf_Txbuf))//发送缓冲不为空{NRF_TX_Mode();//主动请求连接do{       status = NRF_Tx_Dat(nrf_Txbuf);delay_ms(10);}while((status != TX_DS)&(status != MAX_RT));//发送成功或者到达最大重发次数memset(nrf_Txbuf,0,sizeof(nrf_Txbuf));NRF_RX_Mode();//配置为接收模式}delay_ms(100);}
}

2.4G模块NRF24L01调试经验相关推荐

  1. [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录

    原址 Platform: RK3399  OS: Android 6.0  Kernel: 4.4  Version: v2017.04  4G Module: EC20-CE 一基本概念 USB 部 ...

  2. NXP(imx8qxp)上android11的EG25-G(4G)模块调试记录

    文章目录 一.前期准备 二.底层配置 三.添加厂商提供的ril.so库 四.添加对应的配置 五.对应的报错解决 5.1 状态栏里面没有对应的 Mobile data SIM图标 5.2重复打印启动ri ...

  3. Qt下面利用4G 模块SIM7600发短信调试总结

    项目需要在基于Qt的界面下发送短信,选用4G模块SIM7600通过AT指令发送短信,和小伙伴调了一天多,终于可以了,下面简单总结一下调试过程中遇到的问题和学习到的经验,供大家参考,少走弯路. 1.在网 ...

  4. [nRF51822] 13、浅谈nRF51822和NRF24LE1/NRF24LU1/NRF24L01经典2.4G模块无线通信配置与流程...

    前言:  nRF51可以支持基于2.4G的互相通信.与NRF24LE1的通信.与NRF24LU1的通信.与NRF24L01的通信. 一.nRF51822基于2.4G和nRF51822通信 其中nRF5 ...

  5. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04【EC20模组SIM卡和驻网模组指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之04[EC20模组SIM卡和驻网模组指令说明] 一.准备工作 二.硬件环境的搭建 三.基础AT指令的说明和测试 关于SIM ...

  6. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之05【EC20模组TCP/IP模块AT指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之05[EC20模组TCP/IP模块AT指令说明] Socket长连接 一.准备工作 二.针对TCP/IP协议 关于TCP/ ...

  7. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02【EC20模组硬件供电和开关机复位操作】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之02[EC20模组硬件供电和开关机复位操作] 一.模组硬件知识 1.背景知识:网络制式 2.模组的供电 3.模组的开机 4 ...

  8. QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03【EC20模组基础串口指令说明】

    QUECTEL上海移远4G通讯CAT4模组EC20CEFAG模块串口调试指南之03[EC20模组基础串口指令说明] 一.准备工作 二.硬件环境的搭建 三.基础AT指令的说明和测试 STM32F103学 ...

  9. IMU模块ADIS16448调试过程及经验总结

    ADIS16448集成了陀螺仪.加速度计.磁力计及气压计为一体的IMU模块,我在这里总结下此模块的使用及调试经验. 首先说下硬件环境:MCU为TMS320C6722(DSP):IMU为ADIS1644 ...

最新文章

  1. 漂浮机器人新进展:Cimon的头部将为国际空间站带来人工智能
  2. 科技写作:传递信息要先旧后新
  3. Android学习笔记(5)----启动 Theme.Dialog 主题的Activity时程序崩溃的解决办法
  4. endnote咋手动输入文献_endnote如何导入参考文献?如何手动导入EndNote
  5. 如何在servlet刚启动时候获取服务器根目录?
  6. 提取javadoc_使用JavaParser从源文件中提取JavaDoc文档
  7. python初级进阶篇
  8. 时态知识图谱补全的方法及其进展
  9. samba服务的原理与搭建(转的别人的)
  10. Spring Cloud(Greenwich版)-03-编写高可用Eureka Server(集群)
  11. mysql的初始化语句是_MySQL入门之预处理语句的使用
  12. KST1G SD卡脚本提取JPG
  13. 【Android】OKHTTP使用
  14. Ubuntu系统镜像下载网站
  15. 微信抽奖小程序怎么做怎么弄?微信抽奖小程序制作方法详细介绍
  16. VS C++项目打开时报 fatal error RC1015
  17. hexo中matery主题的个性化定制
  18. 【渝粤题库】国家开放大学2021春2114人体解剖生理学题目
  19. 滴滴开源Logi-KafkaManager 一站式Kafka监控与管控平台
  20. 如何做数据分析,数据分析流程是什么?

热门文章

  1. DC电源口实物VCC引脚和GND引脚
  2. MTK9652和Mstar938的区别
  3. Windows 系统无法启动(错误代码:0xc000000e)的修复
  4. 数据仓库构建方法论(六):数据建模方法论
  5. 阻塞式IO和非阻塞式IO
  6. 文章列表的显示 以及创建文章 还有文章详情的基本--react项目5
  7. Racket编程指南——4 表达式和定义
  8. Altium_Designer(protel_DXP)英文菜单汉化对应表表
  9. 软技能:代码之外的生存指南
  10. 全国软考中级软件设计师 学习笔记-法律法规部分