MCXA153: LPSPI data burst transfer.

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

MCXA153: LPSPI data burst transfer.

245 Views
bogdan_u
Contributor I

Hello,

The Reference Manual MCXA153 contains a description of the TDBRn and RDBRn LPSPI registers:
"TDBRn and RDBRn registers supports burst transfers of data to the transmit FIFO for use with the DMA controller".
Can anyone share sample code for a burst transfer using these registers?

best regards
Bogdan

0 Kudos
Reply
1 Reply

102 Views
Harry_Zhang
NXP Employee
NXP Employee

Hi @bogdan_u 

Sorry, there are currently no relevant examples available.

The closest MCXA153 example I found uses LPSPI_MasterTransferEDMALite() with eDMA, but the driver targets TDR/RDR via LPSPI_GetTxRegisterAddress() / LPSPI_GetRxRegisterAddress() , not the burst alias window.

But i think you can try to use.

typedef struct
{
    uint32_t cmd;          
    uint32_t data[128];    
} lpspi_burst_tx_t;
static inline uint32_t LPSPI_TCBR_Address(LPSPI_Type *base)
{
    return ((uint32_t)base + LPSPI_TCBR_OFFSET);
}

static inline uint32_t LPSPI_TDBR0_Address(LPSPI_Type *base)
{
    return ((uint32_t)base + LPSPI_TDBR0_OFFSET);
}

static inline uint32_t LPSPI_RDBR0_Address(LPSPI_Type *base)
{
    return ((uint32_t)base + LPSPI_RDBR0_OFFSET);
}

void LPSPI_StartTxBurstDMA(LPSPI_Type *base,
                           edma_handle_t *txDmaHandle,
                           uint32_t *cmd_plus_data,
                           uint32_t nwords)
{
    edma_transfer_config_t cfg = {0};

    cfg.srcAddr           = (uint32_t)&cmd_plus_data[0];
    cfg.destAddr          = LPSPI_TCBR_Address(base);
    cfg.srcOffset         = 4;
    cfg.destOffset        = 4;
    cfg.srcTransferSize   = kEDMA_TransferSize4Bytes;
    cfg.destTransferSize  = kEDMA_TransferSize4Bytes;
    cfg.minorLoopBytes    = 4;
    cfg.majorLoopCounts   = nwords + 1u;

    EDMA_ResetChannel(txDmaHandle->base, txDmaHandle->channel);
    EDMA_SetTransferConfig(txDmaHandle->base, txDmaHandle->channel, &cfg, NULL);

    EDMA_StartTransfer(txDmaHandle);
    LPSPI_EnableDMA(base, kLPSPI_TxDmaEnable);
}


void LPSPI_StartRxBurstDMA(LPSPI_Type *base,
                           edma_handle_t *rxDmaHandle,
                           uint32_t *rx_words,
                           uint32_t nwords)
{
    edma_transfer_config_t cfg = {0};

    cfg.srcAddr           = LPSPI_RDBR0_Address(base);
    cfg.destAddr          = (uint32_t)&rx_words[0];
    cfg.srcOffset         = 4;
    cfg.destOffset        = 4;
    cfg.srcTransferSize   = kEDMA_TransferSize4Bytes;
    cfg.destTransferSize  = kEDMA_TransferSize4Bytes;
    cfg.minorLoopBytes    = 4;
    cfg.majorLoopCounts   = nwords;

    EDMA_ResetChannel(rxDmaHandle->base, rxDmaHandle->channel);
    EDMA_SetTransferConfig(rxDmaHandle->base, rxDmaHandle->channel, &cfg, NULL);

    EDMA_StartTransfer(rxDmaHandle);
    LPSPI_EnableDMA(base, kLPSPI_RxDmaEnable);
}

 

BR

Harry

 

