|
@@ -46,6 +46,7 @@ function setTransmitMode()
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
function setReceiveMode()
|
|
function setReceiveMode()
|
|
|
|
|
+ -- SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC)
|
|
|
sys.wait(100)
|
|
sys.wait(100)
|
|
|
SX126xTXENGPIO(0)
|
|
SX126xTXENGPIO(0)
|
|
|
SX126xRXENGPIO(1)
|
|
SX126xRXENGPIO(1)
|
|
@@ -166,7 +167,7 @@ function SX126xReadRegisters(address,size)
|
|
|
|
|
|
|
|
local result = Drv_spi.drv_spi_read_write_byte(sendData,receiverDataCount) --这里乘2的意思是,16进制是两位,但是转成字符串的形式就是4位了。
|
|
local result = Drv_spi.drv_spi_read_write_byte(sendData,receiverDataCount) --这里乘2的意思是,16进制是两位,但是转成字符串的形式就是4位了。
|
|
|
|
|
|
|
|
- log.info("SX126xReadRegisters",result)
|
|
|
|
|
|
|
+ -- log.info("SX126xReadRegisters",result)
|
|
|
return result
|
|
return result
|
|
|
end
|
|
end
|
|
|
|
|
|
|
@@ -235,22 +236,67 @@ end
|
|
|
-- SX126xSetTxParams(power, sx126x_reg.RadioRampTimes_t.RADIO_RAMP_40_US)
|
|
-- SX126xSetTxParams(power, sx126x_reg.RadioRampTimes_t.RADIO_RAMP_40_US)
|
|
|
-- SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_TX,buf)
|
|
-- SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_TX,buf)
|
|
|
-- end
|
|
-- end
|
|
|
-
|
|
|
|
|
--- TODU : 参数配置问题,好像并不影响发生。这里主要是配置中断设置的。
|
|
|
|
|
-function SX126xSetDioIrqParams(irqMask, dio1Mask, dio2Mask, dio3Mask )
|
|
|
|
|
- local buf = {"02","01","02","01","00","00","00","00"}
|
|
|
|
|
- buf[2] = irqMask
|
|
|
|
|
- buf[4] = irqMask
|
|
|
|
|
- local jsondata = json.encode(buf)
|
|
|
|
|
- log.info("SX126xSetModulationParams.encode",jsondata)
|
|
|
|
|
- SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_CFG_DIOIRQ,buf)
|
|
|
|
|
|
|
+-- 工具函数: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
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
function SX126xSetStopRxTimerOnPreambleDetect(enable)
|
|
function SX126xSetStopRxTimerOnPreambleDetect(enable)
|
|
|
SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_STOPRXTIMERONPREAMBLE,{enable})
|
|
SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_STOPRXTIMERONPREAMBLE,{enable})
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
+
|
|
|
function SX126xSetLoRaSymbNumTimeout(SymbNum)
|
|
function SX126xSetLoRaSymbNumTimeout(SymbNum)
|
|
|
SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_LORASYMBTIMEOUT,{SymbNum})
|
|
SX126xWriteCommand(sx126x_reg.RadioCommands.RADIO_SET_LORASYMBTIMEOUT,{SymbNum})
|
|
|
end
|
|
end
|
|
@@ -434,11 +480,24 @@ function SX126xSendPayload(payload,size,timeout)
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
function RadioSend(buffer,size,time_out)
|
|
function RadioSend(buffer,size,time_out)
|
|
|
- SX126xSetDioIrqParams( "01", sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, 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 )
|
|
|
|
|
|
|
+ -- 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)
|
|
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
|
|
SX126xCopy.PacketParams.Params.LoRa.PayloadLength = size
|
|
|
SX126xSetPacketParams(SX126xCopy.PacketParams)
|
|
SX126xSetPacketParams(SX126xCopy.PacketParams)
|
|
|
SX126xSendPayload(buffer,size,time_out)
|
|
SX126xSendPayload(buffer,size,time_out)
|
|
|
|
|
+ sys.wait(100)
|
|
|
|
|
+-- setReceiveMode()
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
@@ -485,7 +544,7 @@ function RadioRx()
|
|
|
pins.setup(pio.P0_27,0)
|
|
pins.setup(pio.P0_27,0)
|
|
|
pins.setup(pio.P0_28,1)
|
|
pins.setup(pio.P0_28,1)
|
|
|
-- sys.wait(1000)
|
|
-- sys.wait(1000)
|
|
|
- SX126xSetDioIrqParams( "02", sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_ALL, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE, sx126x_reg.RadioIrqMasks_t.IRQ_RADIO_NONE )
|
|
|
|
|
|
|
+ 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)
|
|
SX126xSetRx(0)
|
|
|
end
|
|
end
|
|
|
|
|
|
|
@@ -583,25 +642,118 @@ function SX126xReadBuffer(offset, size)
|
|
|
|
|
|
|
|
return all_data
|
|
return all_data
|
|
|
end
|
|
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()
|
|
sys.subscribe("LORA_CALL_BACK", function()
|
|
|
|
|
+ log.info("LORA_CALL_BACK")
|
|
|
|
|
+ -- -- 先读 IRQ 状态
|
|
|
|
|
+ local irq = SX126xGetIrqStatus()
|
|
|
|
|
+ if irq == 0 then
|
|
|
|
|
+ return
|
|
|
|
|
+ end
|
|
|
RadioClearIrqStatus()
|
|
RadioClearIrqStatus()
|
|
|
log.info("清除中断")
|
|
log.info("清除中断")
|
|
|
SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC)
|
|
SX126xSetStandby(sx126x_reg.RadioStandbyModes_t.STDBY_RC)
|
|
|
RadioRx()
|
|
RadioRx()
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ local tx_gpio_level = pio.pin.getval(pio.P0_27)
|
|
|
|
|
+ local rx_gpio_level = pio.pin.getval(pio.P0_28)
|
|
|
|
|
+ log.info("TXENGPIO 电平", tx_gpio_level)
|
|
|
|
|
+ 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)
|
|
local ret = SX126xReadCommand(sx126x_reg.RadioCommands.RADIO_GET_RXBUFFERSTATUS, 3)
|
|
|
log.info("LORA_CALL_BACK", ret)
|
|
log.info("LORA_CALL_BACK", ret)
|
|
|
|
|
|
|
|
local payloadLength = ret:sub(3, 4)
|
|
local payloadLength = ret:sub(3, 4)
|
|
|
local num1 = tonumber(payloadLength, 16)
|
|
local num1 = tonumber(payloadLength, 16)
|
|
|
|
|
+
|
|
|
log.info("payloadLength", num1)
|
|
log.info("payloadLength", num1)
|
|
|
|
|
|
|
|
-- 自动读取完整数据
|
|
-- 自动读取完整数据
|
|
|
- local data = SX126xReadBuffer(0, num1)
|
|
|
|
|
- log.info("data HEX", data)
|
|
|
|
|
- log.info("data ASCII", hex_to_string(data))
|
|
|
|
|
|
|
+ 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)
|
|
end)
|
|
|
|
|
|
|
|
|
|
|