Skip to main content
Explorer
October 27, 2024
Question

SPI with GPDMA

  • October 27, 2024
  • 2 replies
  • 2129 views

Hi!

I would like to know if there is a way to handle "automaticaly" a transmit then receive transfert using SPI and DMA ?

I think using linked list should be possible, but i don't know how to configure that.. 

 

-Create a single linked list (only 1 GPDMA channel)

-Configure a 1st node with request from SPI1_TX, the tx buffer and len and add it to the linked list

-Configure a 2nd node with request from SPI1_RX, the rx buffer and len and add it to the linked list

-Call HAL_SPI_TransmitReceive_DMA

do you think it should works ?

 

The goal is multiple.. only 1 GPDMA channel used, manage automatically Transmit then Receive for 1 transfert..

 

I have same needs for 2 QuadSPI drivers.

 

thank for help.

    This topic has been closed for replies.

    2 replies

    Technical Moderator
    October 28, 2024

    Hello @Rickou73 ,

     

    To configure SPI with GPDMA, I recommend you to start with available SPIs examples like these:

    SPI_FullDuplex_ComDMA_Slave

    SPI_FullDuplex_ComDMA_Master

     

    Also, I advise you to take a look at this FAQ may help you "How to configure the GPDMA - STMicroelectronics Community"

     

    I hope this help you.

    Kaouthar

     

    Rickou73Author
    Explorer
    October 28, 2024

    hi @KDJEM.1 

    thank you but I already know these examples..

    In my case, I'm targeting a device that is not full duplex.

    In this specific setup, i need in a same chip select transfer to 1st transmit some bytes, then receive some bytes.

     

    So, I asks if it's possible to:

    Using a Single (or 2) DMA channel with linked list and HAL to do both "half transfert" in a single transaction without code interaction ?

    actual pseudo-code:

    txbuffer[4]={......};

    rxbuffer[128];

    ChipSelect_Enable();

    HAL_SPI_Transmit_DMA(dmaCh1, txbuffer,4);

    WaitForDMAComplete(dmaCh1);

    HAL_SPI_Receive_DMA(dmaCh2,rxbuffer,128);

    WaitForDMAComplete(dmaCh2);

    ChipSelect_Disable();

     

    Thinking pseudo-code:

    txbuffer[4]={......};

    rxbuffer[128];

    ChipSelect_Enable();

    HAL_SPI_Transmit_Receive_DMA(dmaCh1,txbuffer,4,rxbuffer,128); // In half duplex !

    WaitForDMAComplete(dmaCh1);

    ChipSelect_Disable();

     

    Technical Moderator
    October 29, 2024

    Hello @Rickou73 ,

     

    Thank you for updating post.

    Do you want to use half-duplex to run a Half-Duplex communication or simplex communication?

    KDJEM1_0-1730199437249.png

    KDJEM1_1-1730199593279.png

    In these cases,  the SS works as a standard ‘chip select’ input and lets the slave communicate with the master in slave mode. In Master mode, the SS can be used either as an output or an input. 

    In a configuration with two or more independent slaves, the master uses a star topology with dedicated GPIO pins to manage the chip select lines for each slave separately.

    As mentioned in RM0456  section 17.4.5 GPDMA linked-list data structure "The direct programming mode, a channel can be programmed by a list of transfers, known as a list of linked-list items (LLI). Each LLI is defined by its data structure. " So, I didn't any limitation to one channel with a list of transfer. 

    So, if you used two nodes, the first node in the loop is where the LLR from the last node in the queue is pointed as mentioned in this FAQ "How to configure the linked list mode in STM32CubeMX". 

    KDJEM1_2-1730205432813.png

    Thank you.

    Kaouthar

    Rickou73Author
    Explorer
    October 29, 2024

    Hi @KDJEM.1 

    none of both ... 

    in fact it is a full duplex electrically, 

    but protocol is same as a SPI RAM/EEPROM 

    1st part of transaction, host send the wanted address, then 2nd part host read datas from device.

    Rickou73_0-1730211805972.png

     

    I thnink linked list can do the job, but in SPI init configuration there is 2 handlers for 2 DMA channels.. 1 for Tx, the other for Rx, so in this configuration, i can't use linked list..

    and linked to that, which function should i call ?

     

    i don't find this kind of example.

     

    but this is the goal of this post, maybe it is not possible to do Tx, then Rx, using 1 DMA channel on SPI without code interaction during the full transaction..

     

    For example, the octospi allow to do this.. only 1 DMA handler for both command Tx, then data Rx...