MCXA153: LPSPI data burst transfer.

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

MCXA153: LPSPI data burst transfer.

445 次查看
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 项奖励
回复
1 回复

302 次查看
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 项奖励
回复
%3CLINGO-SUB%20id%3D%22lingo-sub-2387348%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EMCXA153%EF%BC%9ALPSPI%20%E6%95%B0%E6%8D%AE%E7%AA%81%E5%8F%91%E4%BC%A0%E8%BE%93%E3%80%82%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2387348%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E4%BD%A0%E5%A5%BD%EF%BC%8C%3C%2FP%3E%3CP%3E%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C%20MCXA153%20%E5%8C%85%E5%90%AB%E4%BA%86%E5%AF%B9%20TDBRn%20%E5%92%8C%20RDBRn%20LPSPI%20%E5%AF%84%E5%AD%98%E5%99%A8%E7%9A%84%E6%8F%8F%E8%BF%B0%EF%BC%9A%3CBR%20%2F%3E%20%E2%80%9CTDBRn%20%E5%92%8C%20RDBRn%20%E5%AF%84%E5%AD%98%E5%99%A8%E6%94%AF%E6%8C%81%E5%90%91%E5%8F%91%E9%80%81%20FIFO%20%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE%E8%BF%9B%E8%A1%8C%E7%AA%81%E5%8F%91%E4%BC%A0%E8%BE%93%EF%BC%8C%E4%BB%A5%E4%BE%BF%E4%B8%8E%20DMA%20%E6%8E%A7%E5%88%B6%E5%99%A8%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%E2%80%9D%E3%80%82%3CBR%20%2F%3E%E8%AF%B7%E9%97%AE%E6%9C%89%E4%BA%BA%E5%8F%AF%E4%BB%A5%E5%88%86%E4%BA%AB%E4%B8%80%E4%B8%8B%E4%BD%BF%E7%94%A8%E8%BF%99%E4%BA%9B%E5%AF%84%E5%AD%98%E5%99%A8%E8%BF%9B%E8%A1%8C%E7%AA%81%E5%8F%91%E4%BC%A0%E8%BE%93%E7%9A%84%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81%E5%90%97%EF%BC%9F%3C%2FP%3E%3CP%3E%E6%AD%A4%E8%87%B4%3CBR%20%2F%3E%E5%8D%9A%E6%A0%BC%E4%B8%B9%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%3E%E9%80%9A%E4%BF%A1%E4%B8%8E%E6%8E%A7%E5%88%B6%EF%BC%88I3C%20%7C%20I2C%20%7C%20SPI%20%7C%20FlexCAN%20%7C%20%E4%BB%A5%E5%A4%AA%E7%BD%91%20%7C%20FlexIO%EF%BC%89%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%3E%E5%97%A8%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%3C%2FP%3E%0A%3CP%3E%E6%8A%B1%E6%AD%89%EF%BC%8C%E7%9B%AE%E5%89%8D%E6%B2%A1%E6%9C%89%E7%9B%B8%E5%85%B3%E7%A4%BA%E4%BE%8B%E3%80%82%3C%2FP%3E%0A%3CP%3E%E6%88%91%E6%89%BE%E5%88%B0%E7%9A%84%E6%9C%80%E6%8E%A5%E8%BF%91%E7%9A%84%20MCXA153%20%E7%A4%BA%E4%BE%8B%E4%BD%BF%E7%94%A8%20LPSPI_MasterTransferEDMALite()%20%E5%92%8C%20eDMA%EF%BC%8C%E4%BD%86%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E9%80%9A%E8%BF%87%20LPSPI_GetTxRegisterAddress()%20%2F%20LPSPI_GetRxRegisterAddress()%20%E6%9D%A5%E5%AE%9A%E4%BD%8D%20TDR%2FRDR%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E7%AA%81%E5%8F%91%E5%88%AB%E5%90%8D%E7%AA%97%E5%8F%A3%E3%80%82%3C%2FP%3E%0A%3CP%3E%E4%BD%86%E6%88%91%E8%AE%A4%E4%B8%BA%E4%BD%A0%E5%8F%AF%E4%BB%A5%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8%E3%80%82%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%20translate%3D%22no%22%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%20translate%3D%22no%22%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%3E%E5%93%88%E9%87%8C%3C%2FP%3E%0A%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E