0 Kudos
Reply
%3CLINGO-SUB%20id%3D%22lingo-sub-2387348%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EMCXA153%3A%20LPSPI%20data%20burst%20transfer.%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2387348%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EHello%2C%3C%2FP%3E%3CP%3EThe%20Reference%20Manual%20MCXA153%20contains%20a%20description%20of%20the%20TDBRn%20and%20RDBRn%20LPSPI%20registers%3A%3CBR%20%2F%3E%22TDBRn%20and%20RDBRn%20registers%20supports%20burst%20transfers%20of%20data%20to%20the%20transmit%20FIFO%20for%20use%20with%20the%20DMA%20controller%22.%3CBR%20%2F%3ECan%20anyone%20share%20sample%20code%20for%20a%20burst%20transfer%20using%20these%20registers%3F%3C%2FP%3E%3CP%3Ebest%20regards%3CBR%20%2F%3EBogdan%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-LABS%20id%3D%22lingo-labs-2387348%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CLINGO-LABEL%3ECommunication%20%26amp%3B%20Control(I3C%20%7C%20I2C%20%7C%20SPI%20%7C%20FlexCAN%20%7C%20Ethernet%20%7C%20FlexIO)%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EMCXA%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2388714%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20MCXA153%3A%20LPSPI%20data%20burst%20transfer.%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2388714%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EHi%26nbsp%3B%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F20898%22%20target%3D%22_blank%22%3E%40bogdan_u%3C%2FA%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3ESorry%2C%20there%20are%20currently%20no%20relevant%20examples%20available.%3C%2FP%3E%0A%3CP%3EThe%20closest%20MCXA153%20example%20I%20found%20uses%20LPSPI_MasterTransferEDMALite()%20with%20eDMA%2C%20but%20the%20driver%20targets%20TDR%2FRDR%20via%20LPSPI_GetTxRegisterAddress()%20%2F%20LPSPI_GetRxRegisterAddress()%20%2C%20not%20the%20burst%20alias%20window.%3C%2FP%3E%0A%3CP%3EBut%20i%20think%20you%20can%20try%20to%20use.%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3Etypedef%20struct%0A%7B%0A%20%20%20%20uint32_t%20cmd%3B%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20uint32_t%20data%5B128%5D%3B%20%20%20%20%0A%7D%20lpspi_burst_tx_t%3B%3C%2FCODE%3E%3C%2FPRE%3E%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3Estatic%20inline%20uint32_t%20LPSPI_TCBR_Address(LPSPI_Type%20*base)%0A%7B%0A%20%20%20%20return%20((uint32_t)base%20%2B%20LPSPI_TCBR_OFFSET)%3B%0A%7D%0A%0Astatic%20inline%20uint32_t%20LPSPI_TDBR0_Address(LPSPI_Type%20*base)%0A%7B%0A%20%20%20%20return%20((uint32_t)base%20%2B%20LPSPI_TDBR0_OFFSET)%3B%0A%7D%0A%0Astatic%20inline%20uint32_t%20LPSPI_RDBR0_Address(LPSPI_Type%20*base)%0A%7B%0A%20%20%20%20return%20((uint32_t)base%20%2B%20LPSPI_RDBR0_OFFSET)%3B%0A%7D%0A%0Avoid%20LPSPI_StartTxBurstDMA(LPSPI_Type%20*base%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20edma_handle_t%20*txDmaHandle%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20*cmd_plus_data%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20nwords)%0A%7B%0A%20%20%20%20edma_transfer_config_t%20cfg%20%3D%20%7B0%7D%3B%0A%0A%20%20%20%20cfg.srcAddr%20%20%20%20%20%20%20%20%20%20%20%3D%20(uint32_t)%26amp%3Bcmd_plus_data%5B0%5D%3B%0A%20%20%20%20cfg.destAddr%20%20%20%20%20%20%20%20%20%20%3D%20LPSPI_TCBR_Address(base)%3B%0A%20%20%20%20cfg.srcOffset%20%20%20%20%20%20%20%20%20%3D%204%3B%0A%20%20%20%20cfg.destOffset%20%20%20%20%20%20%20%20%3D%204%3B%0A%20%20%20%20cfg.srcTransferSize%20%20%20%3D%20kEDMA_TransferSize4Bytes%3B%0A%20%20%20%20cfg.destTransferSize%20%20%3D%20kEDMA_TransferSize4Bytes%3B%0A%20%20%20%20cfg.minorLoopBytes%20%20%20%20%3D%204%3B%0A%20%20%20%20cfg.majorLoopCounts%20%20%20%3D%20nwords%20%2B%201u%3B%0A%0A%20%20%20%20EDMA_ResetChannel(txDmaHandle-%26gt%3Bbase%2C%20txDmaHandle-%26gt%3Bchannel)%3B%0A%20%20%20%20EDMA_SetTransferConfig(txDmaHandle-%26gt%3Bbase%2C%20txDmaHandle-%26gt%3Bchannel%2C%20%26amp%3Bcfg%2C%20NULL)%3B%0A%0A%20%20%20%20EDMA_StartTransfer(txDmaHandle)%3B%0A%20%20%20%20LPSPI_EnableDMA(base%2C%20kLPSPI_TxDmaEnable)%3B%0A%7D%0A%0A%0Avoid%20LPSPI_StartRxBurstDMA(LPSPI_Type%20*base%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20edma_handle_t%20*rxDmaHandle%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20*rx_words%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20nwords)%0A%7B%0A%20%20%20%20edma_transfer_config_t%20cfg%20%3D%20%7B0%7D%3B%0A%0A%20%20%20%20cfg.srcAddr%20%20%20%20%20%20%20%20%20%20%20%3D%20LPSPI_RDBR0_Address(base)%3B%0A%20%20%20%20cfg.destAddr%20%20%20%20%20%20%20%20%20%20%3D%20(uint32_t)%26amp%3Brx_words%5B0%5D%3B%0A%20%20%20%20cfg.srcOffset%20%20%20%20%20%20%20%20%20%3D%204%3B%0A%20%20%20%20cfg.destOffset%20%20%20%20%20%20%20%20%3D%204%3B%0A%20%20%20%20cfg.srcTransferSize%20%20%20%3D%20kEDMA_TransferSize4Bytes%3B%0A%20%20%20%20cfg.destTransferSize%20%20%3D%20kEDMA_TransferSize4Bytes%3B%0A%20%20%20%20cfg.minorLoopBytes%20%20%20%20%3D%204%3B%0A%20%20%20%20cfg.majorLoopCounts%20%20%20%3D%20nwords%3B%0A%0A%20%20%20%20EDMA_ResetChannel(rxDmaHandle-%26gt%3Bbase%2C%20rxDmaHandle-%26gt%3Bchannel)%3B%0A%20%20%20%20EDMA_SetTransferConfig(rxDmaHandle-%26gt%3Bbase%2C%20rxDmaHandle-%26gt%3Bchannel%2C%20%26amp%3Bcfg%2C%20NULL)%3B%0A%0A%20%20%20%20EDMA_StartTransfer(rxDmaHandle)%3B%0A%20%20%20%20LPSPI_EnableDMA(base%2C%20kLPSPI_RxDmaEnable)%3B%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CBR%20%2F%3E%0A%3CP%3EBR%3C%2FP%3E%0A%3CP%3EHarry%3C%2FP%3E%0A%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E