LoRa芯片在RX时产生的中断顺序QA

news2024/9/25 1:16:57

目录

  • 1 前言
  • 2 问题集锦及解答
    • 2.1 radio芯片在接包时,preamble、header和Rx done三个中断产生顺序是怎么样的?谁先谁后?
    • 2.2 产生了Header error中断后,radio芯片会继续接收本包还是立马丢弃本包?
    • 2.3 产生了CRC error中断后,radio芯片会继续接收本包还是立马丢弃本包?Rx done和CRC error中断是否应该嵌套处理?
    • 2.4 如果不清除中断,radio的中断引脚DIOx是不是一直是高电平?
    • 2.5 如何正确配置中断?

1 前言

本章介绍在使用LoRa芯片时,对preamble、header、CRC和RX Done各个中断产生的顺序进行解读,本章以SX126x为例,但结论是同样适合其他系列的芯片的。要理解本章节内容,需要先了解一下LoRa物理层协议结构,不然理解起来太抽象了。在此,我再次将LoRa协议图贴出来,如下。
LoRa协议
Preamble组成
header的组成

2 问题集锦及解答

在开始之前,我先将使用的处理中断的代码粘贴出来,理解一下代码中对中断的处理,这样结合后续的实验log来理解radio的中断产生顺序。

void apps_common_sx126x_irq_process( const void* context )
{
    if( irq_fired == true )
    {
        irq_fired = false;

        sx126x_irq_mask_t irq_regs;
        sx126x_get_and_clear_irq_status( context, &irq_regs );

        if( ( irq_regs & SX126X_IRQ_TX_DONE ) == SX126X_IRQ_TX_DONE )
        {
            HAL_DBG_TRACE_INFO( "Tx done\n" );
            on_tx_done( );
        }

        if( ( irq_regs & SX126X_IRQ_RX_DONE ) == SX126X_IRQ_RX_DONE )
        {
            HAL_DBG_TRACE_INFO( "Rx done\n" );
            ASSERT_SX126X_RC( sx126x_handle_rx_done( context ) );
            if( PACKET_TYPE == SX126X_PKT_TYPE_GFSK )
            {
                sx126x_pkt_status_gfsk_t pkt_status;
                sx126x_get_gfsk_pkt_status( context, &pkt_status );

                if( pkt_status.rx_status.crc_error == true )
                {
                    HAL_DBG_TRACE_ERROR( "CRC error from packet status\n" );
                    // The CRC error call to on_crc_error is handled with SX126X_IRQ_CRC_ERROR
                }
                else if( pkt_status.rx_status.adrs_error == true )
                {
                    HAL_DBG_TRACE_ERROR( "Address error from packet status\n" );
                    on_rx_error( );
                }
                else if( pkt_status.rx_status.length_error == true )
                {
                    HAL_DBG_TRACE_ERROR( "Length error from packet status\n" );
                    on_rx_error( );
                }
                else
                {
                    on_rx_done( );
                }
            }
            else
            {
                on_rx_done( );
            }
        }

        if( ( irq_regs & SX126X_IRQ_PREAMBLE_DETECTED ) == SX126X_IRQ_PREAMBLE_DETECTED )
        {
            HAL_DBG_TRACE_INFO( "Preamble detected\n" );
            on_preamble_detected( );
        }

        if( ( irq_regs & SX126X_IRQ_SYNC_WORD_VALID ) == SX126X_IRQ_SYNC_WORD_VALID )
        {
            HAL_DBG_TRACE_INFO( "Syncword valid\n" );
            on_syncword_valid( );
        }

        if( ( irq_regs & SX126X_IRQ_HEADER_VALID ) == SX126X_IRQ_HEADER_VALID )
        {
            HAL_DBG_TRACE_INFO( "Header valid\n" );
            on_header_valid( );
        }

        if( ( irq_regs & SX126X_IRQ_HEADER_ERROR ) == SX126X_IRQ_HEADER_ERROR )
        {
            HAL_DBG_TRACE_ERROR( "Header error\n" );
            on_header_error( );
        }

        if( ( irq_regs & SX126X_IRQ_CRC_ERROR ) == SX126X_IRQ_CRC_ERROR )
        {
            HAL_DBG_TRACE_ERROR( "CRC error\n" );
            on_crc_error( );
        }

        if( ( irq_regs & SX126X_IRQ_CAD_DONE ) == SX126X_IRQ_CAD_DONE )
        {
            HAL_DBG_TRACE_INFO( "CAD done\n" );
            if( ( irq_regs & SX126X_IRQ_CAD_DETECTED ) == SX126X_IRQ_CAD_DETECTED )
            {
                HAL_DBG_TRACE_INFO( "Channel activity detected\n" );
                on_cad_done_detected( );
            }
            else
            {
                HAL_DBG_TRACE_INFO( "No channel activity detected\n" );
                on_cad_done_undetected( );
            }
        }

        if( ( irq_regs & SX126X_IRQ_TIMEOUT ) == SX126X_IRQ_TIMEOUT )
        {
            HAL_DBG_TRACE_WARNING( "Rx timeout\n" );
            on_rx_timeout( );
        }

        if( ( irq_regs & SX126X_IRQ_LR_FHSS_HOP ) == SX126X_IRQ_LR_FHSS_HOP )
        {
            HAL_DBG_TRACE_INFO( "FHSS hop done\n" );
            on_fhss_hop_done( );
        }
    }
}
/* 打开全部中断并将其全部映射到DIO1上 */
sx126x_set_dio_irq_params( context, SX126X_IRQ_ALL, SX126X_IRQ_ALL, SX126X_IRQ_NONE, SX126X_IRQ_NONE);

