NRF24L01原子HAl库学习

news2024/10/11 23:51:10

IRQ产生中断有低电平,在TxFIFI发送完收到ACk后产生,

在RxFIFO收到数据后也产生

达到最大重发次数也产生

工作时序,SCK空闲状态为0,CPOL=0,第一个时钟沿采集数据CPHA=0,SPI工作模式0

另外SPI高位先出,低字节先出

30个寄存器,10个操作命令

nrf24l01整合一字节,只带操作,不带地址信息,带操作和地址信息

NRF写时序,返回的是寄存器的状态,下面的reg并非真正reg,有两种组合,是操作寄存器(10个操作命令)和地址信息(30个寄存器)整合的一个字节,或者只带操作信息的字节

读时序函数,reg同样为上述情况

操作指令

读写寄存器带操作地址

Tx和Rx都有FIFO, FIFO有三级,  PWR_UP位是上电与否,  PRIM_RX位是是否接收模式

自动重发

通道0的接收地址用来接收接收方接收到数据发送的ACK信号,所以要与发送方的发送地址一样。

发送流程

发送模式初始化步骤,发送频率和接收频率要相等

发送模式初始化代码

通过W_TX_PAYLOAD写数据

IRQ中断时变为低电平,接收到有效数据,发送完都会进入中断,下面while循环是等待发送接收应答完成

发送成功返回0,失败返回1

通过R_RX_PAYLOAD读数据

2,3,4,5是rx_packet的流程

注意:上面的发送和接收都是指同一个nrf器件

接收模式初始化

接收模式初始化代码

_write_buf(NRF_WRITE_REG + RX_ADDR_P0,(uint8_t *)RX_ADDRESS, RX_ADR_WIDTH)是把接收地址写入通道0

启动接收流程

发射端和接收端的RF_CH设置工作通道频率要相同

CONFIG寄存器,发送是0x0e,接收是0x0f,RX_DR,接收到数据触发IRQ中断,显示低电平,TX_DS,发送出去并接收到ACK信号是发送完成,触发中断信号,IRQ输出低电平

自动应答使能寄存器取值0x01,使能自动应答

数据接收通道使能

地址宽度设置寄存器,写入11默认5个字节,就是40位

自动重发寄存器,写入0x0A,设置自动重发间隔时间586us,最大自动重发次数为10次

发射端和接收端频率配置要一致

射频配置寄存器

【Low,High】共同决定传输速率

状态寄存器

RX_DR,接收数据标记,收到数据后置1,会引起IRQ中断输出低电平,写1清除中断

TX_DS,数据发送完成并接收到应答后完成置1,会引起IRQ中断1,写1清除中断。

MAX_RT,达到最大重发次数标志,写1清除中断,MAX_RT产生中断标志,需要清除中断后系统才能通信

数据通道0接收地址寄存器RX_ADDR_P0

通道0地址有40位 ,  数据通道1接收地址设置寄存器设置P1~P5的32位高位地址,其他8位自己设置

P2~P5只能设置低8位地址

发送地址设置寄存器,接收通道0有效数据宽度设置寄存器

发送地址应该和接收通道0的地址设置相等,这样才能自动ACK,才能接收到应答信息

寄存器不用记住,要学会查看

编程实战

除了SPI的三个连接,还有CE引脚,控制nrf,  CSN引脚片选信号引脚,  IRQ中断引脚需要额外配置

代码详解,指定位置写

/**
 * @brief       在指定位置写指定长度的数据
 * @param       reg   : 寄存器地址
 * @param       pbuf  : 数据指针
 * @param       len   : 数据长度
 * @retval      状态寄存器值
 */
static uint8_t nrf24l01_write_buf(uint8_t reg, uint8_t *pbuf, uint8_t len)
{
    uint8_t status, i;
    
    NRF24L01_CSN(0);    /* 使能SPI传输 */
    status = spi1_read_write_byte(reg);/* 发送寄存器值(位置),并读取状态值 */

    for (i = 0; i < len; i++)
    {
        spi1_read_write_byte(*pbuf++); /* 写入数据,*pbuf先获取数据,在对pbuf的地址进行++ */
    }
    
    NRF24L01_CSN(1);    /* 关闭SPI传输 */
    
    return status;      /* 返回读到的状态值 */
}

