lora2_main.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. --[[
  2. @module lora2_main
  3. @summary lora2功能测试主模块
  4. @version 1.0
  5. @date 2025.11.20
  6. @author 王世豪
  7. @usage
  8. 本功能模块演示的内容为:
  9. 1. lora2设备初始化与配置
  10. 2. SPI接口初始化
  11. 3. 发送和接收参数配置
  12. 4. 事件回调处理
  13. 5. 发送和接收任务管理
  14. 本文件没有对外接口,直接在main.lua中require "lora2_main"就可以加载运行;
  15. ]]
  16. -- 加载依赖模块
  17. local lora2_sender = require "lora2_sender"
  18. local lora2_receiver = require "lora2_receiver"
  19. local TASK_NAME = "lora2_task"
  20. local spi_id = 1 -- SPI接口ID
  21. local pin_cs = 12 -- 片选引脚
  22. local pin_reset = 1 -- 复位控制引脚
  23. local pin_busy = 16 -- 忙状态指示引脚
  24. local pin_dio1 = 17 -- DIO1引脚
  25. local RECEIVE_TIMEOUT = 3000 -- 接收超时时间3秒
  26. --[[
  27. event值有:
  28. tx_done -- 发送完成:数据已成功发送
  29. rx_done -- 接收完成:成功接收到数据
  30. rx_timeout -- 接收超时:在指定时间内未收到数据
  31. rx_error -- 接收错误:接收过程中发生错误
  32. __]]
  33. function callback(lora_device, event, data, size)
  34. if event == "tx_done" then
  35. sys.sendMsg(TASK_NAME, "LORA_EVENT", "tx_done")
  36. elseif event == "rx_done" then
  37. sys.sendMsg(TASK_NAME, "LORA_EVENT", "rx_done", data, size)
  38. elseif event == "rx_timeout" then
  39. sys.sendMsg(TASK_NAME, "LORA_EVENT", "rx_timeout")
  40. elseif event == "rx_error" then
  41. sys.sendMsg(TASK_NAME, "LORA_EVENT", "rx_error")
  42. else
  43. log.warn("未知事件类型:", event)
  44. end
  45. end
  46. local function lora2_init()
  47. -- 初始化SPI
  48. spi_lora = spi_lora or spi.deviceSetup(spi_id,pin_cs,0,0,8,10*1000*1000,spi.MSB,1,0)
  49. if not spi_lora then
  50. log.error("spi_lora init failed")
  51. return false
  52. end
  53. -- 初始化LORA2设备
  54. -- 当前支持型号:llcc68, sx1268
  55. lora_device = lora_device or lora2.init("llcc68",{res = pin_reset,busy = pin_busy,dio1 = pin_dio1},spi_lora)
  56. if not lora_device then
  57. log.error("lora_device init failed")
  58. return false
  59. end
  60. log.info("lora_device",lora_device)
  61. -- 设置频道频率为433MHz
  62. lora_device:set_channel(433000000)
  63. -- 配置 lora 设备的发送参数
  64. lora_device:set_txconfig({
  65. mode=1,
  66. power=22,
  67. fdev=0,
  68. bandwidth=0,
  69. datarate=9,
  70. coderate=4,
  71. preambleLen=8,
  72. fixLen=false,
  73. crcOn=true,
  74. freqHopOn=0,
  75. hopPeriod=0,
  76. iqInverted=false
  77. })
  78. -- 配置 lora 设备的接收参数
  79. lora_device:set_rxconfig({
  80. mode=1,
  81. bandwidth=0,
  82. datarate=9,
  83. coderate=4,
  84. bandwidthAfc=0,
  85. preambleLen=8,
  86. symbTimeout=0,
  87. fixLen=false,
  88. payloadLen=0,
  89. crcOn=true,
  90. freqHopOn=0,
  91. hopPeriod=0,
  92. iqInverted=false,
  93. rxContinuous=false
  94. })
  95. return true
  96. end
  97. local function lora2_main_task_func()
  98. local result,msg
  99. while true do
  100. result = lora2_init()
  101. if not result then
  102. log.info("lora2_init error")
  103. goto EXCEPTION_PROC
  104. end
  105. -- 注册回调
  106. lora_device:on(callback)
  107. -- 默认初始化后启动接收
  108. lora_device:recv(RECEIVE_TIMEOUT)
  109. --- 发送设备就绪事件,将lora_device传递给sender模块
  110. sys.sendMsg(lora2_sender.TASK_NAME, "LORA_EVENT", "DEVICE_READY", lora_device)
  111. while true do
  112. msg = sys.waitMsg(TASK_NAME, "LORA_EVENT")
  113. if msg[2]== "tx_done" then
  114. log.info("lora2_main", "发送完成")
  115. -- 通知sender模块发送完成
  116. sys.sendMsg(lora2_sender.TASK_NAME, "LORA_EVENT", "TX_DONE")
  117. -- 发送完成后启动接收
  118. lora_device:recv(RECEIVE_TIMEOUT)
  119. elseif msg[2]== "rx_done" then
  120. log.info("lora2_main", "接收完成", "数据长度:", msg[4])
  121. -- 交由receiver模块处理数据
  122. lora2_receiver.proc(msg[3], msg[4], lora_device)
  123. -- 处理完成后启动接收
  124. lora_device:recv(RECEIVE_TIMEOUT)
  125. elseif msg[2]== "rx_timeout" then
  126. log.info("lora2_main", "接收超时")
  127. -- 接收超时后继续接收
  128. lora_device:recv(RECEIVE_TIMEOUT)
  129. -- 接收过程中发生错误
  130. elseif msg[2]== "rx_error" then
  131. log.info("lora2_main", "接收错误")
  132. -- 接收错误后继续接收
  133. lora_device:recv(RECEIVE_TIMEOUT)
  134. end
  135. end
  136. -- 出现异常
  137. ::EXCEPTION_PROC::
  138. -- 清空此task绑定的消息队列中的未处理的消息
  139. sys.cleanMsg(TASK_NAME)
  140. sys.wait(5000)
  141. end
  142. end
  143. sys.taskInitEx(lora2_main_task_func, TASK_NAME)