2.1 radio芯片在接包时,preamble、header和Rx done三个中断产生顺序是怎么样的?谁先谁后?

准备两个devices,一个TX,一个RX。
log结果如下:

INFO: irq_regs = 0x04
INFO: Preamble detected
INFO: on_preamble_detected
INFO: irq_regs = 0x10
INFO: Header valid
INFO: on_header_valid
INFO: irq_regs = 0x02
INFO: Rx done
Packet content - (21 bytes):
 F5 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
 10 11 12 13 14
INFO: Packet status:
INFO:   - RSSI packet = -75 dBm
INFO:   - Signal RSSI packet = -76 dBm
INFO:   - SNR packet = 7 dB

小结:三个中断的产生是有先后顺序的,并且这些中断并不是一下产生的,而是一个一个来的。

2.2 产生了Header error中断后,radio芯片会继续接收本包还是立马丢弃本包?

准备两个devices,一个TX,一个RX。
log结果如下:

INFO: irq_regs = 0x04
INFO: Preamble detected
INFO: on_preamble_detected
INFO: irq_regs = 0x22 //此处0x22代表两个中断,一个 Rx done,一个Header error。
INFO: Rx done
Packet content - (21 bytes):
 2C 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
 10 11 12 13 14
INFO: Packet status:
INFO:   - RSSI packet = -79 dBm
INFO:   - Signal RSSI packet = -78 dBm
INFO:   - SNR packet = 7 dB
ERROR: Header error
INFO: on_header_error

INFO: irq_regs = 0x04
INFO: Preamble detected
INFO: on_preamble_detected
INFO: irq_regs = 0x10
INFO: Header valid
INFO: on_header_valid
INFO: irq_regs = 0x02
INFO: Rx done
Packet content - (21 bytes):
 2D 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
 10 11 12 13 14
INFO: Packet status:
INFO:   - RSSI packet = -78 dBm
INFO:   - Signal RSSI packet = -79 dBm
INFO:   - SNR packet = 7 dB

小结:结合上边代码和log分析,产生了Header error中断后,radio也不会停止接收本包,也不会立马产生Header error中断,而是等产生Rx done中断后,两个中断一起产生。(注意本代码在检测到Header error时,没有任何处理,使用者可以自己添加逻辑决定是否要丢弃本包。)