重点

CE引脚和CONFIG寄存器的PWR_UP位和PRIM_RX(第0位)共同控制nrf240l工作模式,

有四种模式

状态寄存器,4~6位写1清除中断,其他位不受影响,所以有了下面这个代码,写1清除那里非常巧妙

/**
 * @brief       启动NRF24L01发送一次数据(数据长度 = TX_PLOAD_WIDTH)
 * @param       ptxbuf : 待发送数据首地址
 * @retval      发送完成状态
 *   @arg       0    : 发送成功
 *   @arg       1    : 达到最大发送次数,失败
 *   @arg       0XFF : 其他错误
 */
uint8_t nrf24l01_tx_packet(uint8_t *ptxbuf)
{
    uint8_t sta;
    uint8_t rval = 0XFF;
    
    NRF24L01_CE(0);
    nrf24l01_write_buf(WR_TX_PLOAD, ptxbuf, TX_PLOAD_WIDTH);    /* 写数据到TX BUF  TX_PLOAD_WIDTH个字节 */
    NRF24L01_CE(1);                     /* 启动发送 */

    while (NRF24L01_IRQ != 0);          /* 检测中断IRQ输入为0,等待发送完成,收到应答后才会产生中断 */

    sta = nrf24l01_read_reg(STATUS);    /* 读取状态寄存器的值 */
    nrf24l01_write_reg(NRF_WRITE_REG + STATUS, sta);    /* 清除TX_DS或MAX_RT中断标志,写1清除 */

    if (sta & MAX_TX)   /* 达到最大重发次数 */
    {
        nrf24l01_write_reg(FLUSH_TX, 0xff);             /* 清除TX FIFO寄存器 */
        rval = 1;
    }

    if (sta & TX_OK)    /* 发送完成 */
    {
        rval = 0;       /* 标记发送成功 */
    }

    return rval;        /* 返回结果 */
}

另外

 nrf24l01_write_reg(FLUSH_TX, 0xff);             /* 清除TX FIFO寄存器 */

nrf24l01_write_reg(FLUSH_RX, 0xff);                     /* 清除RX FIFO寄存器 */

总结

下面这段接收和发射模式初始化是设置发射方和接收方的通信频率的或者其他,通信频率要一样才能通信,所以比较重要,在原子例程都写好了

/**
 * @brief       NRF24L01进入接收模式初始化
 *   @note      设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR
 *              当CE变高后,即进入RX模式,并可以接收数据了
 * @param       无
 * @retval      无
 */
void nrf24l01_rx_mode(void)
{
    NRF24L01_CE(0);
    nrf24l01_write_buf(NRF_WRITE_REG + RX_ADDR_P0, (uint8_t *)RX_ADDRESS, RX_ADR_WIDTH);    /* 写RX节点地址 */

    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 + RX_PW_P0, RX_PLOAD_WIDTH);   /* 选择通道0的有效数据宽度 */
    nrf24l01_write_reg(NRF_WRITE_REG + RF_SETUP, 0x0f);     /* 设置TX发射参数,0db增益,2Mbps,低噪声增益开启 */
    nrf24l01_write_reg(NRF_WRITE_REG + CONFIG, 0x0f);       /* 配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 */
    NRF24L01_CE(1); /* CE为高,进入接收模式 */
}

/**
 * @brief       NRF24L01进入发送模式初始化
 *   @note      设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和
 *              LNA HCURR,PWR_UP,CRC使能
 *              当CE变高后,即进入TX模式,并可以发送数据了, CE为高大于10us,则启动发送.
 * @param       无
 * @retval      无
 */
