I am using the LORA Drivers provided by zephyr for testing my SX1762 lora module with NRF52833 Development Kit. I am able to initialize and configure the LORA Peripherals. but when I am trying to send the buffer over LORA, I am coming up with error code -11 which suggests there is no contexts.
This is my main code:
int lora_configure(const struct device *dev, bool transmit) { int ret; struct lora_modem_config config; config.frequency = 865100000; //916800000; config.bandwidth = BW_125_KHZ; config.datarate = SF_10; config.preamble_len = 8; config.coding_rate = CR_4_5; config.tx_power = 4; config.iq_inverted = false; config.public_network = false; config.tx = transmit; ret = lora_config(dev, &config); if (ret < 0) { printk("LoRa device configuration failed"); return false; } return(true); } int main(void) { const struct device *dev_lora; int ret=0; int bytes; nrf_gpio_cfg_output(AN_SW1); nrf_gpio_cfg_output(AN_SW2); nrf_gpio_pin_set(AN_SW1); nrf_gpio_pin_clear(AN_SW2); printk("LoRa Point to Point Communications Example\n"); // Setup LoRa Radio Device: dev_lora = DEVICE_DT_GET(DT_ALIAS(lora0)); if (!device_is_ready(dev_lora)) { printk("%s: device not ready\n", dev_lora->name); return -1; } printk("%s: SPI Initialised\n", dev_lora->name); if (lora_configure(dev_lora, TRANSMIT)) { printk("LoRa Device Tx Configured\n"); } else { return -1; printk("LoRa Device Tx Config Failed\n"); } while (1) { ret = lora_test_cw(dev_lora,865100000,4,3); if (ret < 0) { printk("LoRa Test Fail :[%d]\n",ret); } else { printk("LoRa Test Success\n"); } k_msleep(1000); // Transmit data ret = lora_send(dev_lora, data_tx, sizeof(data_tx)); if (ret < 0) { printk("LoRa send failed:[%d]\n",ret); } else { bytes = sizeof(data_tx); printk("XMIT %d bytes: ", bytes); for (uint16_t i = 0; i < bytes; i++) printk("0x%02x ",data_tx[i]); printk("\n"); } k_msleep(2000); } return 0; }
int sx12xx_lora_send(const struct device *dev, uint8_t *data, uint32_t data_len) { struct k_poll_signal done = K_POLL_SIGNAL_INITIALIZER(done); struct k_poll_event evt = K_POLL_EVENT_INITIALIZER( K_POLL_TYPE_SIGNAL, K_POLL_MODE_NOTIFY_ONLY, &done); uint32_t air_time; int ret; /* Validate that we have a TX configuration */ if (!dev_data.tx_cfg.frequency) { return -EINVAL; } ret = sx12xx_lora_send_async(dev, data, data_len, &done); if (ret < 0) { return ret; } /* Calculate expected airtime of the packet */ air_time = Radio.TimeOnAir(MODEM_LORA, dev_data.tx_cfg.bandwidth, dev_data.tx_cfg.datarate, dev_data.tx_cfg.coding_rate, dev_data.tx_cfg.preamble_len, 0, data_len, true); LOG_DBG("Expected air time of %d bytes = %dms", data_len, air_time); /* Wait for the packet to finish transmitting. * Use twice the tx duration to ensure that we are actually detecting * a failed transmission, and not some minor timing variation between * modem and driver. */ ret = k_poll(&evt, 1, K_MSEC(2 * air_time)); if (ret < 0) { LOG_ERR("Packet transmission failed!"); if (!modem_release(&dev_data)) { /* TX done interrupt is currently running */ k_poll(&evt, 1, K_FOREVER); } } return ret; } int sx12xx_lora_send_async(const struct device *dev, uint8_t *data, uint32_t data_len, struct k_poll_signal *async) { /* Ensure available, freed by sx12xx_ev_tx_done */ if (!modem_acquire(&dev_data)) { return -EBUSY; } /* Store signal */ dev_data.operation_done = async; Radio.SetMaxPayloadLength(MODEM_LORA, data_len); Radio.Send(data, data_len); return 0; } static bool modem_release(struct sx12xx_data *data) { /* Increment atomic so both acquire and release will fail */ if (!atomic_cas(&data->modem_usage, STATE_BUSY, STATE_CLEANUP)) { return false; } /* Put radio back into sleep mode */ Radio.Sleep(); /* Completely release modem */ data->operation_done = NULL; atomic_clear(&data->modem_usage); return true; } static inline bool modem_acquire(struct sx12xx_data *data) { return atomic_cas(&data->modem_usage, STATE_FREE, STATE_BUSY); } int sx12xx_lora_test_cw(const struct device *dev, uint32_t frequency, int8_t tx_power, uint16_t duration) { /* Ensure available, freed in sx12xx_ev_tx_done */ if (!modem_acquire(&dev_data)) { return -EBUSY; } Radio.SetTxContinuousWave(frequency, tx_power, duration); return 0; }
00> LoRa send failed:[-16]
00> LoRa Test Fail :[-16]
00> [00:15:58.939,605] <dbg> sx12xx_common: sx12xx_lora_send: Expected air time of 10 bytes = 289ms
00> [00:16:00.384,704] <err> sx12xx_common: Packet transmission failed!
00> EINVAL[22] EBUSY[16]
00> LoRa send failed:[-11]