Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions sx127x/registers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
48 changes: 37 additions & 11 deletions sx127x/sx127x.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down Expand Up @@ -81,23 +81,31 @@ 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)
// Read value
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))
Expand All @@ -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]
}

Expand All @@ -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<<SX127X_OPMODE_MODULATION_Pos))
case SX127X_OPMODE_MODULATION_OOK:
d.WriteRegister(SX127X_REG_OP_MODE, d.ReadRegister(SX127X_REG_OP_MODE)|(1<<SX127X_OPMODE_MODULATION_Pos))
}
}

// GetVersion returns hardware version of sx1276 chipset
Expand Down Expand Up @@ -244,9 +270,9 @@ func (d *Device) SetLowDataRateOptim(val uint8) {
// SetLowFrequencyModeOn enables Low Data Rate Optimization
func (d *Device) SetLowFrequencyModeOn(val bool) {
if val {
d.WriteRegister(SX127X_REG_OP_MODE, d.ReadRegister(SX127X_REG_OP_MODE)|0x04)
d.WriteRegister(SX127X_REG_OP_MODE, d.ReadRegister(SX127X_REG_OP_MODE)|(1<<SX127X_OPMODE_LOW_FREQUENCY_Pos))
} else {
d.WriteRegister(SX127X_REG_OP_MODE, d.ReadRegister(SX127X_REG_OP_MODE)&0xfb)
d.WriteRegister(SX127X_REG_OP_MODE, d.ReadRegister(SX127X_REG_OP_MODE)&^(1<<SX127X_OPMODE_LOW_FREQUENCY_Pos))
}
}

Expand Down