void nrf24l01_tx_mode(void)
{
    NRF24L01_CE(0);
    nrf24l01_write_buf(NRF_WRITE_REG + TX_ADDR, (uint8_t *)TX_ADDRESS, TX_ADR_WIDTH);       /* 写TX节点地址 */
    nrf24l01_write_buf(NRF_WRITE_REG + RX_ADDR_P0, (uint8_t *)RX_ADDRESS, RX_ADR_WIDTH);    /* 设置RX节点地址,主要为了使能ACK */

    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 + SETUP_RETR, 0x1a);   /* 设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 */
    nrf24l01_write_reg(NRF_WRITE_REG + RF_CH, 40);          /* RF通信频率,设置RF通道为40 ,接收方和发射方一样才能通信 */
    nrf24l01_write_reg(NRF_WRITE_REG + RF_SETUP, 0x0f);     /* 设置TX发射参数,0db增益,2Mbps,低噪声增益开启 */
    nrf24l01_write_reg(NRF_WRITE_REG + CONFIG, 0x0e);       /* 配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断 */
    NRF24L01_CE(1); /* CE为高,10us后启动发送 */
}

内容有点多,不过很细,很全

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年秋季学期期中考试成绩查询系统-老师制作工具

随着2024年的日历逐渐翻至末尾&#xff0c;我们迎来了本年度的最后一次期中考试。对于我们这些教育工作者而言&#xff0c;这段时间无疑是充满挑战与收获的。今天&#xff0c;我要向大家推荐一个创新的工具——“易查分”&#xff0c;它将彻底革新我们传统的成绩发布流程。通过…

【瑞萨RA8D1 CPK开发板】lcd显示

1.8寸lcd使用gpio模拟spi驱动 由于板子引出的接口限制&#xff0c;故使用gpio模拟spi驱动中景园的1.8寸lcd 1.77寸液晶屏 1.8寸TFT LCD SPI TFT彩屏st7735驱动128x160高清屏-淘宝网 (taobao.com) 使用RASC 的gpio配置 根据厂家提供的驱动文件移植 #define LCD_SCLK_Clr() g…

【MySQL】CRUD增删改查操作

文章目录 CRUD简介一、Creat 新增1.单行数据全列插入2.单行数据全指定列插入3.多行数据指定列插入 二、Retrieve 检索1.全列查询 --练习阶段最简单的查询&#xff1a;&#xff08;在生产环境最好不要用&#xff01;&#xff01;&#xff09;2.指定列查询3.结果去重查询4.where条…

Tomcat部署java项目,反馈漏洞CVE-2005-4900: TLS SHA-1 安全漏洞(中危) *

根据项目反馈漏洞处理&#xff0c;修复部署SSL证书时反馈TLS1.2版本漏洞&#xff1a; 漏洞描述如下&#xff1a; 漏洞类型&#xff1a;密码学问题 漏洞描述&#xff1a; TLS &#xff08;全称 Transport Layer Security&#xff0c;安全传输层 协议&#xff09;是一套用于在两…

Qt 数据库,人脸识别

数据库 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QMainWindow> #include<QSqlDatabase> QT_BEGIN_NAMESPACE namespace Ui { class widget; } QT_END_NAMESPACEclass widget : public QMainWindow {Q_OBJECTpublic:widget(QWidget *parent nullptr);…

HCIP-HarmonyOS Application Developer 习题(九)

(多选) 1、HarmonyOS多窗口交互能力提供了以下哪几种交互方式&#xff1f; A. 全局消息通知 B.平行视界 C.悬浮窗 D.分屏 答案&#xff1a;BCD 分析&#xff1a;系统提供了悬浮窗、分屏、平行视界三种多窗口交互&#xff0c;为用户在大屏幕设备上的多任务并行、便捷的临时任务…

项目 多人对话

项目 目标 多人对话仿真平台 技术点 socketIO异常多线程集合面向对象字符串GUI&#xff08;client&#xff09;… 项目开发方式 迭代开发-敏捷开发 建立模型 C/S 客户端/服务器模型(console) 服务器 package com.ffyc.tcp.one;import java.io.IOException; import java.i…

【大模型】RMS Normalization原理及实现

1.RMS Normalization的原理 说RMS Normalization之前&#xff0c;先讲Layer Normalization 和 Batch Normalization。 BN和LN是两种常见的归一化方法。它们的目的是帮助模型训练更稳定、收敛更快。BN是在Batch维度上进行归一化&#xff0c;即对同一batch中每个特征维度的值进行…

操作系统的了解及安装

一、linux系统认识 linux是指操作系统的内核&#xff0c;ubuntu是指基于这种内核的操作系统&#xff0c;Ubuntu属于Linux的一个发行版本&#xff0c;有简易的用户界面&#xff0c;完善的包管理系统&#xff0c;Ubuntu还对大多数硬件有着良好的兼容性&#xff0c;包含最新的图形…

