mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-19 06:03:57 +00:00
5130e9a120
Signed-off-by: deadprogram <ron@hybridgroup.com>
100 lines
2.3 KiB
Go
100 lines
2.3 KiB
Go
package main
|
|
|
|
// In this example, a Lora packet will be sent every 10s
|
|
// module will be in RX mode between two transmissions
|
|
|
|
import (
|
|
"machine"
|
|
"runtime/interrupt"
|
|
"time"
|
|
|
|
"tinygo.org/x/device/stm32"
|
|
|
|
rfswitch "tinygo.org/x/drivers/examples/sx126x/rfswitch"
|
|
|
|
"tinygo.org/x/drivers/sx126x"
|
|
)
|
|
|
|
const FREQ = 868100000
|
|
|
|
const (
|
|
LORA_DEFAULT_RXTIMEOUT_MS = 1000
|
|
LORA_DEFAULT_TXTIMEOUT_MS = 5000
|
|
)
|
|
|
|
var (
|
|
loraRadio *sx126x.Device
|
|
txmsg = []byte("Hello TinyGO")
|
|
)
|
|
|
|
// radioIntHandler will take care of radio interrupts
|
|
func radioIntHandler(intr interrupt.Interrupt) {
|
|
loraRadio.HandleInterrupt()
|
|
}
|
|
|
|
func main() {
|
|
println("\n# TinyGo Lora RX/TX test")
|
|
println("# ----------------------")
|
|
machine.LED.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
|
|
|
// Create the driver
|
|
loraRadio = sx126x.New(machine.SPI3)
|
|
loraRadio.SetDeviceType(sx126x.DEVICE_TYPE_SX1262)
|
|
|
|
// Create RF Switch
|
|
var radioSwitch rfswitch.CustomSwitch
|
|
loraRadio.SetRfSwitch(radioSwitch)
|
|
|
|
// Detect the device
|
|
state := loraRadio.DetectDevice()
|
|
if !state {
|
|
panic("sx126x not detected.")
|
|
}
|
|
|
|
// Add interrupt handler for Radio IRQs
|
|
intr := interrupt.New(stm32.IRQ_Radio_IRQ_Busy, radioIntHandler)
|
|
intr.Enable()
|
|
|
|
loraConf := sx126x.LoraConfig{
|
|
Freq: FREQ,
|
|
Bw: sx126x.SX126X_LORA_BW_500_0,
|
|
Sf: sx126x.SX126X_LORA_SF9,
|
|
Cr: sx126x.SX126X_LORA_CR_4_7,
|
|
HeaderType: sx126x.SX126X_LORA_HEADER_EXPLICIT,
|
|
Preamble: 12,
|
|
Ldr: sx126x.SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_OFF,
|
|
Iq: sx126x.SX126X_LORA_IQ_STANDARD,
|
|
Crc: sx126x.SX126X_LORA_CRC_ON,
|
|
SyncWord: sx126x.SX126X_LORA_MAC_PRIVATE_SYNCWORD,
|
|
LoraTxPowerDBm: 20,
|
|
}
|
|
|
|
loraRadio.LoraConfig(loraConf)
|
|
|
|
var count uint
|
|
for {
|
|
tStart := time.Now()
|
|
|
|
// Blocking RX for LORA_DEFAULT_RXTIMEOUT_MS
|
|
println("Start Lora RX for 10 sec")
|
|
for int(time.Now().Sub(tStart).Seconds()) < 10 {
|
|
buf, err := loraRadio.LoraRx(LORA_DEFAULT_RXTIMEOUT_MS)
|
|
|
|
if err != nil {
|
|
println("RX Error: ", err)
|
|
} else if buf != nil {
|
|
println("Packet Received: len=", len(buf), string(buf))
|
|
}
|
|
}
|
|
println("END Lora RX")
|
|
|
|
println("LORA TX size=", len(txmsg))
|
|
err := loraRadio.LoraTx(txmsg, LORA_DEFAULT_TXTIMEOUT_MS)
|
|
if err != nil {
|
|
println("TX Error:", err)
|
|
}
|
|
count++
|
|
}
|
|
|
|
}
|