This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS570LS1224: TMS570LS1224: MibSPI3 TX using DMA not working (urgent help needed)

Part Number: TMS570LS1224
Other Parts Discussed in Thread: HALCOGEN, TMS570LS3137

Tool/software:

Hi,

I’m working on the TMS570LS1224 LaunchPad and trying to implement MibSPI3 transmit using DMA (TX-only). I’ve successfully implemented MibSPI3 without DMA, but DMA TX is not working despite trying several approaches. There is no GUI support for MibSPI DMA in HALCoGen (v04.07.01), so I’ve manually configured DMA via code. It will be very helpful if you support with DMA RX also. i will attach the screen shoot of logic analyzer also for reference.

uint16_t tx_data[10] = {0xAA01, 0xAA02, 0xAA03, 0xAA04, 0xAA05,
                        0xAA06, 0xAA07, 0xAA08, 0xAA09, 0xAA0A};

g_dmaCTRL g_dmaCTRLPKT_TX;

void dmaSetupForMibspi3_Tx()
{
    g_dmaCTRLPKT_TX.SADD      = (uint32_t)tx_data;
    g_dmaCTRLPKT_TX.DADD      = (uint32_t)&(mibspiRAM3->tx[0].data);
    g_dmaCTRLPKT_TX.CHCTRL    = 0;
    g_dmaCTRLPKT_TX.FRCNT     = 1;
    g_dmaCTRLPKT_TX.ELCNT     = 10;
    g_dmaCTRLPKT_TX.ELDOFFSET = 2;
    g_dmaCTRLPKT_TX.ELSOFFSET = 0;
    g_dmaCTRLPKT_TX.FRDOFFSET = 0;
    g_dmaCTRLPKT_TX.PORTASGN  = 0U;
    g_dmaCTRLPKT_TX.RDSIZE    = ACCESS_16_BIT;
    g_dmaCTRLPKT_TX.WRSIZE    = ACCESS_16_BIT;
    g_dmaCTRLPKT_TX.TTYPE     = BLOCK_TRANSFER;  // tried FRAME_TRANSFER too
    g_dmaCTRLPKT_TX.ADDMODERD = ADDR_INC1;
    g_dmaCTRLPKT_TX.ADDMODEWR = ADDR_FIXED;
    g_dmaCTRLPKT_TX.AUTOINIT  = AUTOINIT_OFF;

    dmaSetCtrlPacket(DMA_CH0, g_dmaCTRLPKT_TX);
}

int main(void)
{
    mibspiInit();
    gioInit();

    dmaSetupForMibspi3_Tx();
    dmaEnable();
    dmaReqAssign(DMA_CH0, 14); // MibSPI3_TX = DMA_REQ14
    dmaSetChEnable(DMA_CH0, DMA_SW);

//    mibspiSetData(mibspiREG3, 0, tx_data);  // for trying with out DMA 

    mibspiTransfer(mibspiREG3, 0); 

    while(!(mibspiIsTransferComplete(mibspiREG3, 0)));

    while(1);
}

Without DMA :

With DMA:

White check mark Setup:

MibSPI3 is initialized using HALCoGen

DMA is manually initialized in code (see below)

I'm using DMA Channel 0 and DMA Request Line 14 for MibSPI3_TX

Mag Issue:

DMA transfer never seems to take place.

Data is not moved to mibspiRAM3->tx[], and MOSI pin shows no activity.

