当前位置: 首页 > ds >正文

RadioIrqProcess函数详细分析与流程图

RadioIrqProcess函数详细分析与流程图

函数功能分析

RadioIrqProcess函数是SX126x LoRa模块的中断处理核心函数,负责检测和处理所有来自LoRa模块的中断事件。该函数通过轮询方式检查DIO引脚状态,而不是使用中断驱动方式。

函数执行流程

  1. 检查DIO引脚状态:通过读取DIO引脚电平判断是否有中断发生
  2. 获取中断状态:读取SX126x的中断状态寄存器
  3. 清除中断标志:清除所有中断标志位
  4. 处理各类中断事件:根据中断状态寄存器的值,调用相应的回调函数

详细流程图

TX模式
RX模式
开始RadioIrqProcess
DIO引脚为高电平?
退出函数
设置IrqFired = false
读取中断状态寄存器irqRegs
清除所有中断标志
检查中断类型
TX_DONE
RadioEvents->TxDone != NULL?
调用TxDone回调
RX_DONE
RadioEvents->RxDone != NULL?
读取Payload和状态
调用RxDone回调
CRC_ERROR
RadioEvents->RxError != NULL?
调用RxError回调
CAD_DONE
RadioEvents->CadDone != NULL?
检查活动检测标志
调用CadDone回调
RX_TX_TIMEOUT
检查当前操作模式
RadioEvents->TxTimeout != NULL?
调用TxTimeout回调
PREAMBLE_DETECTED
RadioEvents->RxTimeout != NULL?
调用RxTimeout回调
SYNCWORD_VALID
HEADER_VALID
HEADER_ERROR
RadioEvents->RxTimeout != NULL?
调用RxTimeout回调
所有中断处理完成
退出函数

中断类型详细说明

1. TX_DONE (发送完成)

  • 触发条件:数据包发送完成
  • 处理动作:调用TxDone回调函数
  • 应用场景:发送数据后切换到接收模式等待响应

2. RX_DONE (接收完成)

  • 触发条件:成功接收到数据包
  • 处理动作
    • 读取接收到的数据 payload
    • 获取数据包状态(RSSI, SNR等)
    • 调用RxDone回调函数
  • 应用场景:处理网关的响应数据

3. CRC_ERROR (CRC错误)

  • 触发条件:接收到的数据包CRC校验失败
  • 处理动作:调用RxError回调函数
  • 应用场景:处理接收错误,可能重试或放弃

4. CAD_DONE (信道活动检测完成)

  • 触发条件:信道活动检测操作完成
  • 处理动作
    • 检查是否检测到活动
    • 调用CadDone回调函数
  • 应用场景:LoRaWAN中的CAD功能,检测信道是否空闲

5. RX_TX_TIMEOUT (收发超时)

  • 触发条件:接收或发送操作超时
  • 处理动作
    • 根据当前操作模式(TX或RX)
    • 调用相应的超时回调函数
  • 应用场景:处理发送或接收超时情况

6. PREAMBLE_DETECTED (前导码检测)

  • 触发条件:检测到前导码
  • 处理动作:无操作(可添加自定义处理)
  • 应用场景:高级应用中可以用于信号检测统计

7. SYNCWORD_VALID (同步字有效)

  • 触发条件:同步字匹配成功
  • 处理动作:无操作(可添加自定义处理)
  • 应用场景:验证数据包的有效性

8. HEADER_VALID (包头有效)

  • 触发条件:包头CRC校验成功
  • 处理动作:无操作(可添加自定义处理)
  • 应用场景:验证包头的完整性

9. HEADER_ERROR (包头错误)

  • 触发条件:包头CRC校验失败
  • 处理动作:调用RxTimeout回调函数
  • 应用场景:处理包头错误,视为接收超时

与系统流程的整合

在您描述的系统流程中,RadioIrqProcess函数将在主循环中被频繁调用,用于处理LoRa模块的各种中断事件:

  1. Alarm A中断:读取传感器数据 → 进入Stop模式
  2. Alarm B中断:唤醒系统 → 发送数据 → 等待响应
  3. 主循环:不断调用RadioIrqProcess处理LoRa中断
  4. 中断处理
    • 如果是TX_DONE,切换到接收模式
    • 如果是RX_DONE,处理响应并进入Stop模式
    • 如果是超时或错误,直接进入Stop模式

注意事项

  1. 轮询方式:当前实现使用轮询DIO引脚的方式,而不是真正的中断驱动
  2. 性能考虑:频繁调用此函数可能会增加CPU负载,在低功耗应用中需要注意
  3. 中断标志清除:函数会清除所有中断标志,确保不会重复处理同一中断
  4. 回调函数检查:每次调用回调函数前都会检查是否为NULL,避免空指针异常
  5. SPI操作:函数内部包含SPI读写操作,确保SPI配置正确且无冲突

这种设计使得LoRa模块的中断处理可以与主循环很好地集成,同时保持代码的清晰性和可维护性。

http://www.xdnf.cn/news/18405.html

相关文章:

  • for-else 流程控制结构介绍
  • 3、栈和队列
  • LG P3710 方方方的数据结构 Solution
  • 指针的应用学习日记
  • 算法训练营day55 图论⑤ 并查集理论基础、107. 寻找存在的路径
  • 信号和共享内存
  • Linux------《零基础到联网:CentOS 7 在 VMware Workstation 中的全流程安装与 NAT 网络配置实战》
  • Visual Studio 2022+OpenCV-Python安装及配置方法
  • 涡流-信号完整性分析
  • pytest高级用法之插件开发
  • 1A AMOLED显示屏电源芯片BCT1838
  • 01-Docker-简介、安装与使用
  • Day09 Go语言深入学习(1)
  • 进程与线程
  • langchain的简单应用案例---(1)使用langchain构建本地知识库
  • K近邻算法(knn)
  • 基于 RxJava 构建强大的 Android 文件下载管理器
  • Android SystemServer 中 Service 的创建和启动方式
  • AI与大数据驱动下的食堂采购系统源码:供应链管理平台的未来发展
  • Git#cherry-pick
  • QT示例 基于Subdiv2D的Voronoi图实现鼠标点击屏幕碎裂掉落特效
  • Day22 顺序表与链表的实现及应用(含字典功能与操作对比)
  • 服务器无公网ip如何对外提供服务?本地网络只有内网IP,如何能被外网访问?
  • Vue.prototype 的作用
  • JUC之CompletableFuture【中】
  • Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
  • FPGA 在情绪识别领域的护理应用(一)
  • 论文阅读系列(一)Qwen-Image Technical Report
  • 中和农信如何打通农业科技普惠“最后一百米”
  • 企业架构是什么?解读