micropython / micropython-lib

Core Python libraries ported to MicroPython

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SX1262 LORA driver error: RuntimeError: Internal radio Status (2, 1) OpError 0x20

gampam2000 opened this issue · comments

Hi,

I use a LILYGO T3-S3 with an ESP32-S3 and SX1262 LoRa chip.
Lora send and receive works perfectly fine with this driver: https://github.com/ehong-tl/micropySX126X

I know wanted to test the async driver of this micropython-lib, but I can't get it to work.

Here is my complete stripped down test program to test both drivers:

from machine import Pin,SPI
import asyncio

import ubinascii

sx = None
#other driver from https://github.com/ehong-tl/micropySX126X
def configure_sync_lora():
    global sx
    from sx1262 import SX1262

    sx = SX1262(spi_bus=1, clk=5, mosi=6, miso=3, cs=7, irq=33, rst=8, gpio=34)
    sx.begin(freq=869.525000, bw=250.0, sf=7, cr=5, syncWord=0x12,
        power=0, currentLimit=60.0, preambleLength=8,
        implicit=False, implicitLen=0xFF,
        crcOn=True, txIq=False, rxIq=False,
        tcxoVoltage=1.8, useRegulatorLDO=False, blocking=False)

# Initialize LoRa Modem
def get_async_modem():
    from lora import AsyncSX1262
    
    lora_cfg = {
        "freq_khz": 869525,
        "sf": 7,
        "bw": "250",  # kHz
        "coding_rate": 5,
        "preamble_len": 8,
        "output_power": 0,
        "implicit_header": False,
        "crc_en": True,
        "syncword" : 0x12,
        "dio3_tcxo_millivolts" : 1800
     }
    
    lora_spi = SPI(1, baudrate=2000_000, miso=Pin(3), mosi=Pin(6), sck=Pin(5))

    return AsyncSX1262(
         spi=lora_spi,
         cs=Pin(7),
         busy=Pin(34),
         dio1=Pin(33),
         reset=Pin(8),
         lora_cfg=lora_cfg,
    )

async def send_coro(modem):
    counter = 0
    while True:
        print("Sending...")
        await modem.send(f"Hello world from async MicroPython #{counter}".encode())
        print("Sent!")
        await asyncio.sleep(5)
        counter += 1

#uses working driver
def send(payload):
    global sx
    print("LoRa Sender")
    sends = ubinascii.hexlify(payload)
    print("TX: {}".format((sends[0:30])))
    sx.send(payload)


print('Start')

async def main_task():

    #comment out the following 4 lines to use alternate driver
    modem = get_async_modem()
    modem.calibrate()
    print('Send')
    asyncio.create_task(send_coro(modem))
   
    #uncomment to run alternate driver
    #configure_sync_lora()
    #send("Test Lora Payload")
    
    asyncio.sleep(5)

try:
    loop = asyncio.get_event_loop()
    loop.create_task(main_task())
    loop.run_forever()
    print("i should never get printed")
finally:
    asyncio.new_event_loop()  

The other driver works perfect, with the driver of micropython-lib I get:

Start
Send
Sending...
Task exception wasn't retrieved
future: <Task> coro= <generator object 'send_coro' at 3c1622a0>
Traceback (most recent call last):
  File "asyncio/core.py", line 1, in run_until_complete
  File "<stdin>", line 54, in send_coro
  File "/lib/lora/async_modem/async_modem.py", line 65, in send
  File "/lib/lora/sx126x.py", line 616, in prepare_send
  File "/lib/lora/sx126x.py", line 332, in _check_error
RuntimeError: Internal radio Status (2, 1) OpError 0x20

Any suggestions, what this means? or how i can fix this?

commented

I had similar problem with the synchronous SX1262 on a Heltec v3, but solved it with the argument dio3_tcxo_millivolts=1800, but not in the lora_cfg. (My pins are different)

return SX1262(
  spi=lora_spi,
  cs=Pin(8),
  busy=Pin(13),
  dio1=Pin(14),
  reset=Pin(12),
  dio3_tcxo_millivolts=1800,
  lora_cfg=lora_cfg,
)

Hi, thanks for the reply that solved it!!! Some parameters are not set from the config but directly in the constructor.

here the updated code:

 Initialize LoRa Modem
def get_async_modem():
    from lora import AsyncSX1262
    
    lora_cfg = {
        "freq_khz": 869525,
        "sf": 7,
        "bw": "250",  # kHz
        "coding_rate": 5,
        "preamble_len": 8,
        "output_power": 0,
        "implicit_header": False,
        "crc_en": True,
        "syncword" : 0x12
     }
    
    lora_spi = SPI(1, baudrate=2000_000, miso=Pin(3), mosi=Pin(6), sck=Pin(5))

    return AsyncSX1262(
         spi=lora_spi,
         cs=Pin(7),
         busy=Pin(34),
         dio1=Pin(33),
         reset=Pin(8),
         dio3_tcxo_millivolts=1800,
         lora_cfg=lora_cfg,
    )