NRF24L01是一款比较常见的无线通讯芯片,不过有个缺点就是只能半双工通讯,当涉及到双向通讯时就比较麻烦一些·,特别是想要做无线IAP数据需要一直来回发送,这点无疑然人恶心到想吐,不过还好有数据中断可以用来做切换。

前些时间做的无线IAP用到双向通讯,现在分享如下

省去初始化SPI,等一些初始化

  1. 初始化接口,以及中断引脚IRQ
  2. void EXTIInitialize(void)                                           //外部中断初始化  
  3. {  
  4.     GPIO_InitTypeDef GPIO_InitStructure;  
  5.     EXTI_InitTypeDef EXTI_InitStructure;  
  6.     NVIC_InitTypeDef NVIC_InitStructure;  
  7.       
     
  8.     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                //通道设置为串口1中断   
  9.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;       //中断抢占优先级1  
  10.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;              //中断响应优先级2  
  11.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //打开中断   
  12.     NVIC_Init(&NVIC_InitStructure);   
  13.       
     
  14.       
     
  15.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);  
  16.     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;                         //外部中断0  
  17.     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;                     //上拉输入  
  18.     GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  
  19.     GPIO_Init(GPIOB, &GPIO_InitStructure);  
  20.       
     
  21.     EXTI_ClearITPendingBit(EXTI_Line0);  
  22.     EXTI_InitStructure.EXTI_Line = EXTI_Line0;   
  23.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;   
  24.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
  25.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
  26.     EXTI_Init(&EXTI_InitStructure);  
  27. }  
  28. void EXTI0_IRQHandler(void)  
  29. {  
  30.     if(EXTI_GetITStatus(EXTI_Line0)!=RESET)  
  31.     {  
  32.         DataProces();  
  33.           
     
  34.           
     
  35.         EXTI_ClearITPendingBit(EXTI_Line0);  
  36.     }  
  37. }  

、模式初始化选择数据中断void NRF_Mode(char mode)

  • {  
  •     NRF24L01_CE=0;  
  •     NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_AW,0x03);//地址宽度  
  •       
     
  •     NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址      
  •     NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址  
  •    
     
  •     NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x00);    //使能通道0的自动应答      
  •     NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);//使能通道0的接收地址   
  •     NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x1a);  
  •     NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,124);         //设置RF通信频率         
  •     NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度  
  •     NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  •     //tx  
  •     if(mode==1)  
  •         NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,0x5e);//0101  
  •     //rx  
  •     else  
  •         NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x3f);  
  •     NRF24L01_CE = 1; //CE为高,启动配置  
  • }     

、接受到数据后产生中断以及发送完成产生中断,中断相对于主机而言,对于只是产生一个高电平,用中断去处理相关数据void DataProces(void)

  • {  
  •     u8 sta,i;  
  •       
     
  •     sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值   
  •       
     
  •     NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,0x70); //清除中断标志  
  •    
     
  •     if(sta&TX_OK)//发送完成  
  •     {  
  •         NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器  
  •    
     
  •         ChangeMode(2);  
  •         my_delay_us(10);    //粗略等待15us,不调用滴答定时器影响整体时序  
  •           
     
  •     }  
  •     if(sta&RX_OK)//接收到数据  
  •     {  
  •         NRF24L01_Read_Buf(RD_RX_PLOAD,RxNrfBuf,RX_PLOAD_WIDTH);//读取数据  
  •         NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器  
  •    
     
  •         ChangeMode(1);  
  •           
     
  •         IAP(RxNrfBuf);  
  •           
     
  •         //不调用滴答定时器影响整体时序  
  •         //延时30等待对方切换模式s  
  •         my_delay_us(50);  
  •         //TxNrfBuf[0] = test++;  
  •         NrfSend(TxNrfBuf);  
  •           
     
  •     }  
  •       
     
  • }  

4、接受或者发送完成之后便可以做响应的处理,其中为了提高数据准确性我将中断数据处理定义成两个模式分为主接受,和主发送。’主接受模式接收到数据后就切换发送模式根据需要去返回数据,发送完成后就立马切换为接收模式,以接收模式作为常态,为下一次的接收做准备;主发送模式发送完数据后就切换为接收模式,等待有数据返回,返回后就立马切换为发送模式,以发送模式作为常态。其中有一个小小的技巧,在主发送模式下等待接收数据时可开启定时器,用来做超时处理,超时后重新发送,当然,NRF25L01上面自带重发功能,但我不太喜欢上面的自动重发,那个是不可控的,我比较喜欢可控的数据收发,这样更为灵活,可以根据自己单片机的速度以及环境因素设定 符合自己的所需要的重发时间

    1. void ChangeMode(char mode)  
    2. {  
    3.       
       
    4.     NRF24L01_CE=0;  
    5.     //TX  
    6.     if(mode == 1)  
    7.         NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,0x5e);  
    8.     else   
    9.         NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,0x3f);  
    10.     NRF24L01_CE=1;//启动  
    11.       
       
    12. }  