Without DMA (mibspiSetData()), the transfer works fine.

  • Hi Adarsh,

    Thanks for contacting us!

    First i will suggest you to refer below video tutorial on MibSPI DMA:

    (+) [FAQ] TMS570LC4357: Examples and Demos available for Hercules Controllers (E.g. TMS570x, RM57x and RM46x etc) - Arm-based microcontrollers forum - Arm-based microcontrollers - TI E2E support forums

    And also, we do have one MibSPI DMA example in HALCoGen:

    If you refer these two, hopefully this should solve your problem, if not then i will debug your issue further.

    --
    Thanks & regards,
    Jagadish.

  • Hi Jagadish,

    Thank you for your reply.

    I have already gone through all the forum posts related to MibSPI DMA, but I haven’t been able to identify what’s wrong with my code.

    I am working with the TMS570LS1224, where MibSPI3 TX is mapped to DMAREQ14 and RX to . For now, I am only trying to implement TX using DMA.

    I have tried all possible combinations and configurations, but unfortunately, I am not getting the desired output. As shown in the screenshots I uploaded earlier, MibSPI3 transmission works perfectly without DMA. However, when I attempt to use DMA for TX, it does not work.

    Could you please help me identify what might be going wrong?

    Best regards,
    Adarsh G N

    #define DMA_CHANNEL_TX     DMA_CH0
    #define MIBSPI3_TX_REQLINE 14
    #define TG0_LENGTH         10
    
    uint16_t tx_data[TG0_LENGTH] = {0xAA01, 0xAA02, 0xAA03, 0xAA04, 0xAA05,0xAA06, 0xAA07, 0xAA08, 0xAA09, 0xAA0A};
    
    g_dmaCTRL g_dmaCTRLPKT_TX;
    
    void dmaSetupForMibspi3_Tx()
    {
        g_dmaCTRLPKT_TX.SADD      = (uint32_t)tx_data;
        g_dmaCTRLPKT_TX.DADD      = (uint32_t)&(mibspiRAM3->tx[0].data);
        g_dmaCTRLPKT_TX.CHCTRL    = 0;
        g_dmaCTRLPKT_TX.FRCNT     = 1;
        g_dmaCTRLPKT_TX.ELCNT     = 10;
        g_dmaCTRLPKT_TX.ELDOFFSET = 2;                  // tried 4 and 0 
        g_dmaCTRLPKT_TX.ELSOFFSET = 0;
        g_dmaCTRLPKT_TX.FRDOFFSET = 0;
        g_dmaCTRLPKT_TX.PORTASGN  = 0U;
        g_dmaCTRLPKT_TX.RDSIZE    = ACCESS_16_BIT;
        g_dmaCTRLPKT_TX.WRSIZE    = ACCESS_16_BIT;
        g_dmaCTRLPKT_TX.TTYPE     = BLOCK_TRANSFER;  // tried FRAME_TRANSFER too
        g_dmaCTRLPKT_TX.ADDMODERD = ADDR_INC1;
        g_dmaCTRLPKT_TX.ADDMODEWR = ADDR_FIXED;
        g_dmaCTRLPKT_TX.AUTOINIT  = AUTOINIT_OFF;   //tried AUTOINIT_On too
    
        dmaSetCtrlPacket(DMA_CH0, g_dmaCTRLPKT_TX);
    }
    
    void mibspi3_DMA_configure(void)
    {
        uint8 bufid  = TG0_LENGTH - 1;
    
        mibspiREG3->DMACTRL[0] = (uint32)0;                         // Clear before setting
        mibspiREG3->DMACTRL[0] |= (uint32)(1 << 31);                // ONESHOT = 1
        mibspiREG3->DMACTRL[0] |= (uint32)(14 << 16);               // TXDMA_MAP = 14 (MibSPI3 TX)
        mibspiREG3->DMACTRL[0] |= (uint32)(1 << 14);                // TXDMAENA = 1
        mibspiREG3->DMACTRL[0] |= (uint32)(1 << 13);                // NOBRK = 1
        mibspiREG3->DMACTRL[0] |= (uint32)(bufid << 9);             // ICOUNT = TG0_LENGTH - 1
    }
    
    int main(void)
    {
        mibspiInit();
        gioInit();
    	dmaReqAssign(DMA_CH0, MIBSPI3_TX_REQLINE); // MibSPI3_TX = DMA_REQ14
    	
        dmaSetupForMibspi3_Tx();
    
        dmaEnable();
        
        dmaSetChEnable(DMA_CH0, DMA_SW);
    	
    	mibspi3_DMA_configure();
    
    //    mibspiSetData(mibspiREG3, 0, tx_data);  // for trying with out DMA 
    
        mibspiTransfer(mibspiREG3, 0); 
    
        while(!(mibspiIsTransferComplete(mibspiREG3, 0)));
    
        while(1);
    	// I will be verifying the data in Logic analyzer so i am not using mibspiGetData();
    }

  • Hi Adarsh,

    I don't have exact same board, so i created same example as yours in my TMS570LS3137 board for mibSPI1.

    Here is my working project:

    MibSPI_TX_DMA_LS3137.zip

    Take this as a reference project and do the corresponding modifications on your project.

    On my observation, i am suspecting two main things that could lead to the issue on your end.

    1. I didn't see port assignment to 4 on your code:

    2. On your code you are using Request line 14 for mibSPI TX right, but this seems like receiving request from TRM:

    So, change it to request line 15 and try:

    So, please try with above modifications and let me know the result.

    --

    Thanks & regards,
    Jagadish.

  • Hi Jagadish,

    Thank you for sending your project .

    it helped me. 

    Thanks & regards,
    Adarsh G N .