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模块的中断处理可以与主循环很好地集成,同时保持代码的清晰性和可维护性。

相关推荐
lipengxs2 天前
PlantUML、Mermaid、SQL ER、OpenAPI 在线预览工具整理
ai·编辑器·流程图·uml
程思扬4 天前
Android 大厂编码规范
android·网络·安全·开源·流程图
相忘于江湖4265436 天前
【deepseek + draw.io 】生成流程图
流程图·draw.io
blue_dou6 天前
架构与能力边界解析:七款CRM产品四大核心维度对比测评
大数据·架构·逻辑回归·流程图
zincsweet10 天前
Linux 命名管道(FIFO)详解:原理分析、源码封装与通信流程图解
linux·服务器·c++·流程图
优思学苑12 天前
价值流程图:看到流程,而不只是步骤【精益管理CLMP】
流程图
bug总结13 天前
前端流程图vueflow
前端·流程图
米饭不加菜14 天前
Mermaid 流程图语法参考四
流程图
米饭不加菜16 天前
Mermaid 流程图语法参考三
流程图
米饭不加菜17 天前
Typora 原生流程图语法完全指南(Flowchart.js)
前端·javascript·流程图