一文区分SSTI 和 CSTI

前言 有时&#xff0c;SSTI&#xff08;服务器端模板注入&#xff09;和 CSTI&#xff08;客户端模板注入&#xff09;可能会由于它们相似的负载语法而混淆。这种混乱可能会导致渗透测试人员浪费时间尝试实现反向 shell&#xff0c;即使payload仅限于客户端。 定义 &#x1d…

10.11 QT数据库实现学生信息的增、删、改、查

.pro文件 QT core gui sql .h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //数据库查寻类 #include <QSqlRecord> //记录类 #include <QMessage…

从数据到洞察:ChatGPT如何革新Python数据分析流程

导读&#xff1a;通过ChatGPT与Python的结合&#xff0c;数据分析流程得到了极大的优化和提升&#xff0c;从数据获取、清洗、代码生成到智能分析和可视化展示&#xff0c;每一步都变得更加高效和智能化。这不仅提高了分析的准确性和效率&#xff0c;还降低了技术门槛&#xff…

网络编程(18)——使用asio协程实现并发服务器

十八、day18 到目前为止&#xff0c;我们以及学习了单线程同步/异步服务器、多线程IOServicePool和多线程IOThreadPool模型&#xff0c;今天学习如何通过asio协程实现并发服务器。 并发服务器有以下几种好处&#xff1a; 协程比线程更轻量&#xff0c;创建和销毁协程的开销较…

【python】之socket编程(附带无偿源码)

本章内容 1、socket 2、IO多路复用 3、socketserver Socket socket起源于Unix&#xff0c;而Unix/Linux基本哲学之一就是“一切皆文件”&#xff0c;对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现&#xff0c;socket即是一种特殊的文件&…

【路径规划】自主机器人的路径规划和导航

摘要 本文讨论了如何利用路径规划算法对自主机器人进行路径规划和导航。自主机器人在环境中的路径规划是通过参考路径与机器人的当前位置进行比对&#xff0c;采用纯追踪算法&#xff08;Pure Pursuit&#xff09;进行路径跟踪&#xff0c;以确保机器人沿预定路线行驶。本文通…

黑马程序员C++核心编程学习笔记

黑马程序员C核心编程学习笔记 一、内存 1.1 内存四区 C程序在执行时&#xff0c;将内存大致分为4个区域&#xff1a;代码区&#xff0c;全局区&#xff0c;栈区&#xff0c;堆区 代码区&#xff1a;存放函数体的的二进制代码&#xff0c;操作系统管理。 &#x1f535;特点&a…

从数据管理到功能优化:Vue+TS 项目实用技巧分享

引言 在项目开发过程中&#xff0c;优化用户界面和完善数据处理逻辑是提升用户体验的重要环节。本篇文章将带你一步步实现从修改项目图标、添加数据、优化日期显示&#xff0c;到新增自定义字段、调整按钮样式以及自定义按钮跳转等功能。这些操作不仅提升了项目的可视化效果&am…

双十一适合买什么?2024双十一值得入手好物推荐

即将来临的2024年双十一&#xff0c;有哪些超值宝贝会令人忍不住疯狂下单呢&#xff1f;双十一购物狂欢节&#xff0c;这个一年一度的盛大庆典&#xff0c;向来使我们这些热衷于购物的消费者们激动万分。那么&#xff0c;在今年的双十一&#xff0c;究竟有哪些商品能够成功吸引…

利用FnOS搭建虚拟云桌面,并搭建前端开发环境(二)

利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境 二 一、docker镜像二、环境配置三、核心环境配置流程文档 利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境&#xff08;一&#xff09; 上一章安装了飞牛FnOS系统&#xff0c;界面如下&#xff0c;这一张配置前端…

Docker安装Minio+SpringBoot上传下载文件

Docker 安装Minio docker pull minio/minio docker images REPOSITORY TAG IMAGE ID CREATED SIZE minio/minio latest 162489e21d26 7 days ago 165MB nginx latest 7f553e8bbc89 7 days ago 192MB # 外挂磁盘存储使用 mkdir -p…