Skip to main content
Visitor II
August 26, 2025
Question

Interfacing SX1262 LoRa module using SPI DMA

  • August 26, 2025
  • 2 replies
  • 972 views

Hi everyone,
I am using STM32F103c8t6 module for transmitting and receiving data in between two SX1262 LoRa module. 
The libraries are found in https://github.com/Lora-net/sx126x_driver/tree/v2.3.2 link and i have successfully transmit and receive data using normal SPI communication but i want to transmit and receive the data using SPI DMA mode but i am unable to do that.
If anyone know about this please guide me regarding this. 

Thank you in advance!!

    This topic has been closed for replies.

    2 replies

    Super User
    August 26, 2025

    The SX1262 neither knows nor cares how the SPI lines get driven - it just requires that they are correct.

    So put an analyser on the lines, and compare what happens in your working non-DMA case against your non-working DMA case.

    Are you using the exact same hardware in both cases?

     

    PS:

    Also, have you tried the drivers direct from Semtech?

    https://www.semtech.com/products/wireless-rf/lora-connect/sx1262

     

    Visitor II
    August 26, 2025

    Thank you 
    Yes, i am using blue pill at transmitter end and receiver end. Yes i am using the driver for sx1262 from semtech.
    By following way i am initializing 

    init_LoRa_parm();
     sx126x_reset(&LoRa);
     sx126x_init(&LoRa );
     sx126x_set_dio2_as_rf_sw_ctrl(&LoRa, true);
     sx126x_set_dio3_as_tcxo_ctrl(&LoRa, SX126X_TCXO_CTRL_1_8V, 0x00000F);
     sx126x_get_device_errors(&LoRa, &errors);
     printf("before STDBY_XOSC, Errors = 0x%X\r\n", errors);
     sx126x_set_standby(&LoRa, SX126X_STANDBY_CFG_XOSC);
     sx126x_clear_device_errors( &LoRa);
     sx126x_get_device_errors(&LoRa, &errors);
     printf("After STDBY_XOSC, Errors = 0x%X\r\n", errors);
     Radio_init(&LoRa);
     sx126x_clear_irq_status( &LoRa, SX126X_IRQ_ALL );
     sx126x_set_dio_irq_params(
     		 &LoRa, SX126X_IRQ_ALL,
     SX126X_IRQ_TX_DONE | SX126X_IRQ_RX_DONE,
     SX126X_IRQ_NONE, SX126X_IRQ_NONE );
    
     sx126x_clear_irq_status( &LoRa, SX126X_IRQ_ALL );

    and in main loop i am putting the following function

    void on_tx_data(void)
    {
     sx126x_status_t status;
    
     // Prepare data
     for (int i = 0; i < 8; i++) {
     tx_buf[i] = counter++;
     }
    
     // Write buffer with error checking
     status = sx126x_write_buffer(&LoRa, 0, (const uint8_t*)tx_buf, 8);
     if (status != SX126X_STATUS_OK) {
     printf("Write buffer failed: %d\n", status);
     return;
     }
    
     // Set TX mode with error checking
     status = sx126x_set_tx(&LoRa, 0);
     if (status != SX126X_STATUS_OK) {
     printf("Set TX failed: %d\n", status);
     return;
     }
    
     // Print transmitted data
     printf("Sent: ");
     for (int i = 0; i < 8; i++) {
     printf("%d ", tx_buf[i]);
     }
     printf("\r\n");
    }

    where tx_buf is the global variable.
    and 

    void init_LoRa_parm(void)
    {
    	txdata[0] = 'M';
    	txdata[1] = 'L';
    	txdata[2] = 'o';
    	txdata[3] = 'R';
    	txdata[4] = 'a';
    
    	LoRa.BUSY_port = BUSY_GPIO_Port;
    	LoRa.BUSY_pin = BUSY_Pin;
    	LoRa.NSS_port = NSS_GPIO_Port;
    	LoRa.NSS_pin = NSS_Pin;
    	LoRa.RST_port = RST_GPIO_Port;
    	LoRa.RST_pin = RST_Pin;
    	LoRa.DIO1_port = DIO1_GPIO_Port;
    	LoRa.DIO1_pin = DIO1_Pin;
    
    	LoRa.hSPIx = &hspi1;
    }

    this is the initialization value.
    By taking this guide me to transmit the data over SPI DMA mode.

    Technical Moderator
    August 26, 2025

    @Shaktimayee

    And since you're talking about an "STM32F103c8t6 module", I assume it's a Blue Pill?

    If so, hardly anyone will be able to help you, as Asian clones have been used there for years. You would be doing yourself a favour to use one of the original, genuine NUCLEO boards instead, for which there is unrestricted support.

    Regards
    /Peter

    Visitor II
    August 26, 2025

    At least the SPI DMA transmission and reception operation will work on bluepill as the normal transmit and receive operation is occuring frequently.

    Super User
    August 26, 2025

    @Shaktimayee wrote:

    At least the SPI DMA transmission and reception operation will work on bluepill as the normal transmit and receive operation is occuring frequently.


    Not sure what you mean by that?

    It might be the clone's DMA which is the problem ...

     

    Again, have you used a scope and/or analyser to see what's actually happening on the SPI wires?

     

    PS:

    Have you tried with a genuine STM32?