--- 模块功能:sx126x模块驱动 -- 读取FLASH ID -- @author openLuat -- @module spi.testSpiFlash -- @license MIT -- @copyright openLuat -- @release 2018.03.27 module(...,package.seeall) require"utils" require"pm" pm.wake("wake11") require"pins" -- require "sx126x_reg" require "Drv_spi" require "sx126x_reg" -- TODU: 驱动文件要分开。我把redio.c的函数放到了驱动里面了,为了方便调试。 pmd.ldoset(2,pmd.LDO_VMMC) pmd.ldoset(2,pmd.LDO_VLCD) local SX126x = json.encode(sx126x_reg.SX126x_t) local SX126xCopy,result,errinfo = json.decode(SX126x) SX126x = nil local ImageCalibrated = false local FREQ_STEP = 0.95367431640625 local RadioPublicNetwork_t = { Previous = false, Current = false } RadioPublicNetwork = RadioPublicNetwork_t SX126xResetGPIO = pins.setup(pio.P0_13,0) SX126xTXENGPIO = pins.setup(pio.P0_27,1) SX126xRXENGPIO = pins.setup(pio.P0_28,0) function setTransmitMode() sys.wait(100) SX126xTXENGPIO(1) SX126xRXENGPIO(0) sys.wait(100) end function setReceiveMode() -- SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC) sys.wait(100) SX126xTXENGPIO(0) SX126xRXENGPIO(1) sys.wait(100) end -- local getGpio19Fnc = pins.setup(pio.P0_24) -- sys.timerLoopStart(function() -- log.info("testGpioSingle.getGpio19Fnc",getGpio19Fnc()) -- end,1000) -- function gpio13IntFnc(msg) -- log.info("testGpioSingle.gpio24IntFnc",msg,getGpio13Fnc()) -- --上升沿中断 -- if msg==cpu.INT_GPIO_POSEDGE then -- --下降沿中断 -- else -- end -- end pio.pin.setdebounce(0xffffffff) --GPIO13配置为中断,可通过getGpio13Fnc()获取输入电平,产生中断时,自动执行gpio13IntFnc函数 -- getGpio13Fnc = pins.setup(pio.P0_24,gpio13IntFnc) function gpio4IntFnc(msg) -- log.info("testGpioSingle.gpio4IntFnc",msg,getGpio4Fnc()) --上升沿中断 if msg==cpu.INT_GPIO_POSEDGE then sys.publish("LORA_CALL_BACK") -- log.info("我是中断") --下降沿中断 else end end --GPIO13配置为中断,可通过getGpio13Fnc()获取输入电平,产生中断时,自动执行gpio13IntFnc函数 getGpio4Fnc = pins.setup(pio.P0_4,gpio4IntFnc) OperatingMode = sx126x_reg.RadioStandbyModes_t.STDBY_RC function stringToHex(str) local hex = {} for i = 1, #str do local byte = string.byte(str, i) hex[#hex + 1] = string.format("%02x", byte) end return table.concat(hex) end function gsonLoginfo(data) local jsondata = json.encode(data) -- log.info("SX126xSetModulationParams.encode",jsondata) end -- 初始化SPI function SX126xIoInit() Drv_spi.SPI_GPIO_Init() end -- 复位SX126x function SX126xReset() sys.wait(10) SX126xResetGPIO(0) sys.wait(20) SX126xResetGPIO(1) sys.wait(10) end function SX126xWakeup() local command = sx126x_reg.RadioCommands.RADIO_GET_STATUS .. "00" local ret = Drv_spi.drv_spi_read_write_byte(command,1) -- log.info("SX126xWakeup",ret) end --命令写入 完成 function SX126xWriteCommand(command,buffer) local bufferTotal = "" for i, num in ipairs(buffer) do bufferTotal = bufferTotal .. num end Drv_spi.drv_spi_read_write_byte(command .. bufferTotal,0) -- 50 -- sys.wait(20) -- Drv_spi.drv_spi_read_write_byte(bufferTotal,0) -- local ret = Drv_spi.drv_spi_read_write_byte("1d07400000",1); -- log.info("SX126xWriteCommand",Drv_spi.drv_spi_read_write_byte(bufferTotal,1)) end function SX126xReadCommand(command,size) -- Drv_spi.drv_spi_read_write_byte(command,0) for i = 1, size do command = command .. "00" end local ret = Drv_spi.drv_spi_read_write_byte(command,size) -- Drv_spi.drv_spi_read_write_byte(command,0) -- log.info("SX126xReadCommand",ret) return ret end -- -----------------------------------------------SPI基础读写--------------------------------------------------- -- 读取寄存器 完成 function SX126xReadRegisters(address,size) Drv_spi.drv_spi_read_write_byte(sx126x_reg.RadioCommands.RADIO_READ_REGISTER,0) -- sys.wait(20) local sendData = address .. "00" local receiverDataCount= size while size > 0 do sendData = sendData .. "00" size = size - 1 end local result = Drv_spi.drv_spi_read_write_byte(sendData,receiverDataCount) --这里乘2的意思是,16进制是两位,但是转成字符串的形式就是4位了。 -- log.info("SX126xReadRegisters",result) return result end --封装后的读寄存器 function SX126xReadRegister(address) local ret = SX126xReadRegisters(address,1) return ret end -- 写入寄存器 function SX126xWriteRegisters(address,buffer) local bufferTotal = "" Drv_spi.drv_spi_read_write_byte(sx126x_reg.RadioCommands.RADIO_WRITE_REGISTER,0) sys.wait(20) for i, data in ipairs(buffer) do bufferTotal = bufferTotal .. data end local test = address .. bufferTotal -- log.info("SX126xWriteRegisters",bufferTotal) Drv_spi.drv_spi_read_write_byte(test,0); end function SX126xWriteRegister(address,value) SX126xWriteRegisters( address,value); end function SX126xSetStandby(standbyConfig) SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_STANDBY,{standbyConfig}) -- log.info("SX126xSetStandby_操作模式",standbyConfig) if standbyConfig == sx126x_reg.RadioStandbyModes_t.STDBY_RC then OperatingMode = sx126x_reg.RadioStandbyModes_t.STDBY_RC else OperatingMode = sx126x_reg.RadioStandbyModes_t.STDBY_XOSC end end function SX126xSetRegulatorMode(mode) SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_REGULATORMODE,{mode}) end function SX126xSetBufferBaseAddress(txBaseAddress, rxBaseAddress) local buf = {txBaseAddress,rxBaseAddress} SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_BUFFERBASEADDRESS,buf) end function SX126xSetPaConfig(paDutyCycle,hpMax,deviceSel,paLut) local buf = {paDutyCycle,hpMax,deviceSel,paLut} SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_PACONFIG,buf) -- log.info("SX126xSetPaConfig",sx126x_reg.RadioCommands.RADIO_SET_PACONFIG) end function SX126xSetTxParams(power, rampTime) local buf = {power,rampTime} SX126xSetPaConfig("04","07","00","01") SX126xWriteRegister( sx126x_reg.REG_OCP, {"38"} ) SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_TXPARAMS,buf) end -- function SX126xSetDioIrqParams2222(timeout, freq, rfChain, power, preambleLen) -- local buf = {timeout, freq, rfChain, power, preambleLen} -- SX126xSetTxParams(power, sx126x_reg.RadioRampTimes_t.RADIO_RAMP_40_US) -- SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_TX,buf) -- end -- 工具函数:16位数拆分为高字节 + 低字节 -- 辅助函数:将16位数字拆分为高字节和低字节(返回数值) -- 对齐C语言逻辑:先高字节,后低字节 local function to_2byte(num) local high = bit.band(bit.rshift(num, 8), 0xFF) -- 高8位(与C语言(irqMask >> 8) & 0xFF一致) local low = bit.band(num, 0xFF) -- 低8位(与C语言irqMask & 0xFF一致) return high, low -- 注意:返回顺序是高字节在前,低字节在后 end function SX126xSetDioIrqParams(irqMask, dio1Mask, dio2Mask, dio3Mask) -- 1. 将输入参数转为16位数字(支持十六进制字符串或数字) local function to_num(val) if type(val) == "string" then return tonumber(val, 16) or 0 -- 处理十六进制字符串(如"0x80"或"80") end return tonumber(val) or 0 -- 处理数字或无效值 end -- 2. 转换所有掩码为数字 irqMask = to_num(irqMask) dio1Mask = to_num(dio1Mask) dio2Mask = to_num(dio2Mask) dio3Mask = to_num(dio3Mask) -- 3. 拆分16位掩码为高字节和低字节(对齐C语言逻辑:高字节在前) local irq_high, irq_low = to_2byte(irqMask) local dio1_high, dio1_low = to_2byte(dio1Mask) local dio2_high, dio2_low = to_2byte(dio2Mask) local dio3_high, dio3_low = to_2byte(dio3Mask) -- 4. 构建缓冲区(8字节,与C语言buf顺序完全一致) -- 格式:[irq_high, irq_low, dio1_high, dio1_low, dio2_high, dio2_low, dio3_high, dio3_low] local buf_num = { irq_high, irq_low, dio1_high, dio1_low, dio2_high, dio2_low, dio3_high, dio3_low } -- 5. 将数字转为2位十六进制字符串(SPI通信要求) local buf_hex = {} for i, num in ipairs(buf_num) do table.insert(buf_hex, string.format("%02X", num)) -- 确保2位大写十六进制(如0x0A → "0A") end -- 6. 打印日志(验证格式是否正确) -- log.info("SX126xSetDioIrqParams", table.concat(buf_hex, " ")) -- 7. 发送命令(写入8字节配置) SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_CFG_DIOIRQ, buf_hex) end function SX126xSetStopRxTimerOnPreambleDetect(enable) SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_STOPRXTIMERONPREAMBLE,{enable}) end function SX126xSetLoRaSymbNumTimeout(SymbNum) SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_LORASYMBTIMEOUT,{SymbNum}) end function SX126xSetPacketType(packetType) PacketType = packetType; SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_SET_PACKETTYPE,{PacketType}) -- log.info("PacketType:",PacketType,sx126x_reg.RadioCommands.RADIO_SET_PACKETTYPE) end -- 原驱动好像并没有启用,不晓得这个是什么功能 function RadioSetPublicNetwork(enable) SX126xSetPacketType(sx126x_reg.RadioPacketTypes_t.PACKET_TYPE_LORA) if enable == true then SX126xWriteRegister( sx126x_reg.REG_LR_SYNCWORD,{"07"}); SX126xWriteRegister( sx126x_reg.REG_LR_SYNCWORD_LSB,{"40"}); else SX126xWriteRegister( sx126x_reg.REG_LR_SYNCWORD, {"07"}); SX126xWriteRegister( sx126x_reg.REG_LR_SYNCWORD_LSB, {"41"} ); end end function RadioSetModem(modem) if modem == sx126x_reg.RadioModems_t.MODEM_FSK then -- 处理 FSK 调制的逻辑 -- SX126xSetPacketType(sx126x_reg.RadioPacketTypes_t.PACKET_TYPE_GFSK) elseif modem == sx126x_reg.RadioModems_t.MODEM_LORA then SX126xSetPacketType(sx126x_reg.RadioPacketTypes_t.PACKET_TYPE_LORA) if RadioPublicNetwork.Current ~= RadioPublicNetwork.Previous then RadioPublicNetwork.Current = RadioPublicNetwork.Previous RadioSetPublicNetwork(RadioPublicNetwork.Current) end else -- 处理未知调制类型的逻辑 print("错误:未知的调制类型") end end -- 增加了函数结束标记 function SX126xSetModulationParams(modulationParams) buf = {modulationParams.Params.LoRa.SpreadingFactor, modulationParams.Params.LoRa.Bandwidth, modulationParams.Params.LoRa.CodingRate, modulationParams.Params.LoRa.LowDatarateOptimize } local jsondata = json.encode(buf) -- log.info("SX126xSetModulationParams.encode",jsondata) SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_SET_MODULATIONPARAMS,buf); end function SX126xSetPacketParams(packetParams) buf = { "00", packetParams.Params.LoRa.PreambleLength, packetParams.Params.LoRa.HeaderType, packetParams.Params.LoRa.PayloadLength, packetParams.Params.LoRa.CrcMode, packetParams.Params.LoRa.InvertIQ} -- local jsondata = json.encode(buf) -- log.info("SX126xSetPacketParams.encode",jsondata) SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_PACKETPARAMS,buf); end --[[ modem : sx126x_reg.RadioModems_t.MODEM_LORA power : 22 = 16 fdev : 0 = 0 bandwidth : 2 datarate : 11 coderate : 1 preambleLen : 12 fixLen : false crcOn : true freqHopOn : false hopPeriod : 0 iqInverted : 0 timeout : 3000 ]] -- MODEM_LORA 16 0 1 7 1 12 false true false 0 0 3000 function RadioSetTxConfig(modem,power,fdev,bandwidth,datarate,coderate,preambleLen,fixLen,crcOn,freqHopOn,hopPeriod,iqInverted,timeout) SX126xSetStopRxTimerOnPreambleDetect("00") -- = flase SX126xSetLoRaSymbNumTimeout("00") SX126xCopy.ModulationParams.PacketType = sx126x_reg.RadioPacketTypes_t.PACKET_TYPE_LORA SX126xCopy.ModulationParams.Params.LoRa.SpreadingFactor = string.format("%02X", datarate) SX126xCopy.ModulationParams.Params.LoRa.Bandwidth = "05" SX126xCopy.ModulationParams.Params.LoRa.CodingRate= coderate if ( (bandwidth == 0) and ( (datarate == 11) or (datarate == 12) ) ) or ( (bandwidth == 1) and (datarate == 12) ) then SX126xCopy.ModulationParams.Params.LoRa.LowDatarateOptimize = "01" else SX126xCopy.ModulationParams.Params.LoRa.LowDatarateOptimize = "00" end -- SX126xCopy.ModulationParams.Params.LoRa.LowDatarateOptimize = "00" SX126xCopy.PacketParams.PacketType = sx126x_reg.RadioPacketTypes_t.PACKET_TYPE_LORA SX126xCopy.PacketParams.Params.LoRa.PreambleLength = preambleLen SX126xCopy.PacketParams.Params.LoRa.HeaderType = fixLen -- TODU:这里的FF写死了,应该不要写死。 SX126xCopy.PacketParams.Params.LoRa.PayloadLength = "FF" SX126xCopy.PacketParams.Params.LoRa.CrcMode = crcOn SX126xCopy.PacketParams.Params.LoRa.InvertIQ = iqInverted -- gsonLoginfo("SX126xCopy",SX126xCopy.PacketParams.Params.LoRa) SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC) RadioSetModem(sx126x_reg.RadioModems_t.MODEM_LORA) SX126xSetModulationParams(SX126xCopy.ModulationParams) SX126xSetPacketParams(SX126xCopy.PacketParams) SX126xSetTxParams(power,sx126x_reg.RadioRampTimes_t.RADIO_RAMP_40_US) end function SX126xCalibrateImage(freq) local calFreq = {} if freq > 900000000 then calFreq = {"E1", "E9"} elseif freq > 850000000 then calFreq = {"D7", "D8"} elseif freq > 770000000 then calFreq = {"C1", "C5"} elseif freq > 460000000 then calFreq = {"75", "81"} elseif freq > 425000000 then calFreq = {"6B", "6F"} elseif freq >= 210000000 then calFreq = {"37", "41"} end SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_CALIBRATEIMAGE, calFreq) end function SX126xSetRfFrequency(frequency) local buf = {} local freq = 0 if ImageCalibrated == false then SX126xCalibrateImage(frequency) ImageCalibrated = true end -- local FREQ_STEP = 0.95367431640625 freq = frequency / FREQ_STEP -- log.info("freq", freq) -- log.info("freq", string.format("%02X", freq)) SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_SET_RFFREQUENCY, {string.format("%02X", freq)}); end function RadioSetChannel(frequency) SX126xSetRfFrequency(frequency) end function SX126xWriteBuffer(offset, buffer,size) -- log.info("SX126xWriteBuffer",offset,buffer,size) local sentdata = offset .. buffer Drv_spi.drv_spi_read_write_byte(sx126x_reg.RadioCommands.RADIO_WRITE_BUFFER,0) Drv_spi.drv_spi_read_write_byte(sentdata,10) end function SX126xSetPayload (payload,size) -- log.info("SX126xSetPayload",payload,size) SX126xWriteBuffer( "00", payload, size ); end function SX126xSetTx(timeout) SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_SET_TX, {timeout}); end function SX126xSendPayload(payload,size,timeout) -- log.info("SX126xSendPayload",payload,size,timeout) SX126xSetPayload( payload, size ); SX126xSetTx( timeout ); end function RadioSend(buffer,size,time_out) -- setTransmitMode() -- 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 ) -- log.info("RadioSend",buffer,size,time_out) local tx_irq_mask = bit.bor( sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE, sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT ) SX126xSetDioIrqParams( tx_irq_mask, -- 主中断掩码 tx_irq_mask, -- DIO1映射 sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE ) SX126xCopy.PacketParams.Params.LoRa.PayloadLength = size SX126xSetPacketParams(SX126xCopy.PacketParams) SX126xSendPayload(buffer,size,time_out) sys.wait(100) -- setReceiveMode() end -- 初始化SX126x function SX126xInit() SX126xIoInit() SX126xReset() SX126xWakeup() SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC) -- SX126xSetRegulatorMode(sx126x_reg.RadioStandbyModes_t.USE_DCDC) -- SX126xSetBufferBaseAddress("00","00") -- SX126xSetTxParams( "00", sx126x_reg.RadioRampTimes_t.RADIO_RAMP_200_US ) -- 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 ) -- SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC) -- sys.wait(2000) -- log.info("RadioSetTxConfig",string.format("%02X", 433000000)) -- RadioSetChannel(433000000) end function sentString(strData) --这里需要判断传入的是否为字符串。 local hexStr = stringToHex(strData) RadioSend(hexStr,string.format("%02X", #hexStr/2),"00") -- local original = "Hello, Lua!\n" -- local hexStr = stringToHex(original) -- log.info("test:",hexStr) -- 输出: 48656c6c6f2c204c756121 -- log.info("testlen:",#hexStr) -- log.info("testlen2:",string.format("%02X", #hexStr/2)) -- RadioSend(hexStr,string.format("%02X", #hexStr/2),"00") end function SX126xSetRx(timeout) OperatingMode = sx126x_reg.RadioOperatingModes_t.MODE_RX local buf = {"00","00","00"} SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_SET_RX, buf); end function RadioRx() pins.setup(pio.P0_27,0) pins.setup(pio.P0_28,1) -- sys.wait(1000) 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 ) SX126xSetRx(0) end function SX126xClearIrqStatus() local buf = {"FF","FF"} SX126xWriteCommand( sx126x_reg.RadioCommands.RADIO_CLR_IRQSTATUS, buf); end function RadioClearIrqStatus() SX126xClearIrqStatus() end -- function SX126xGetRxBufferStatus() -- local ret = SX126xReadCommand( sx126x_reg.RadioCommands.RADIO_GET_RXBUFFERSTATUS, 4 ) -- log.info("LORA_CALL_BACK",ret) -- return ret -- end -- function SX126xGetPayload(buffer,size,maxSize) -- local offset = "00" -- local data = SX126xGetRxBufferStatus(size,offset) --例子:返回 "A408" A4是起始地址,08是接收到的长度 -- if size > maxSize then -- return -1 -- end -- SX126xReadBuffer(offset,buffer,size) -- return 0 -- end -- function RadioGetBuffer() -- end -- function loraCallback() -- end -- 十六进制字符串转原始字符串的函数 local function hex_to_string(hex_str) local str = "" -- 每两个字符一组处理 for i = 1, #hex_str, 2 do -- 截取两位十六进制字符 local hex_byte = hex_str:sub(i, i+1) -- 转换为数值(十六进制),再转换为字符 local char = string.char(tonumber(hex_byte, 16)) str = str .. char end return str end -- function SX126xReadBuffer(offset,size) -- local command = sx126x_reg.RadioCommands.RADIO_READ_BUFFER .. offset .. "00" -- for i = 1, size do -- command = command .. "00" -- end -- local ret = Drv_spi.drv_spi_read_write_byte(command,size) -- log.info("SX126xReadBuffer",ret) -- -- 测试示例 -- -- local hex_str = "617368696E696E67" -- "ashining"的十六进制表示 -- local original_str = hex_to_string(ret) -- -- print("转换后的字符串: " .. original_str) -- 输出: ashining -- log.info("原始字符串: " .. original_str) -- return original_str -- end local CHUNK_SIZE = 12 function SX126xReadBuffer(offset, size) local all_data = "" local remain = size local cur_offset = offset while remain > 0 do local this_size = math.min(remain, CHUNK_SIZE) -- offset 转成 2位 hex local offset_hex = string.format("%02X", cur_offset) local command = sx126x_reg.RadioCommands.RADIO_READ_BUFFER .. offset_hex .. "00" for i = 1, this_size do command = command .. "00" end local ret = Drv_spi.drv_spi_read_write_byte(command, this_size) all_data = all_data .. ret cur_offset = cur_offset + this_size remain = remain - this_size end return all_data end ReceiveData = "" function dataReady() return ReceiveData ~= "" end function RadioGetBuffer() if ReceiveData == "" then return "" end local data = ReceiveData ReceiveData = "" -- 读取后立即清空,避免重复读取 return data end local function SX126xGetIrqStatus() local ret = SX126xReadCommand(sx126x_reg.RadioCommands.RADIO_GET_IRQSTATUS, 2) if not ret or #ret < 4 then log.error("SX126xGetIrqStatus", "无效返回", ret) return 0 end -- SX126x返回的是低字节在前,高字节在后 local lsb = tonumber(ret:sub(1,2), 16) or 0 local msb = tonumber(ret:sub(3,4), 16) or 0 -- 正确的字节序:高字节在前,低字节在后 local irq = bit.lshift(msb, 8) + lsb -- log.info("IRQ原始数据", ret, "LSB:", string.format("0x%02X", lsb), "MSB:", string.format("0x%02X", msb)) -- log.info("IRQ解析结果", string.format("0x%04X", irq)) return irq end sys.subscribe("LORA_CALL_BACK", function() -- log.info("LORA_CALL_BACK") -- -- 先读 IRQ 状态 local irq = SX126xGetIrqStatus() if irq == 0 then return end RadioClearIrqStatus() log.info("清除中断") SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC) RadioRx() -- local tx_gpio_level = pio.pin.getval(pio.P0_27) -- log.info("TXENGPIO 电平", tx_gpio_level) -- local rx_gpio_level = pio.pin.getval(pio.P0_28) -- log.info("RXENGPIO 电平", rx_gpio_level) -- if tx_gpio_level == 0 and rx_gpio_level == 1 then -- return -- end -- log.info("IRQ原始HEX", ret) -- 记得在 GetIrqStatus 里打印 -- log.info("IRQ解析结果", string.format("0x%04X", irq)) if irq == 0xAC then return end --日志显示还是有点区别的。如果是oxAC就是把自己读出来了 如果是0xA4就是正常的接收 -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_TX_DONE) ~= 0 then -- log.info("发送完成") -- end -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_RX_DONE) ~= 0 then -- log.info("接收完成") -- end -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_RX_TX_TIMEOUT) ~= 0 then -- log.info("接收超时") -- end -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_CRC_ERROR) ~= 0 then -- log.info("接收CRC错误") -- end -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_CAD_DONE) ~= 0 then -- log.info("CAD完成") -- end -- if bit.band(irq,sx126x_reg.RadioIrqMasks_t.IRQ_HEADER_VALID) ~= 0 then -- log.info("头部有效") -- end -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_HEADER_ERROR) ~= 0 then -- log.info("头部错误") -- end -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_SYNCWORD_VALID) ~= 0 then -- log.info("同步字有效") -- end -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_PREAMBLE_DETECTED) ~= 0 then -- log.info("前导码检测到") -- end -- if bit.band(irq, sx126x_reg.RadioIrqMasks_t.IRQ_CAD_ACTIVITY_DETECTED) ~= 0 then -- log.info("CAD活动检测到") -- end local ret = SX126xReadCommand(sx126x_reg.RadioCommands.RADIO_GET_RXBUFFERSTATUS, 3) -- log.info("LORA_CALL_BACK", ret) local payloadLength = ret:sub(3, 4) local num1 = tonumber(payloadLength, 16) log.info("payloadLength", num1) -- 自动读取完整数据 if num1 > 0 then local data = SX126xReadBuffer(0, num1) num1 = 0 log.info("data HEX", data) log.info("data ASCII", hex_to_string(data)) ReceiveData = ReceiveData .. data end end) -- sys.taskInit(function () -- sys.wait(5000) -- SX126xInit() -- sys.wait(2000) -- while true do -- log.info("计算结果") -- --[[ -- 1.将普通字符串用函数转换成16进制字符串,并获取表长度。例如:"Hello, Lua!" -> "48656c6c6f2c204c756121" -- 2.返回的16进制表,是以两位为一个16进制数据,实际发生长需要减半。例如:"48656c6c6f2c204c756121" -> 0x48 0x65 ... 0x21 -- 3.RadioSend的第二位参数是要发生的数据长度,需要16进制字符串形式,意味着"48656c6c6f2c204c756121"是11位数据 -- 但是是需要转成 "08"。 -- ]] -- sentString("hello,My_name_is_XuXinyi\n") -- -- local original = "Hello, Lua!\n" -- -- local hexStr = stringToHex(original) -- -- log.info("test:",hexStr) -- 输出: 48656c6c6f2c204c756121 -- -- log.info("testlen:",#hexStr) -- -- RadioSend(hexStr,string.format("%02X", #hexStr/2),"00") -- -- sys.wait(20) -- -- SX126xReadCommand(sx126x_reg.RadioCommands.RADIO_GET_STATUS,1) -- -- SX126xWakeup() -- sys.wait(4000) -- end -- spi.close(spi.SPI_1) -- end)