2.3 产生了CRC error中断后,radio芯片会继续接收本包还是立马丢弃本包?Rx done和CRC error中断是否应该嵌套处理?

准备两个devices,一个TX,一个RX。
log结果如下:

INFO: irq_regs = 0x04
INFO: Preamble detected
INFO: on_preamble_detected
INFO: irq_regs = 0x10
INFO: Header valid
INFO: on_header_valid
INFO: irq_regs = 0x42 //此处0x22代表两个中断,一个 Rx done,一个CRC error。
INFO: Rx done
Packet content - (21 bytes):
 B5 01 02 03 04 05 06 9E 48 CD A2 7F 09 BF E9 B1
 BD 01 3B 81 AF
INFO: Packet status:
INFO:   - RSSI packet = -78 dBm
INFO:   - Signal RSSI packet = -80 dBm
INFO:   - SNR packet = 4 dB
ERROR: CRC error
INFO: on_crc_error

小结:首先,即使产生了CRC error中断,radio也不会停止接收本包,也不会立马产生CRC error中断,而是等产生Rx done中断后,两个中断一起产生。本套代码Rx done和CRC error中断没有嵌套处理,但在做项目应用时,建议做嵌套处理,即本包产生CRC error了,就丢掉。

2.4 如果不清除中断,radio的中断引脚DIOx是不是一直是高电平?

答案是的,我们知道MCU需要使用一个GPIO pin连接radio的DIOx引脚,并配置为输入、上升沿中断,来检测DIOx引脚的中断。如果中断来了,DIOx引脚会从低电平拉高。接下来就需要MCU去读取radio中断标志位了,读完清除,下边的程序是对sx126x_get_and_clear_irq_status()封装。如果不清除,则DIOx引脚会一直处于高电平

sx126x_status_t sx126x_get_and_clear_irq_status( const void* context, sx126x_irq_mask_t* irq )
{
    sx126x_irq_mask_t sx126x_irq_mask = SX126X_IRQ_NONE;

    sx126x_status_t status = sx126x_get_irq_status( context, &sx126x_irq_mask );

    if( ( status == SX126X_STATUS_OK ) && ( sx126x_irq_mask != 0 ) )
    {
        status = sx126x_clear_irq_status( context, sx126x_irq_mask );
    }
    if( ( status == SX126X_STATUS_OK ) && ( irq != NULL ) )
    {
        *irq = sx126x_irq_mask;
    }
    return status;
}

2.5 如何正确配置中断?

下边程序是对中断配置函数的注释。

/**
 1. @brief Set which interrupt signals are redirected to the dedicated DIO pin
 2.  3. @remark By default, no interrupt signal is redirected.
 3.  5. @remark An interrupt will not occur until it is enabled system-wide, even if it is redirected to a specific DIO.
 4.  7. @remark The DIO pin will remain asserted until all redirected interrupt signals are cleared with a call to @ref
 5. sx126x_clear_irq_status.
 6.  10. @remark DIO2 and DIO3 are shared with other features. See @ref sx126x_set_dio2_as_rf_sw_ctrl and @ref
 7. sx126x_set_dio3_as_tcxo_ctrl
 8.  13. @param [in] context Chip implementation context
 9. @param [in] irq_mask Variable that holds the system interrupt mask
 10. @param [in] dio1_mask Variable that holds the interrupt mask for dio1
 11. @param [in] dio2_mask Variable that holds the interrupt mask for dio2
 12. @param [in] dio3_mask Variable that holds the interrupt mask for dio3
 13.  19. @returns Operation status
 14.  21. @see sx126x_clear_irq_status, sx126x_get_irq_status, sx126x_set_dio2_as_rf_sw_ctrl, sx126x_set_dio3_as_tcxo_ctrl
 */
