RadioIrqProcess函数详细分析与流程图
RadioIrqProcess函数详细分析与流程图
函数功能分析
RadioIrqProcess
函数是SX126x LoRa模块的中断处理核心函数,负责检测和处理所有来自LoRa模块的中断事件。该函数通过轮询方式检查DIO引脚状态,而不是使用中断驱动方式。
函数执行流程
- 检查DIO引脚状态:通过读取DIO引脚电平判断是否有中断发生
- 获取中断状态:读取SX126x的中断状态寄存器
- 清除中断标志:清除所有中断标志位
- 处理各类中断事件:根据中断状态寄存器的值,调用相应的回调函数
详细流程图
中断类型详细说明
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模块的各种中断事件:
- Alarm A中断:读取传感器数据 → 进入Stop模式
- Alarm B中断:唤醒系统 → 发送数据 → 等待响应
- 主循环:不断调用
RadioIrqProcess
处理LoRa中断 - 中断处理:
- 如果是
TX_DONE
,切换到接收模式 - 如果是
RX_DONE
,处理响应并进入Stop模式 - 如果是超时或错误,直接进入Stop模式
- 如果是
注意事项
- 轮询方式:当前实现使用轮询DIO引脚的方式,而不是真正的中断驱动
- 性能考虑:频繁调用此函数可能会增加CPU负载,在低功耗应用中需要注意
- 中断标志清除:函数会清除所有中断标志,确保不会重复处理同一中断
- 回调函数检查:每次调用回调函数前都会检查是否为NULL,避免空指针异常
- SPI操作:函数内部包含SPI读写操作,确保SPI配置正确且无冲突
这种设计使得LoRa模块的中断处理可以与主循环很好地集成,同时保持代码的清晰性和可维护性。