update with latest drivers changes

This commit is contained in:
Joel Wetzell
2026-05-09 09:00:41 -05:00
parent f0f9262ba5
commit 76cf8af4a5
+76 -101
View File
@@ -19,6 +19,21 @@ var (
password string password string
) )
type LoRaConfig struct {
Frequency uint32
Power int8
RadioRamp sx128x.RadioRampTime
RegulatorMode sx128x.RegulatorMode
SpreadingFactor sx128x.LoRaSpreadingFactor
Bandwidth sx128x.LoRaBandwidth
CodingRate sx128x.LoRaCodingRate
PreambleLength uint32
HeaderType sx128x.LoRaHeaderType
CrcType sx128x.LoRaCrcType
IqType sx128x.LoRaIqType
SyncWord uint16
}
func main() { func main() {
time.Sleep(3 * time.Second) time.Sleep(3 * time.Second)
@@ -84,60 +99,73 @@ func main() {
timeout := atomic.Bool{} timeout := atomic.Bool{}
timeout.Store(true) timeout.Store(true)
dio1Pin.SetInterrupt(machine.PinRising, func(machine.Pin) { dio1Interrupt := atomic.Bool{}
irqStatus, _ := radio.GetIrqStatus() dio1Interrupt.Store(false)
println("irq status:", irqStatus)
if irqStatus&sx128x.IRQ_TX_DONE_MASK != 0 { dio1Pin.SetInterrupt(machine.PinRising, func(machine.Pin) {
txDone.Store(true) dio1Interrupt.Store(true)
timeout.Store(false)
led.Set(false)
}
if irqStatus&sx128x.IRQ_RX_DONE_MASK != 0 {
rxDone.Store(true)
timeout.Store(false)
led.Set(true)
println("rx done")
}
if irqStatus&sx128x.IRQ_RX_TX_TIMEOUT_MASK != 0 {
timeout.Store(true)
txDone.Store(true)
rxDone.Store(true)
println("rx/tx timeout")
}
}) })
loraConfig := lora.Config{ loraConfig := LoRaConfig{
Freq: 2400000000, Frequency: 2400000000, // 2.4Ghz
Bw: lora.Bandwidth_1625_0, Power: 13, // dBm
Sf: lora.SpreadingFactor9, RadioRamp: sx128x.RADIO_RAMP_02_US, // 2 microsecond ramp time
Cr: lora.CodingRate4_7, RegulatorMode: sx128x.REGULATOR_DC_DC,
HeaderType: sx128x.LORA_EXPLICIT_HEADER,
Preamble: 12, SpreadingFactor: sx128x.LORA_SF_9,
Ldr: lora.LowDataRateOptimizeOff, Bandwidth: sx128x.LORA_BW_1600,
Iq: sx128x.LORA_IQ_STD, CodingRate: sx128x.LORA_CR_4_7,
Crc: sx128x.LORA_CRC_DISABLE, PreambleLength: 12,
SyncWord: 0x1424, HeaderType: sx128x.LORA_HEADER_EXPLICIT,
LoraTxPowerDBm: 13, CrcType: sx128x.LORA_CRC_DISABLE,
IqType: sx128x.LORA_IQ_STD,
SyncWord: 0x1424, // the default private sync word
} }
radio.WaitWhileBusy() radio.WaitWhileBusy(time.Second)
SetupLora(radio, loraConfig) SetupLora(radio, loraConfig)
println("radio initialized, waiting for messages...") println("radio initialized, waiting for messages...")
for { for {
runtime.Gosched() runtime.Gosched()
if dio1Interrupt.Load() {
// println("DIO1 interrupt triggered")
irqStatus, _ := radio.GetIrqStatus()
println("irq status:", irqStatus)
if irqStatus&sx128x.IRQ_TX_DONE_MASK != 0 {
txDone.Store(true)
timeout.Store(false)
led.Set(false)
}
if irqStatus&sx128x.IRQ_RX_DONE_MASK != 0 {
rxDone.Store(true)
timeout.Store(false)
led.Set(true)
println("rx done")
}
if irqStatus&sx128x.IRQ_RX_TX_TIMEOUT_MASK != 0 {
timeout.Store(true)
txDone.Store(true)
rxDone.Store(true)
println("rx/tx timeout")
}
dio1Interrupt.Store(false)
}
if rxDone.Load() { if rxDone.Load() {
rxDone.Store(false) rxDone.Store(false)
if !timeout.Load() { if !timeout.Load() {
rxLength, rxPointer, _ := radio.GetRxBufferStatus() rxLength, rxPointer, _ := radio.GetRxBufferStatus()
rxData, _ := radio.ReadBuffer(rxPointer, rxLength) rxData, _ := radio.ReadBuffer(rxPointer, rxLength)
num, err := conn.Write(rxData) // num, err := conn.Write(rxData)
if err != nil { // if err != nil {
println("failed to send OSC message:", err) // println("failed to send OSC message:", err)
} else { // } else {
println("sent", num, "bytes to broker") // println("sent", num, "bytes to broker")
} // }
println("received message:", string(rxData))
led.Set(false) led.Set(false)
} }
@@ -167,7 +195,7 @@ func main() {
} }
} }
func SetupLora(radio *sx128x.Device, config lora.Config) { func SetupLora(radio *sx128x.Device, config LoRaConfig) {
// Switch to standby prior to configuration changes // Switch to standby prior to configuration changes
circuitMode, _, _ := radio.GetStatus() circuitMode, _, _ := radio.GetStatus()
@@ -176,16 +204,16 @@ func SetupLora(radio *sx128x.Device, config lora.Config) {
} }
// Clear errors, disable radio interrupts for the moment // Clear errors, disable radio interrupts for the moment
radio.SetPacketType(sx128x.PACKET_TYPE_LORA) radio.SetPacketType(sx128x.PACKET_TYPE_LORA)
radio.SetCadParams(sx128x.LORA_CAD_08_SYMBOLS) radio.SetCadParams(uint8(sx128x.LORA_CAD_08_SYMBOLS))
radio.SetRegulatorMode(sx128x.REGULATOR_DC_DC) radio.SetRegulatorMode(sx128x.REGULATOR_DC_DC)
radio.SetRfFrequency(config.Freq) radio.SetRfFrequency(config.Frequency)
radio.SetModulationParams(spreadingFactor(config.Sf), bandwidth(config.Bw), codingRate(config.Cr)) radio.SetModulationParamsLoRa(config.SpreadingFactor, config.Bandwidth, config.CodingRate)
data := [1]uint8{} data := [1]uint8{}
if config.Sf == lora.SpreadingFactor5 || config.Sf == lora.SpreadingFactor6 { if config.SpreadingFactor == lora.SpreadingFactor5 || config.SpreadingFactor == lora.SpreadingFactor6 {
data[0] = 0x1E data[0] = 0x1E
} else if config.Sf == lora.SpreadingFactor7 || config.Sf == lora.SpreadingFactor8 { } else if config.SpreadingFactor == lora.SpreadingFactor7 || config.SpreadingFactor == lora.SpreadingFactor8 {
data[0] = 0x37 data[0] = 0x37
} else { } else {
data[0] = 0x32 data[0] = 0x32
@@ -195,8 +223,8 @@ func SetupLora(radio *sx128x.Device, config lora.Config) {
data[0] = existing | 0x01 data[0] = existing | 0x01
radio.WriteRegister(0x93C, data[:]) radio.WriteRegister(0x93C, data[:])
radio.SetTxParams(config.LoraTxPowerDBm, sx128x.RADIO_RAMP_02_US) radio.SetTxParams(config.Power, sx128x.RADIO_RAMP_02_US)
radio.SetPacketParamsLoRa(uint32(config.Preamble), config.HeaderType, 0xFF, config.Crc, config.Iq) radio.SetPacketParamsLoRa(config.PreambleLength, config.HeaderType, 0xFF, config.CrcType, config.IqType)
var syncWord [2]uint8 var syncWord [2]uint8
syncWord[0] = uint8(config.SyncWord >> 8) syncWord[0] = uint8(config.SyncWord >> 8)
syncWord[1] = uint8(config.SyncWord & 0x00FF) syncWord[1] = uint8(config.SyncWord & 0x00FF)
@@ -214,7 +242,7 @@ func checkStatus(radio *sx128x.Device, operation string) {
} }
} }
func Rx(radio *sx128x.Device, loraConfig lora.Config) { func Rx(radio *sx128x.Device, loraConfig LoRaConfig) {
radio.SetStandby(sx128x.STANDBY_XOSC) radio.SetStandby(sx128x.STANDBY_XOSC)
radio.SetBufferBaseAddress(0, 0) radio.SetBufferBaseAddress(0, 0)
radio.SetDioIrqParams(sx128x.IRQ_RX_DONE_MASK|sx128x.IRQ_RX_TX_TIMEOUT_MASK, sx128x.IRQ_RX_DONE_MASK|sx128x.IRQ_RX_TX_TIMEOUT_MASK, 0x00, 0x00) radio.SetDioIrqParams(sx128x.IRQ_RX_DONE_MASK|sx128x.IRQ_RX_TX_TIMEOUT_MASK, sx128x.IRQ_RX_DONE_MASK|sx128x.IRQ_RX_TX_TIMEOUT_MASK, 0x00, 0x00)
@@ -224,56 +252,3 @@ func Rx(radio *sx128x.Device, loraConfig lora.Config) {
println("failed to set RX mode:", err) println("failed to set RX mode:", err)
} }
} }
func codingRate(cr uint8) uint8 {
switch cr {
case lora.CodingRate4_5:
return sx128x.LORA_CR_4_5
case lora.CodingRate4_6:
return sx128x.LORA_CR_4_6
case lora.CodingRate4_7:
return sx128x.LORA_CR_4_7
case lora.CodingRate4_8:
return sx128x.LORA_CR_4_8
default:
return 0
}
}
func spreadingFactor(sf uint8) uint8 {
switch sf {
case lora.SpreadingFactor5:
return sx128x.LORA_SF_5
case lora.SpreadingFactor6:
return sx128x.LORA_SF_6
case lora.SpreadingFactor7:
return sx128x.LORA_SF_7
case lora.SpreadingFactor8:
return sx128x.LORA_SF_8
case lora.SpreadingFactor9:
return sx128x.LORA_SF_9
case lora.SpreadingFactor10:
return sx128x.LORA_SF_10
case lora.SpreadingFactor11:
return sx128x.LORA_SF_11
case lora.SpreadingFactor12:
return sx128x.LORA_SF_12
default:
return 0
}
}
func bandwidth(bw uint8) uint8 {
switch bw {
case lora.Bandwidth_1625_0:
return sx128x.LORA_BW_1600
case lora.Bandwidth_812_5:
return sx128x.LORA_BW_800
case lora.Bandwidth_406_25:
return sx128x.LORA_BW_400
case lora.Bandwidth_203_125:
return sx128x.LORA_BW_200
default:
return 0
}
}