sx126x_status_t sx126x_set_dio_irq_params( const void* context, const uint16_t irq_mask, const uint16_t dio1_mask,
                                           const uint16_t dio2_mask, const uint16_t dio3_mask );

讲一下使用的重点,第二参数irq_mask决定了要打开哪些中断,第三个参数dio1_mask决定了将哪些中断映射到DIO1引脚上。举个例子说明用法,如果配置第二个参数打开Preamble detected、Header valid和Rx done中断,分两种情况:

  1. 第三个参数只配置了Rx done中断,则结果就是接收完一包后,DIOx只会产生一次中断(而不是三次),但使用函数sx126x_get_irq_status()读出的中断标志位irq_regs有三个标志位,即Preamble detected、Header valid和Rx done。
  2. 如果第三个参数也配置了Preamble detected、Header valid和Rx done三个中断,则结果就是在接收这个包的过程中,DIOx会产生三次中断,所以中断处理函数会被调用三次,顺序是Preamble detected -> Header valid -> Rx done。

建议,在使用的时候,只配置希望用到的中断,将第二个和第三个参数配置成一样的,并且打开了哪些中断,哪些中断回调函数要有相应处理逻辑。这样做不仅可以避免代码逻辑漏洞,也可以减少MCU和radio的工作量。

    sx126x_set_dio_irq_params( context, 
    SX126X_IRQ_TX_DONE | SX126X_IRQ_RX_DONE | SX126X_IRQ_TIMEOUT | SX126X_IRQ_HEADER_ERROR | SX126X_IRQ_CRC_ERROR,
    SX126X_IRQ_TX_DONE | SX126X_IRQ_RX_DONE | SX126X_IRQ_TIMEOUT | SX126X_IRQ_HEADER_ERROR | SX126X_IRQ_CRC_ERROR,
    SX126X_IRQ_NONE,
    SX126X_IRQ_NONE );

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

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

相关文章

语言中的类型转换

编程语言中必然有很多情况需要转换类型。比如引入const的概念就为了提高安全性,编译器提前检查,避免一些意外修改。当然,有时,我们希望手动转换一个变量的类型,让其变成常量,可以利用编译器提供的cast方法。…

保隆科技半年报:净利同比下滑近两成,ADAS/空悬业务仍亏损

2024年上半年,在全球产业链调整、局部战争仍未平息等事件长期影响下,叠加主要经济体货币政策调整、债务风险上升等周期性因素,全球经济复苏面临较大不确定性,汽车市场尚处在缓慢恢复阶段。 这也导致不少汽车零部件上市公司的半年报…

SQL语言的规则和规范

规则 是什么呢,规则就是我们最基本,每时每刻都要遵守的比如人行道靠右,不能逆行, 规范 呢就是锦上添花,如果你不这么做,是不那么道德,不那么好的,就像小学生见到老师要问好&#…

SAP HCM 如何追踪Z表的日志修改记录

导读 INTRODUCTION 日志记录:这几天遇到一个问题,就是查谁修改Z表的数据,因为HCM系统大部分都是信息类型,信息类型修改是有专门一套的处理机制,那么Z开头的表是不是也有追踪的一套机制。今天我们分析下如何开启Z表追…

新生自我介绍ppt怎么做?用这款在线PPT软件一键自动生成!

新学期伊始,初一新生除了适应新的学习环境,还要制作新生自我介绍ppt,让同学们更好地相互了解彼此,自我介绍成为了一项重要的流程。制作一份精美的自我介绍PPT,无疑能够让你在新班级中脱颖而出,给同学们留下…

Mysql之存储引擎概述

文章目录 存储引擎MySQL体系结构存储引擎特点InnoDBMyISAMMemory总结 存储引擎选择 存储引擎 MySQL体系结构 连接层:最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所…

基于python学生信息成绩的管理系统设计与实现,很详细!

