fix bug in SX1278 read received message

This commit is contained in:
soypat
2024-02-18 08:21:47 -08:00
parent 3112fe1b27
commit 7b9fb67069
4 changed files with 36 additions and 22 deletions
+3 -2
View File
@@ -6,6 +6,7 @@ import (
"context" "context"
"io" "io"
"machine" "machine"
"strconv"
"time" "time"
"github.com/soypat/lora" "github.com/soypat/lora"
@@ -17,7 +18,7 @@ var (
) )
const ( const (
SX127X_PIN_RST = machine.GP16 SX127X_PIN_RST = machine.GP6
// SPI definition for SX127x // SPI definition for SX127x
SX127X_PIN_SCK = machine.GP2 SX127X_PIN_SCK = machine.GP2
@@ -59,7 +60,7 @@ func main() {
if err != nil { if err != nil {
return err return err
} }
println("received LoRa:", string(rx[:n])) println("received LoRa length", n, ":", strconv.Quote(string(rx[:n])))
return nil return nil
}) })
+4 -3
View File
@@ -16,7 +16,7 @@ var (
) )
const ( const (
SX127X_PIN_RST = machine.GP16 SX127X_PIN_RST = machine.GP6
// SPI definition for SX127x // SPI definition for SX127x
SX127X_PIN_SCK = machine.GP2 SX127X_PIN_SCK = machine.GP2
@@ -27,6 +27,7 @@ const (
func main() { func main() {
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
println("program start")
defer println("program end") defer println("program end")
SX127X_PIN_RST.Configure(machine.PinConfig{Mode: machine.PinOutput}) SX127X_PIN_RST.Configure(machine.PinConfig{Mode: machine.PinOutput})
SX127X_PIN_CS.Configure(machine.PinConfig{Mode: machine.PinOutput}) SX127X_PIN_CS.Configure(machine.PinConfig{Mode: machine.PinOutput})
@@ -41,7 +42,6 @@ func main() {
} }
dev := sx127x.NewLoRa(SX127X_SPI, SX127X_PIN_CS.Set, SX127X_PIN_RST.Set) dev := sx127x.NewLoRa(SX127X_SPI, SX127X_PIN_CS.Set, SX127X_PIN_RST.Set)
cfg := sx127x.DefaultConfig(lora.Freq433_0M) cfg := sx127x.DefaultConfig(lora.Freq433_0M)
cfg.TxPower = 0 // Minimum power.
err = dev.Configure(cfg) err = dev.Configure(cfg)
if err != nil { if err != nil {
panic(err.Error()) panic(err.Error())
@@ -49,8 +49,9 @@ func main() {
randomU32, _ := dev.RandomU32() randomU32, _ := dev.RandomU32()
myName := fmt.Sprintf("user-%x", randomU32%0xffff) myName := fmt.Sprintf("user-%x", randomU32%0xffff)
println("config success; sending messages as ", myName)
packet := []byte(myName + " says hello!") packet := []byte(myName + " says hello!")
println("config success; sending messages as ", myName, "of length", len(packet))
for { for {
err = dev.Tx(packet) err = dev.Tx(packet)
if err != nil { if err != nil {
+6 -5
View File
@@ -76,13 +76,13 @@ const (
regPA_RAMP = 0x0a regPA_RAMP = 0x0a
regOCP = 0x0b regOCP = 0x0b
regLNA = 0x0c regLNA = 0x0c
regFIFO_ADDR_PTR = 0x0d regFIFO_ADDR_PTR = 0x0d // FIFO SPI Pointer.
regFIFO_TX_BASE_ADDR = 0x0e regFIFO_TX_BASE_ADDR = 0x0e // Start of Tx data. May overlap with Rx data.
regFIFO_RX_BASE_ADDR = 0x0f regFIFO_RX_BASE_ADDR = 0x0f // Start of Rx data. May overlap with Tx data.
regFIFO_RX_CURRENT_ADDR = 0x10 regFIFO_RX_CURRENT_ADDR = 0x10 // Start address of last packet received.
regIRQ_FLAGS_MASK = 0x11 regIRQ_FLAGS_MASK = 0x11
regIRQ_FLAGS = 0x12 regIRQ_FLAGS = 0x12
regRX_NB_BYTES = 0x13 regRX_NB_BYTES = 0x13 // Number of received bytes.
regPKT_SNR_VALUE = 0x19 regPKT_SNR_VALUE = 0x19
regPKT_RSSI_VALUE = 0x1a regPKT_RSSI_VALUE = 0x1a
regRSSI_VALUE = 0x1b regRSSI_VALUE = 0x1b
@@ -94,6 +94,7 @@ const (
regPAYLOAD_LENGTH = 0x22 regPAYLOAD_LENGTH = 0x22
regMAX_PAYLOAD_LENGTH = 0x23 regMAX_PAYLOAD_LENGTH = 0x23
regHOP_PERIOD = 0x24 regHOP_PERIOD = 0x24
regFIFO_RX_BYTE_ADDR = 0x25 // Address of last byte received in FIFO.
regMODEM_CONFIG_3 = 0x26 regMODEM_CONFIG_3 = 0x26
regFREQ_ERROR_MSB = 0x28 regFREQ_ERROR_MSB = 0x28
regFREQ_ERROR_MID = 0x29 regFREQ_ERROR_MID = 0x29
+23 -12
View File
@@ -1067,10 +1067,7 @@ func (d *DeviceLoRa) readerToLastPacket() (_ *fifoReader, err error) {
} }
// We now know that the packet has been received succesfully. Proceed to read. // We now know that the packet has been received succesfully. Proceed to read.
curraddr, err := d.read8(regFIFO_RX_CURRENT_ADDR) // RxNbBytes indicates the number of received bytes thus far.
if err != nil {
return nil, err
}
numBytes, err := d.read8(regRX_NB_BYTES) numBytes, err := d.read8(regRX_NB_BYTES)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -1078,16 +1075,30 @@ func (d *DeviceLoRa) readerToLastPacket() (_ *fifoReader, err error) {
if numBytes == 0 { if numBytes == 0 {
return nil, errors.New("readerToNextPacket called with RX_NB_BYTES=0") return nil, errors.New("readerToNextPacket called with RX_NB_BYTES=0")
} }
// FIFORxCurrentAddr is the location in the FIFO of the last packet received.
curraddr, err := d.read8(regFIFO_RX_CURRENT_ADDR)
if err != nil {
return nil, err
}
byteAddr, err := d.read8(regFIFO_RX_BYTE_ADDR)
if err != nil {
return nil, err
}
calcNumBytes := byteAddr - curraddr
if calcNumBytes != numBytes {
println("inconsistent numBytes", numBytes, "calcNumBytes", calcNumBytes)
}
err = d.Write8(regFIFO_ADDR_PTR, curraddr) err = d.Write8(regFIFO_ADDR_PTR, curraddr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &fifoReader{d: d, leftToRead: numBytes}, nil return &fifoReader{D: d, BTR: numBytes}, nil
} }
type fifoReader struct { type fifoReader struct {
d *DeviceLoRa D *DeviceLoRa
leftToRead uint8 // Bytes to read.
BTR uint8
} }
func (f *fifoReader) Read(buf []byte) (int, error) { func (f *fifoReader) Read(buf []byte) (int, error) {
@@ -1096,20 +1107,20 @@ func (f *fifoReader) Read(buf []byte) (int, error) {
} }
func (f *fifoReader) readInternal(buf []byte) (_ uint8, err error) { func (f *fifoReader) readInternal(buf []byte) (_ uint8, err error) {
if f.leftToRead == 0 { if f.BTR == 0 {
return 0, io.EOF return 0, io.EOF
} }
toRead := f.leftToRead toRead := f.BTR
if int(toRead) > len(buf) { if int(toRead) > len(buf) {
toRead = uint8(len(buf)) toRead = uint8(len(buf))
} }
for i := uint8(0); i < toRead; i-- { for i := uint8(0); i < toRead; i++ {
buf[i], err = f.d.read8(regFIFO) buf[i], err = f.D.read8(regFIFO)
if err != nil { if err != nil {
return i, err return i, err
} }
} }
f.leftToRead -= toRead f.BTR -= toRead
return toRead, nil return toRead, nil
} }