diff --git a/sx127x/registers.go b/sx127x/registers.go index 903eb5120..b01bdbdd9 100644 --- a/sx127x/registers.go +++ b/sx127x/registers.go @@ -96,6 +96,12 @@ const ( SX127X_OPMODE_RX_SINGLE = uint8(0x06) SX127X_OPMODE_CAD = uint8(0x07) + SX127X_OPMODE_MODULATION_Pos = uint8(0x5) + SX127X_OPMODE_LOW_FREQUENCY_Pos = uint8(0x3) + + SX127X_OPMODE_MODULATION_FSK = 0x0 + SX127X_OPMODE_MODULATION_OOK = 0x1 + SX127X_LORA_MAC_PUBLIC_SYNCWORD = 0x34 SX127X_LORA_MAC_PRIVATE_SYNCWORD = 0x14 ) diff --git a/sx127x/sx127x.go b/sx127x/sx127x.go index f2c2a8737..9a7179923 100644 --- a/sx127x/sx127x.go +++ b/sx127x/sx127x.go @@ -25,9 +25,9 @@ type Device struct { rstPin machine.Pin // GPIO for reset radioEventChan chan lora.RadioEvent // Channel for Receiving events loraConf lora.Config // Current Lora configuration - controller RadioController // to manage interactions with the radio + controller RadioController // to manage interrupts with the radio deepSleep bool // Internal Sleep state - deviceType int // sx1261,sx1262,sx1268 (defaults sx1261) + deviceType int // sx1272, sx1273, sx1276, sx1279 (defaults sx1276) spiTxBuf []byte // global Tx buffer to avoid heap allocations in interrupt spiRxBuf []byte // global Rx buffer to avoid heap allocations in interrupt } @@ -81,9 +81,11 @@ func (d *Device) DetectDevice() bool { // ReadRegister reads register value func (d *Device) ReadRegister(reg uint8) uint8 { - d.controller.SetNss(false) + if d.controller != nil { + d.controller.SetNss(false) + } + // Send register - //d.spiTxBuf = []byte{reg & 0x7f} d.spiTxBuf = d.spiTxBuf[:0] d.spiTxBuf = append(d.spiTxBuf, byte(reg&0x7f)) d.spi.Tx(d.spiTxBuf, nil) @@ -91,13 +93,19 @@ func (d *Device) ReadRegister(reg uint8) uint8 { d.spiRxBuf = d.spiRxBuf[:0] d.spiRxBuf = append(d.spiRxBuf, 0) d.spi.Tx(nil, d.spiRxBuf) - d.controller.SetNss(true) + if d.controller != nil { + d.controller.SetNss(true) + } + return d.spiRxBuf[0] } // WriteRegister writes value to register func (d *Device) WriteRegister(reg uint8, value uint8) uint8 { - d.controller.SetNss(false) + if d.controller != nil { + d.controller.SetNss(false) + } + // Send register d.spiTxBuf = d.spiTxBuf[:0] d.spiTxBuf = append(d.spiTxBuf, byte(reg|0x80)) @@ -108,7 +116,10 @@ func (d *Device) WriteRegister(reg uint8, value uint8) uint8 { d.spiRxBuf = d.spiRxBuf[:0] d.spiRxBuf = append(d.spiRxBuf, 0) d.spi.Tx(d.spiTxBuf, d.spiRxBuf) - d.controller.SetNss(true) + if d.controller != nil { + d.controller.SetNss(true) + } + return d.spiRxBuf[0] } @@ -119,9 +130,24 @@ func (d *Device) SetOpMode(mode uint8) { d.WriteRegister(SX127X_REG_OP_MODE, new) } -// SetOpMode changes the sx1276 mode +// SetOpModeLora changes the sx1276 mode to lora. func (d *Device) SetOpModeLora() { - d.WriteRegister(SX127X_REG_OP_MODE, SX127X_OPMODE_LORA) + d.WriteRegister(SX127X_REG_OP_MODE, d.ReadRegister(SX127X_REG_OP_MODE)|SX127X_OPMODE_LORA) +} + +// SetOpModeFsk changes the sx1276 mode to fsk/ook. +func (d *Device) SetOpModeFsk() { + d.WriteRegister(SX127X_REG_OP_MODE, d.ReadRegister(SX127X_REG_OP_MODE)&^SX127X_OPMODE_LORA) +} + +// SetModulationType changes the modulation type (0=FSK, 1=OOK) +func (d *Device) SetModulationType(typ uint8) { + switch typ { + case SX127X_OPMODE_MODULATION_FSK: + d.WriteRegister(SX127X_REG_OP_MODE, d.ReadRegister(SX127X_REG_OP_MODE)&^(1<