NRF24L01中断双向传输数据的更多相关文章

  1. 【Java】学习路径55-练习:制作一个聊天室(多线程、UDP、双向传输数据)

    创建四个类,实现双向聊天的功能. 接收线程: import java.io.IOException; import java.net.*; public class ReceiveThread imp ...

  2. NRF24L01使用外部中断读取数据的问题

    NRF24L01读取数据不能使用中断的方式,原因如下: 首先NRF24L01中断触发时,IRQ引脚会一直保持低电平直到状态寄存器中的中断标志被重新清零. stm32的外部中断触发方式只有上升沿或者下降 ...

  3. NRF24L01学习

    一.工作模式 PWR_UP和PRIM_RX在寄存器0x00中的第0位和第1位. 待机模式I:只是使用晶振工作,CE=0时是拉低? 待机模式II:部分时钟缓冲器处在工作模式.TX FIFO为空并且CE为 ...

  4. [stm32] NRF24L01+USART搞定有线和无线通信

    前言 一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法.这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据 ...

  5. 总线接口与计算机通信(四)USB外部总线(初级认识)

    USB简介   USB是英文Universal Serial BUS(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,是应用在PC领域的接口技术.USB接口支持设备的即插 ...

  6. java NIO详解

    http://zalezone.cn/2014/09/17/NIO%E7%B2%BE%E7%B2%B9/ 1. 前言 我们在写java程序的时候,为了进行优化,把全部的精力用在了处理效率上,但是对IO ...

  7. 网卡phy9161A

    硬件1. 网口网口使用4根信号线:两根发送,两根接收.一对信号线中一根承载0——+2.5V信号电压,而另一根负载的电压是0——-2.5V,因此可产生一个5Vpp的信号差.RJ45中有用的就是4根信号线 ...

  8. 计算机网络之传输层 下(TCP)

    1. TCP的特点 特点:它是一个点到点的通信机制,只能有一个发送方和一个接收方:它提供是一个可靠的,按序的字节流机制:使用流水线机制,通过拥塞控制和流量控制的机制设置窗口尺寸:发送方和接收方都有缓存 ...

  9. C# WinForm 跨线程访问控件(实用简洁写法)

    C# WinForm 跨线程访问控件(实用简洁写法) 1.<C# WinForm 跨线程访问控件(实用简洁写法)>       2.<基于.NET环境,C#语言 实现 TCP NAT ...

随机推荐

  1. 彻底理解JavaScript中的this

    this 是 JavaScript 语言的一个关键字. 它是函数运行时,在函数体内自动生成的一个对象,只能在函数体内使用. 函数的不同使用场合,this 有不同的值.总的来说,this 就是函数运行时 ...

  2. react 如何引入打印控件 CLodop

    下载插件,官网地址 http://www.lodop.net/download.html  ,选择综合版,解压下载的文件.直接点击 安装,很简单,就不一一说明了. 复制下面几个文件,到react项目中 ...

  3. C#知识点回顾随笔目录导航

    此随笔只是春节期间回顾知识点,阅读<<C#学习笔记>>记录(2019-2-4至2019...); 使用有道云笔记记录可能会有些排版问题 思维导图预览(使用的有道云,无法截取完整 ...

  4. 02 DML(DataManipulationLanguage)

    1.插入记录     基本语法 :         INSERT INTO tbl_name (col_name ,col_name1,..,col_nameN) VALUES (val1,val2, ...

  5. JuJu团队12月3号工作汇报

    JuJu团队12月3号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 于达 修改batch里给sentence加padding的方法 继续调试 无 婷婷 给crossentro ...

  6. pacificrack 控制面板登录不上的问题

    我今天又试了一下: https://master-stack01.pacificrack.com还是登不上(这个一键烦恼了我一个星期了,但是我今天百度出来了解决办法) 然后用这个就可以了  https ...

  7. Docker常用命令,Docker安装Nginx、Redis、Jenkins、tomcat、MySQL

    常用命令 拉取镜像:docker pull xxx启动镜像:docker run --name xxx 8080:8080 -d xxx查看容器:docker ps xxx 停止容器:docker s ...

  8. 文本编辑器vim/vi——命令模式

    一个完整的指令的标准格式: Linux通用的格式——#指令主体(空格) [选项](空格) [操作对象] 一个指令可以包含多个选项,操作对象也可以是多个. vim指令: 指令:vim   (vim是一款 ...

  9. JSP编码规范

    JSP包含文件 <%@ include file=”relativeURI”%> //在翻译阶段执行加载,比如:校验是否登录通过 jsp的include指令元素读入指定页面的内容.并把这些 ...

  10. 利用Jenkins实现jdk11+Maven构建springboot项目

    目录 原理图 前期准备 Jdk11安装 Jenkins安装 Maven安装 Jenkins的设置 插件安装 变量配置 搭建项目 1.通用配置 2.源码管理 3.构建触发 4.Maven的构建选项 5. ...