你好,
参考手册 MCXA153 包含了对 TDBRn 和 RDBRn LPSPI 寄存器的描述:
“TDBRn 和 RDBRn 寄存器支持向发送 FIFO 发送数据进行突发传输,以便与 DMA 控制器一起使用”。
请问有人可以分享一下使用这些寄存器进行突发传输的示例代码吗?
此致
博格丹
抱歉,目前没有相关示例。
我找到的最接近的 MCXA153 示例使用 LPSPI_MasterTransferEDMALite() 和 eDMA,但驱动程序通过 LPSPI_GetTxRegisterAddress() / LPSPI_GetRxRegisterAddress() 来定位 TDR/RDR,而不是突发别名窗口。
但我认为你可以尝试使用。
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
哈里