sx126x_driver.lua 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. --- 模块功能:sx126x模块驱动
  2. -- 读取FLASH ID
  3. -- @author openLuat
  4. -- @module spi.testSpiFlash
  5. -- @license MIT
  6. -- @copyright openLuat
  7. -- @release 2018.03.27
  8. module(...,package.seeall)
  9. require"utils"
  10. require"pm"
  11. pm.wake("wake11")
  12. require"pins"
  13. -- require "sx126x_reg"
  14. require "Drv_spi"
  15. require "sx126x_reg"
  16. -- TODU: 驱动文件要分开。我把redio.c的函数放到了驱动里面了,为了方便调试。
  17. pmd.ldoset(2,pmd.LDO_VMMC)
  18. pmd.ldoset(2,pmd.LDO_VLCD)
  19. local SX126x = json.encode(sx126x_reg.SX126x_t)
  20. local SX126xCopy,result,errinfo = json.decode(SX126x)
  21. SX126x = nil
  22. local ImageCalibrated = false
  23. local FREQ_STEP = 0.95367431640625
  24. local RadioPublicNetwork_t = {
  25. Previous = false,
  26. Current = false
  27. }
  28. RadioPublicNetwork = RadioPublicNetwork_t
  29. SX126xResetGPIO = pins.setup(pio.P0_13,0)
  30. SX126xTXENGPIO = pins.setup(pio.P0_27,1)
  31. SX126xRXENGPIO = pins.setup(pio.P0_28,0)
  32. function setTransmitMode()
  33. sys.wait(100)
  34. SX126xTXENGPIO(1)
  35. SX126xRXENGPIO(0)
  36. sys.wait(100)
  37. end
  38. function setReceiveMode()
  39. -- SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC)
  40. sys.wait(100)
  41. SX126xTXENGPIO(0)
  42. SX126xRXENGPIO(1)
  43. sys.wait(100)
  44. end
  45. -- local getGpio19Fnc = pins.setup(pio.P0_24)
  46. -- sys.timerLoopStart(function()
  47. -- log.info("testGpioSingle.getGpio19Fnc",getGpio19Fnc())
  48. -- end,1000)
  49. -- function gpio13IntFnc(msg)
  50. -- log.info("testGpioSingle.gpio24IntFnc",msg,getGpio13Fnc())
  51. -- --上升沿中断
  52. -- if msg==cpu.INT_GPIO_POSEDGE then
  53. -- --下降沿中断
  54. -- else
  55. -- end
  56. -- end
  57. pio.pin.setdebounce(0xffffffff)
  58. --GPIO13配置为中断,可通过getGpio13Fnc()获取输入电平,产生中断时,自动执行gpio13IntFnc函数
  59. -- getGpio13Fnc = pins.setup(pio.P0_24,gpio13IntFnc)
  60. function gpio4IntFnc(msg)
  61. -- log.info("testGpioSingle.gpio4IntFnc",msg,getGpio4Fnc())
  62. --上升沿中断
  63. if msg==cpu.INT_GPIO_POSEDGE then
  64. sys.publish("LORA_CALL_BACK")
  65. -- log.info("我是中断")
  66. --下降沿中断
  67. else
  68. end
  69. end
  70. --GPIO13配置为中断,可通过getGpio13Fnc()获取输入电平,产生中断时,自动执行gpio13IntFnc函数
  71. getGpio4Fnc = pins.setup(pio.P0_4,gpio4IntFnc)
  72. OperatingMode = sx126x_reg.RadioStandbyModes_t.STDBY_RC
  73. function stringToHex(str)
  74. local hex = {}
  75. for i = 1, #str do
  76. local byte = string.byte(str, i)
  77. hex[#hex + 1] = string.format("%02x", byte)
  78. end
  79. return table.concat(hex)
  80. end
  81. function gsonLoginfo(data)
  82. local jsondata = json.encode(data)
  83. -- log.info("SX126xSetModulationParams.encode",jsondata)
  84. end
  85. -- 初始化SPI
  86. function SX126xIoInit()
  87. Drv_spi.SPI_GPIO_Init()
  88. end
  89. -- 复位SX126x
  90. function SX126xReset()
  91. sys.wait(10)
  92. SX126xResetGPIO(0)
  93. sys.wait(20)
  94. SX126xResetGPIO(1)
  95. sys.wait(10)
  96. end
  97. function SX126xWakeup()
  98. local command = sx126x_reg.RadioCommands.RADIO_GET_STATUS .. "00"
  99. local ret = Drv_spi.drv_spi_read_write_byte(command,1)
  100. -- log.info("SX126xWakeup",ret)
  101. end
  102. --命令写入 完成
  103. function SX126xWriteCommand(command,buffer)
  104. local bufferTotal = ""
  105. for i, num in ipairs(buffer) do
  106. bufferTotal = bufferTotal .. num
  107. end
  108. Drv_spi.drv_spi_read_write_byte(command .. bufferTotal,0)
  109. -- 50
  110. -- sys.wait(20)
  111. -- Drv_spi.drv_spi_read_write_byte(bufferTotal,0)
  112. -- local ret = Drv_spi.drv_spi_read_write_byte("1d07400000",1);
  113. -- log.info("SX126xWriteCommand",Drv_spi.drv_spi_read_write_byte(bufferTotal,1))
  114. end
  115. function SX126xReadCommand(command,size)
  116. -- Drv_spi.drv_spi_read_write_byte(command,0)
  117. for i = 1, size do
  118. command = command .. "00"
  119. end
  120. local ret = Drv_spi.drv_spi_read_write_byte(command,size)
  121. -- Drv_spi.drv_spi_read_write_byte(command,0)
  122. -- log.info("SX126xReadCommand",ret)
  123. return ret
  124. end
  125. -- -----------------------------------------------SPI基础读写---------------------------------------------------
  126. -- 读取寄存器 完成
  127. function SX126xReadRegisters(address,size)
  128. Drv_spi.drv_spi_read_write_byte(sx126x_reg.RadioCommands.RADIO_READ_REGISTER,0)
  129. -- sys.wait(20)
  130. local sendData = address .. "00"
  131. local receiverDataCount= size
  132. while size > 0 do
  133. sendData = sendData .. "00"
  134. size = size - 1
  135. end
  136. local result = Drv_spi.drv_spi_read_write_byte(sendData,receiverDataCount) --这里乘2的意思是,16进制是两位,但是转成字符串的形式就是4位了。
  137. -- log.info("SX126xReadRegisters",result)
  138. return result
  139. end
  140. --封装后的读寄存器
  141. function SX126xReadRegister(address)
  142. local ret = SX126xReadRegisters(address,1)
  143. return ret
  144. end
  145. -- 写入寄存器
  146. function SX126xWriteRegisters(address,buffer)
  147. local bufferTotal = ""
  148. Drv_spi.drv_spi_read_write_byte(sx126x_reg.RadioCommands.RADIO_WRITE_REGISTER,0)
  149. sys.wait(20)
  150. for i, data in ipairs(buffer) do
  151. bufferTotal = bufferTotal .. data
  152. end
  153. local test = address .. bufferTotal
  154. -- log.info("SX126xWriteRegisters",bufferTotal)
  155. Drv_spi.drv_spi_read_write_byte(test,0);
  156. end
  157. function SX126xWriteRegister(address,value)
  158. SX126xWriteRegisters( address,value);
  159. end
  160. function SX126xSetStandby(standbyConfig)
  161. SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_STANDBY,{standbyConfig})
  162. -- log.info("SX126xSetStandby_操作模式",standbyConfig)
  163. if standbyConfig == sx126x_reg.RadioStandbyModes_t.STDBY_RC then
  164. OperatingMode = sx126x_reg.RadioStandbyModes_t.STDBY_RC
  165. else
  166. OperatingMode = sx126x_reg.RadioStandbyModes_t.STDBY_XOSC
  167. end
  168. end
  169. function SX126xSetRegulatorMode(mode)
  170. SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_REGULATORMODE,{mode})
  171. end
  172. function SX126xSetBufferBaseAddress(txBaseAddress, rxBaseAddress)
  173. local buf = {txBaseAddress,rxBaseAddress}
  174. SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_BUFFERBASEADDRESS,buf)
  175. end
  176. function SX126xSetPaConfig(paDutyCycle,hpMax,deviceSel,paLut)
  177. local buf = {paDutyCycle,hpMax,deviceSel,paLut}
  178. SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_PACONFIG,buf)
  179. -- log.info("SX126xSetPaConfig",sx126x_reg.RadioCommands.RADIO_SET_PACONFIG)
  180. end
  181. function SX126xSetTxParams(power, rampTime)
  182. local buf = {power,rampTime}
  183. SX126xSetPaConfig("04","07","00","01")
  184. SX126xWriteRegister( sx126x_reg.REG_OCP, {"38"} )
  185. SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_TXPARAMS,buf)
  186. end
  187. -- function SX126xSetDioIrqParams2222(timeout, freq, rfChain, power, preambleLen)
  188. -- local buf = {timeout, freq, rfChain, power, preambleLen}
  189. -- SX126xSetTxParams(power, sx126x_reg.RadioRampTimes_t.RADIO_RAMP_40_US)
  190. -- SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_TX,buf)
  191. -- end
  192. -- 工具函数:16位数拆分为高字节 + 低字节
  193. -- 辅助函数:将16位数字拆分为高字节和低字节(返回数值)
  194. -- 对齐C语言逻辑:先高字节,后低字节
  195. local function to_2byte(num)
  196. local high = bit.band(bit.rshift(num, 8), 0xFF) -- 高8位(与C语言(irqMask >> 8) & 0xFF一致)
  197. local low = bit.band(num, 0xFF) -- 低8位(与C语言irqMask & 0xFF一致)
  198. return high, low -- 注意:返回顺序是高字节在前,低字节在后
  199. end
  200. function SX126xSetDioIrqParams(irqMask, dio1Mask, dio2Mask, dio3Mask)
  201. -- 1. 将输入参数转为16位数字(支持十六进制字符串或数字)
  202. local function to_num(val)
  203. if type(val) == "string" then
  204. return tonumber(val, 16) or 0 -- 处理十六进制字符串(如"0x80"或"80")
  205. end
  206. return tonumber(val) or 0 -- 处理数字或无效值
  207. end
  208. -- 2. 转换所有掩码为数字
  209. irqMask = to_num(irqMask)
  210. dio1Mask = to_num(dio1Mask)
  211. dio2Mask = to_num(dio2Mask)
  212. dio3Mask = to_num(dio3Mask)
  213. -- 3. 拆分16位掩码为高字节和低字节(对齐C语言逻辑:高字节在前)
  214. local irq_high, irq_low = to_2byte(irqMask)
  215. local dio1_high, dio1_low = to_2byte(dio1Mask)
  216. local dio2_high, dio2_low = to_2byte(dio2Mask)
  217. local dio3_high, dio3_low = to_2byte(dio3Mask)
  218. -- 4. 构建缓冲区(8字节,与C语言buf顺序完全一致)
  219. -- 格式:[irq_high, irq_low, dio1_high, dio1_low, dio2_high, dio2_low, dio3_high, dio3_low]
  220. local buf_num = {
  221. irq_high, irq_low,
  222. dio1_high, dio1_low,
  223. dio2_high, dio2_low,
  224. dio3_high, dio3_low
  225. }
  226. -- 5. 将数字转为2位十六进制字符串(SPI通信要求)
  227. local buf_hex = {}
  228. for i, num in ipairs(buf_num) do
  229. table.insert(buf_hex, string.format("%02X", num)) -- 确保2位大写十六进制(如0x0A → "0A")
  230. end
  231. -- 6. 打印日志(验证格式是否正确)
  232. -- log.info("SX126xSetDioIrqParams", table.concat(buf_hex, " "))
  233. -- 7. 发送命令(写入8字节配置)
  234. SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_CFG_DIOIRQ, buf_hex)
  235. end
  236. function SX126xSetStopRxTimerOnPreambleDetect(enable)
  237. SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_STOPRXTIMERONPREAMBLE,{enable})
  238. end
  239. function SX126xSetLoRaSymbNumTimeout(SymbNum)
  240. SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_LORASYMBTIMEOUT,{SymbNum})
  241. end
  242. function SX126xSetPacketType(packetType)
  243. PacketType = packetType;
  244. SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_SET_PACKETTYPE,{PacketType})
  245. -- log.info("PacketType:",PacketType,sx126x_reg.RadioCommands.RADIO_SET_PACKETTYPE)
  246. end
  247. -- 原驱动好像并没有启用,不晓得这个是什么功能
  248. function RadioSetPublicNetwork(enable)
  249. SX126xSetPacketType(sx126x_reg.RadioPacketTypes_t.PACKET_TYPE_LORA)
  250. if enable == true then
  251. SX126xWriteRegister( sx126x_reg.REG_LR_SYNCWORD,{"07"});
  252. SX126xWriteRegister( sx126x_reg.REG_LR_SYNCWORD_LSB,{"40"});
  253. else
  254. SX126xWriteRegister( sx126x_reg.REG_LR_SYNCWORD, {"07"});
  255. SX126xWriteRegister( sx126x_reg.REG_LR_SYNCWORD_LSB, {"41"} );
  256. end
  257. end
  258. function RadioSetModem(modem)
  259. if modem == sx126x_reg.RadioModems_t.MODEM_FSK then
  260. -- 处理 FSK 调制的逻辑
  261. -- SX126xSetPacketType(sx126x_reg.RadioPacketTypes_t.PACKET_TYPE_GFSK)
  262. elseif modem == sx126x_reg.RadioModems_t.MODEM_LORA then
  263. SX126xSetPacketType(sx126x_reg.RadioPacketTypes_t.PACKET_TYPE_LORA)
  264. if RadioPublicNetwork.Current ~= RadioPublicNetwork.Previous then
  265. RadioPublicNetwork.Current = RadioPublicNetwork.Previous
  266. RadioSetPublicNetwork(RadioPublicNetwork.Current)
  267. end
  268. else
  269. -- 处理未知调制类型的逻辑
  270. print("错误:未知的调制类型")
  271. end
  272. end -- 增加了函数结束标记
  273. function SX126xSetModulationParams(modulationParams)
  274. buf = {modulationParams.Params.LoRa.SpreadingFactor,
  275. modulationParams.Params.LoRa.Bandwidth,
  276. modulationParams.Params.LoRa.CodingRate,
  277. modulationParams.Params.LoRa.LowDatarateOptimize
  278. }
  279. local jsondata = json.encode(buf)
  280. -- log.info("SX126xSetModulationParams.encode",jsondata)
  281. SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_SET_MODULATIONPARAMS,buf);
  282. end
  283. function SX126xSetPacketParams(packetParams)
  284. buf = { "00",
  285. packetParams.Params.LoRa.PreambleLength,
  286. packetParams.Params.LoRa.HeaderType,
  287. packetParams.Params.LoRa.PayloadLength,
  288. packetParams.Params.LoRa.CrcMode,
  289. packetParams.Params.LoRa.InvertIQ}
  290. -- local jsondata = json.encode(buf)
  291. -- log.info("SX126xSetPacketParams.encode",jsondata)
  292. SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_PACKETPARAMS,buf);
  293. end
  294. --[[
  295. modem : sx126x_reg.RadioModems_t.MODEM_LORA
  296. power : 22 = 16
  297. fdev : 0 = 0
  298. bandwidth : 2
  299. datarate : 11
  300. coderate : 1
  301. preambleLen : 12
  302. fixLen : false
  303. crcOn : true
  304. freqHopOn : false
  305. hopPeriod : 0
  306. iqInverted : 0
  307. timeout : 3000
  308. ]]
  309. -- MODEM_LORA 16 0 1 7 1 12 false true false 0 0 3000
  310. function RadioSetTxConfig(modem,power,fdev,bandwidth,datarate,coderate,preambleLen,fixLen,crcOn,freqHopOn,hopPeriod,iqInverted,timeout)
  311. SX126xSetStopRxTimerOnPreambleDetect("00") -- = flase
  312. SX126xSetLoRaSymbNumTimeout("00")
  313. SX126xCopy.ModulationParams.PacketType = sx126x_reg.RadioPacketTypes_t.PACKET_TYPE_LORA
  314. SX126xCopy.ModulationParams.Params.LoRa.SpreadingFactor = string.format("%02X", datarate)
  315. SX126xCopy.ModulationParams.Params.LoRa.Bandwidth = "05"
  316. SX126xCopy.ModulationParams.Params.LoRa.CodingRate= coderate
  317. if ( (bandwidth == 0) and ( (datarate == 11) or (datarate == 12) ) ) or ( (bandwidth == 1) and (datarate == 12) ) then
  318. SX126xCopy.ModulationParams.Params.LoRa.LowDatarateOptimize = "01"
  319. else
  320. SX126xCopy.ModulationParams.Params.LoRa.LowDatarateOptimize = "00"
  321. end
  322. -- SX126xCopy.ModulationParams.Params.LoRa.LowDatarateOptimize = "00"
  323. SX126xCopy.PacketParams.PacketType = sx126x_reg.RadioPacketTypes_t.PACKET_TYPE_LORA
  324. SX126xCopy.PacketParams.Params.LoRa.PreambleLength = preambleLen
  325. SX126xCopy.PacketParams.Params.LoRa.HeaderType = fixLen
  326. -- TODU:这里的FF写死了,应该不要写死。
  327. SX126xCopy.PacketParams.Params.LoRa.PayloadLength = "FF"
  328. SX126xCopy.PacketParams.Params.LoRa.CrcMode = crcOn
  329. SX126xCopy.PacketParams.Params.LoRa.InvertIQ = iqInverted
  330. -- gsonLoginfo("SX126xCopy",SX126xCopy.PacketParams.Params.LoRa)
  331. SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC)
  332. RadioSetModem(sx126x_reg.RadioModems_t.MODEM_LORA)
  333. SX126xSetModulationParams(SX126xCopy.ModulationParams)
  334. SX126xSetPacketParams(SX126xCopy.PacketParams)
  335. SX126xSetTxParams(power,sx126x_reg.RadioRampTimes_t.RADIO_RAMP_40_US)
  336. end
  337. function SX126xCalibrateImage(freq)
  338. local calFreq = {}
  339. if freq > 900000000 then
  340. calFreq = {"E1", "E9"}
  341. elseif freq > 850000000 then
  342. calFreq = {"D7", "D8"}
  343. elseif freq > 770000000 then
  344. calFreq = {"C1", "C5"}
  345. elseif freq > 460000000 then
  346. calFreq = {"75", "81"}
  347. elseif freq > 425000000 then
  348. calFreq = {"6B", "6F"}
  349. elseif freq >= 210000000 then
  350. calFreq = {"37", "41"}
  351. end
  352. SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_CALIBRATEIMAGE, calFreq)
  353. end
  354. function SX126xSetRfFrequency(frequency)
  355. local buf = {}
  356. local freq = 0
  357. if ImageCalibrated == false then
  358. SX126xCalibrateImage(frequency)
  359. ImageCalibrated = true
  360. end
  361. -- local FREQ_STEP = 0.95367431640625
  362. freq = frequency / FREQ_STEP
  363. -- log.info("freq", freq)
  364. -- log.info("freq", string.format("%02X", freq))
  365. SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_SET_RFFREQUENCY, {string.format("%02X", freq)});
  366. end
  367. function RadioSetChannel(frequency)
  368. SX126xSetRfFrequency(frequency)
  369. end
  370. function SX126xWriteBuffer(offset, buffer,size)
  371. -- log.info("SX126xWriteBuffer",offset,buffer,size)
  372. local sentdata = offset .. buffer
  373. Drv_spi.drv_spi_read_write_byte(sx126x_reg.RadioCommands.RADIO_WRITE_BUFFER,0)
  374. Drv_spi.drv_spi_read_write_byte(sentdata,10)
  375. end
  376. function SX126xSetPayload (payload,size)
  377. -- log.info("SX126xSetPayload",payload,size)
  378. SX126xWriteBuffer( "00", payload, size );
  379. end
  380. function SX126xSetTx(timeout)
  381. SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_SET_TX, {timeout});
  382. end
  383. function SX126xSendPayload(payload,size,timeout)
  384. -- log.info("SX126xSendPayload",payload,size,timeout)
  385. SX126xSetPayload( payload, size );
  386. SX126xSetTx( timeout );
  387. end
  388. function RadioSend(buffer,size,time_out)
  389. -- setTransmitMode()
  390. -- SX126xSetDioIrqParams( sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE + sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT, sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE + sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )--SX126xSetDioIrqParams( sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
  391. -- log.info("RadioSend",buffer,size,time_out)
  392. local tx_irq_mask = bit.bor(
  393. sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE,
  394. sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT
  395. )
  396. SX126xSetDioIrqParams(
  397. tx_irq_mask, -- 主中断掩码
  398. tx_irq_mask, -- DIO1映射
  399. sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE,
  400. sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE
  401. )
  402. SX126xCopy.PacketParams.Params.LoRa.PayloadLength = size
  403. SX126xSetPacketParams(SX126xCopy.PacketParams)
  404. SX126xSendPayload(buffer,size,time_out)
  405. sys.wait(100)
  406. -- setReceiveMode()
  407. end
  408. -- 初始化SX126x
  409. function SX126xInit()
  410. SX126xIoInit()
  411. SX126xReset()
  412. SX126xWakeup()
  413. SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC)
  414. -- SX126xSetRegulatorMode(sx126x_reg.RadioStandbyModes_t.USE_DCDC)
  415. -- SX126xSetBufferBaseAddress("00","00")
  416. -- SX126xSetTxParams( "00", sx126x_reg.RadioRampTimes_t.RADIO_RAMP_200_US )
  417. -- SX126xSetDioIrqParams( sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
  418. -- SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC)
  419. -- sys.wait(2000)
  420. -- log.info("RadioSetTxConfig",string.format("%02X", 433000000))
  421. -- RadioSetChannel(433000000)
  422. end
  423. function sentString(strData)
  424. --这里需要判断传入的是否为字符串。
  425. local hexStr = stringToHex(strData)
  426. RadioSend(hexStr,string.format("%02X", #hexStr/2),"00")
  427. -- local original = "Hello, Lua!\n"
  428. -- local hexStr = stringToHex(original)
  429. -- log.info("test:",hexStr) -- 输出: 48656c6c6f2c204c756121
  430. -- log.info("testlen:",#hexStr)
  431. -- log.info("testlen2:",string.format("%02X", #hexStr/2))
  432. -- RadioSend(hexStr,string.format("%02X", #hexStr/2),"00")
  433. end
  434. function SX126xSetRx(timeout)
  435. OperatingMode = sx126x_reg.RadioOperatingModes_t.MODE_RX
  436. local buf = {"00","00","00"}
  437. SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_SET_RX, buf);
  438. end
  439. function RadioRx()
  440. pins.setup(pio.P0_27,0)
  441. pins.setup(pio.P0_28,1)
  442. -- sys.wait(1000)
  443. SX126xSetDioIrqParams( sx126x_reg.RadioIrqMasks_t.IRQ_RX_DONE + sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT, sx126x_reg.RadioIrqMasks_t.IRQ_RX_DONE + sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
  444. SX126xSetRx(0)
  445. end
  446. function SX126xClearIrqStatus()
  447. local buf = {"FF","FF"}
  448. SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_CLR_IRQSTATUS, buf);
  449. end
  450. function RadioClearIrqStatus()
  451. SX126xClearIrqStatus()
  452. end
  453. -- function SX126xGetRxBufferStatus()
  454. -- local ret = SX126xReadCommand( sx126x_reg.RadioCommands.RADIO_GET_RXBUFFERSTATUS, 4 )
  455. -- log.info("LORA_CALL_BACK",ret)
  456. -- return ret
  457. -- end
  458. -- function SX126xGetPayload(buffer,size,maxSize)
  459. -- local offset = "00"
  460. -- local data = SX126xGetRxBufferStatus(size,offset) --例子:返回 "A408" A4是起始地址,08是接收到的长度
  461. -- if size > maxSize then
  462. -- return -1
  463. -- end
  464. -- SX126xReadBuffer(offset,buffer,size)
  465. -- return 0
  466. -- end
  467. -- function RadioGetBuffer()
  468. -- end
  469. -- function loraCallback()
  470. -- end
  471. -- 十六进制字符串转原始字符串的函数
  472. local function hex_to_string(hex_str)
  473. local str = ""
  474. -- 每两个字符一组处理
  475. for i = 1, #hex_str, 2 do
  476. -- 截取两位十六进制字符
  477. local hex_byte = hex_str:sub(i, i+1)
  478. -- 转换为数值(十六进制),再转换为字符
  479. local char = string.char(tonumber(hex_byte, 16))
  480. str = str .. char
  481. end
  482. return str
  483. end
  484. -- function SX126xReadBuffer(offset,size)
  485. -- local command = sx126x_reg.RadioCommands.RADIO_READ_BUFFER .. offset .. "00"
  486. -- for i = 1, size do
  487. -- command = command .. "00"
  488. -- end
  489. -- local ret = Drv_spi.drv_spi_read_write_byte(command,size)
  490. -- log.info("SX126xReadBuffer",ret)
  491. -- -- 测试示例
  492. -- -- local hex_str = "617368696E696E67" -- "ashining"的十六进制表示
  493. -- local original_str = hex_to_string(ret)
  494. -- -- print("转换后的字符串: " .. original_str) -- 输出: ashining
  495. -- log.info("原始字符串: " .. original_str)
  496. -- return original_str
  497. -- end
  498. local CHUNK_SIZE = 12
  499. function SX126xReadBuffer(offset, size)
  500. local all_data = ""
  501. local remain = size
  502. local cur_offset = offset
  503. while remain > 0 do
  504. local this_size = math.min(remain, CHUNK_SIZE)
  505. -- offset 转成 2位 hex
  506. local offset_hex = string.format("%02X", cur_offset)
  507. local command = sx126x_reg.RadioCommands.RADIO_READ_BUFFER .. offset_hex .. "00"
  508. for i = 1, this_size do
  509. command = command .. "00"
  510. end
  511. local ret = Drv_spi.drv_spi_read_write_byte(command, this_size)
  512. all_data = all_data .. ret
  513. cur_offset = cur_offset + this_size
  514. remain = remain - this_size
  515. end
  516. return all_data
  517. end
  518. ReceiveData = ""
  519. function dataReady()
  520. return ReceiveData ~= ""
  521. end
  522. function RadioGetBuffer()
  523. if ReceiveData == "" then return "" end
  524. local data = ReceiveData
  525. ReceiveData = "" -- 读取后立即清空,避免重复读取
  526. return data
  527. end
  528. local function SX126xGetIrqStatus()
  529. local ret = SX126xReadCommand(sx126x_reg.RadioCommands.RADIO_GET_IRQSTATUS, 2)
  530. if not ret or #ret < 4 then
  531. log.error("SX126xGetIrqStatus", "无效返回", ret)
  532. return 0
  533. end
  534. -- SX126x返回的是低字节在前,高字节在后
  535. local lsb = tonumber(ret:sub(1,2), 16) or 0
  536. local msb = tonumber(ret:sub(3,4), 16) or 0
  537. -- 正确的字节序:高字节在前,低字节在后
  538. local irq = bit.lshift(msb, 8) + lsb
  539. -- log.info("IRQ原始数据", ret, "LSB:", string.format("0x%02X", lsb), "MSB:", string.format("0x%02X", msb))
  540. -- log.info("IRQ解析结果", string.format("0x%04X", irq))
  541. return irq
  542. end
  543. sys.subscribe("LORA_CALL_BACK", function()
  544. -- log.info("LORA_CALL_BACK")
  545. -- -- 先读 IRQ 状态
  546. local irq = SX126xGetIrqStatus()
  547. if irq == 0 then
  548. return
  549. end
  550. RadioClearIrqStatus()
  551. log.info("清除中断")
  552. SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC)
  553. RadioRx()
  554. -- local tx_gpio_level = pio.pin.getval(pio.P0_27)
  555. -- log.info("TXENGPIO 电平", tx_gpio_level)
  556. -- local rx_gpio_level = pio.pin.getval(pio.P0_28)
  557. -- log.info("RXENGPIO 电平", rx_gpio_level)
  558. -- if tx_gpio_level == 0 and rx_gpio_level == 1 then
  559. -- return
  560. -- end
  561. -- log.info("IRQ原始HEX", ret) -- 记得在 GetIrqStatus 里打印
  562. -- log.info("IRQ解析结果", string.format("0x%04X", irq))
  563. if irq == 0xAC then
  564. return
  565. end
  566. --日志显示还是有点区别的。如果是oxAC就是把自己读出来了 如果是0xA4就是正常的接收
  567. -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE) ~= 0 then
  568. -- log.info("发送完成")
  569. -- end
  570. -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_RX_DONE) ~= 0 then
  571. -- log.info("接收完成")
  572. -- end
  573. -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT) ~= 0 then
  574. -- log.info("接收超时")
  575. -- end
  576. -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_CRC_ERROR) ~= 0 then
  577. -- log.info("接收CRC错误")
  578. -- end
  579. -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_CAD_DONE) ~= 0 then
  580. -- log.info("CAD完成")
  581. -- end
  582. -- if bit.band(irq,sx126x_reg.RadioIrqMasks_t.IRQ_HEADER_VALID) ~= 0 then
  583. -- log.info("头部有效")
  584. -- end
  585. -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_HEADER_ERROR) ~= 0 then
  586. -- log.info("头部错误")
  587. -- end
  588. -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_SYNCWORD_VALID) ~= 0 then
  589. -- log.info("同步字有效")
  590. -- end
  591. -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_PREAMBLE_DETECTED) ~= 0 then
  592. -- log.info("前导码检测到")
  593. -- end
  594. -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_CAD_ACTIVITY_DETECTED) ~= 0 then
  595. -- log.info("CAD活动检测到")
  596. -- end
  597. local ret = SX126xReadCommand(sx126x_reg.RadioCommands.RADIO_GET_RXBUFFERSTATUS, 3)
  598. -- log.info("LORA_CALL_BACK", ret)
  599. local payloadLength = ret:sub(3, 4)
  600. local num1 = tonumber(payloadLength, 16)
  601. log.info("payloadLength", num1)
  602. -- 自动读取完整数据
  603. if num1 > 0 then
  604. local data = SX126xReadBuffer(0, num1)
  605. num1 = 0
  606. log.info("data HEX", data)
  607. log.info("data ASCII", hex_to_string(data))
  608. ReceiveData = ReceiveData .. data
  609. end
  610. end)
  611. -- sys.taskInit(function ()
  612. -- sys.wait(5000)
  613. -- SX126xInit()
  614. -- sys.wait(2000)
  615. -- while true do
  616. -- log.info("计算结果")
  617. -- --[[
  618. -- 1.将普通字符串用函数转换成16进制字符串,并获取表长度。例如:"Hello, Lua!" -> "48656c6c6f2c204c756121"
  619. -- 2.返回的16进制表,是以两位为一个16进制数据,实际发生长需要减半。例如:"48656c6c6f2c204c756121" -> 0x48 0x65 ... 0x21
  620. -- 3.RadioSend的第二位参数是要发生的数据长度,需要16进制字符串形式,意味着"48656c6c6f2c204c756121"是11位数据
  621. -- 但是是需要转成 "08"。
  622. -- ]]
  623. -- sentString("hello,My_name_is_XuXinyi\n")
  624. -- -- local original = "Hello, Lua!\n"
  625. -- -- local hexStr = stringToHex(original)
  626. -- -- log.info("test:",hexStr) -- 输出: 48656c6c6f2c204c756121
  627. -- -- log.info("testlen:",#hexStr)
  628. -- -- RadioSend(hexStr,string.format("%02X", #hexStr/2),"00")
  629. -- -- sys.wait(20)
  630. -- -- SX126xReadCommand(sx126x_reg.RadioCommands.RADIO_GET_STATUS,1)
  631. -- -- SX126xWakeup()
  632. -- sys.wait(4000)
  633. -- end
  634. -- spi.close(spi.SPI_1)
  635. -- end)