需求分析 1.1数据操纵 (1)录入并保存学生的基本信息及选课信息(如学号、姓名、性别、专业、课程名称、课程成绩); (2)可以对已经保存的学生基本信息及选课信息进行修改; &#x…

字符串(4题)

目录 1.最长公共前缀 2.最长回文串 3.二进制求和 4.字符串相乘 1.最长公共前缀 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string longestCommonPrefix(vector<string>& strs) {string ret;int cur 0;while(1){if(strs[0].size() cu…

YOLOv8改进 | 模块缝合 | C2f 融合REPVGGOREPA提升检测性能【详细步骤 完整代码】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

记一种常用的实时数据同步方案:Canal+Kafka+Flume

记一种常用的实时数据同步方案&#xff1a;CanalKafkaFlume 在当今数据驱动的业务环境中&#xff0c;数据同步是确保系统间数据一致性的关键环节。一种高效、稳定且可扩展的数据同步方案对于支撑企业的数据处理和分析需求至关重要。本文将介绍一种结合了Canal、Kafka和Flume的…

【unity游戏开发】Blender导出到Unity,带texture

【背景】 上一篇完成了将Mixamo的动画应用到blender的fbx模型中。但是默认配置导出fbx又导入Unity后发现Texture都没了(mesh和rig都在)。如何将Texture也一并导入呢? 【要点】 Blender导出后的FBX展开Mesh的名称不是文件名称,而是同Blender中的Mesh名称。可以根据这一点…

【案例66】支付指令客户端崩溃分析全过程

问题现象 月底&#xff0c;需要给人员开工资&#xff0c;但是财务人员在点击【支付状态指令】节点&#xff0c;点击状态确认后&#xff0c;系统直接崩溃&#xff0c;页面都卡掉。人员已经2天未发工资&#xff0c;情况比较紧急。 更改Uclient模式从分离模式改为嵌入模式&#x…

【linux002】目录操作命令篇 - ls 命令

文章目录 1、基本用法2、常见选项3、举例演示4、注意事项 ls 命令在 Linux 中用于列出目录内容。它有许多选项和参数可以用来调整显示的格式和内容。 1、基本用法 ls [选项] [文件或目录]2、常见选项 -a 或 --all&#xff1a;显示所有文件&#xff0c;包括以点.开头的隐藏文件…

【最新华为OD机试E卷】最左侧冗余覆盖子串(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

第一个Java程序 - Java学习日记 DAY1

第一个Java程序 在文件夹中&#xff0c;新建一个文本文件 重命名为&#xff1a;helloworld.java 用记事本打开此文件&#xff0c;编写第一行 此时&#xff0c;我们创建了一个公开的类&#xff0c;类名叫helloworld&#xff0c;需要注意类名要和文件名的名字一致 第二行是公开…

MySQL record

更改密码&#xff1a; alter user rootlocalhost identified with mysql_native_password by ‘123456’; 注意&#xff1a; 在命令行方式下&#xff0c;每条MySQL的命令都是以分号结尾的&#xff0c;如果不加分号&#xff0c;MySQL会继续等待用户输入命令&#xff0c;直到MyS…

10.7 URL

万维网 真题

前端面试体——项目介绍以及SPA介绍

谈谈你开发的项目背景与、架构和技术栈 项目背景 假设我们正在开发一个名为“智慧旅游助手”的Web平台。该平台旨在为用户提供一站式的旅游服务&#xff0c;包括目的地推荐、酒店预订、行程规划、在线购票&#xff08;如门票、机票&#xff09;、旅游攻略分享以及基于地理位置…

电脑图片只显示图标不显示图片,但是可以打开看,就是不能预览

电脑图片只显示图标不显示图片&#xff0c;但是可以打开看&#xff0c;就是不能预览 例如&#xff1a;不能显示出图片内容 解决方法&#xff1a;我的电脑&#xff08;计算机&#xff09;-右键-属性-高级系统设置-高级-性能-设置-找到&#xff08;显示缩略图&#xff0c;而不是…