Hi MayLiu,
I set it as follows and confirmed that data is transmitted with LPUART12_Send_eDMA().
However, LPUART_UserCallback() is not called after transmission is completed.
When I check DMA1->INT, LPUART12_TX_DMA_CHANNEL bit is set to 1 and not cleared.
Q) Why is LPUART_UserCallback() not called?
MIMXRT1176_cm7.h
/* DMAMUX - Peripheral instance base addresses */
/** Peripheral DMAMUX0 base address */
#define DMAMUX0_BASE (0x40074000u)
#define DMAMUX1_BASE (0x40C18000u)
/** Peripheral DMAMUX0 base pointer */
#define DMAMUX0 ((DMAMUX_Type *)DMAMUX0_BASE)
#define DMAMUX1 ((DMAMUX_Type *)DMAMUX1_BASE)
/** Array initializer of DMAMUX peripheral base addresses */
#define DMAMUX_BASE_ADDRS { DMAMUX0_BASE, DMAMUX1_BASE }
/** Array initializer of DMAMUX peripheral base pointers */
#define DMAMUX_BASE_PTRS { DMAMUX0, DMAMUX1 }
/* DMA - Peripheral instance base addresses */
/** Peripheral DMA0 base address */
#define DMA0_BASE (0x40070000u)
#define DMA1_BASE (0x40C14000u)
/** Peripheral DMA0 base pointer */
#define DMA0 ((DMA_Type *)DMA0_BASE)
#define DMA1 ((DMA_Type *)DMA1_BASE)
/** Array initializer of DMA peripheral base addresses */
#define DMA_BASE_ADDRS { DMA0_BASE, DMA1_BASE }
/** Array initializer of DMA peripheral base pointers */
#define DMA_BASE_PTRS { DMA0, DMA1 }
/** Interrupt vectors for the DMA peripheral type */
#define DMA_CHN_IRQS { { DMA0_DMA16_IRQn, DMA1_DMA17_IRQn, DMA2_DMA18_IRQn, DMA3_DMA19_IRQn, DMA4_DMA20_IRQn, DMA5_DMA21_IRQn, DMA6_DMA22_IRQn, DMA7_DMA23_IRQn, DMA8_DMA24_IRQn, DMA9_DMA25_IRQn, DMA10_DMA26_IRQn, DMA11_DMA27_IRQn, DMA12_DMA28_IRQn, DMA13_DMA29_IRQn, DMA14_DMA30_IRQn, DMA15_DMA31_IRQn, DMA0_DMA16_IRQn, DMA1_DMA17_IRQn, DMA2_DMA18_IRQn, DMA3_DMA19_IRQn, DMA4_DMA20_IRQn, DMA5_DMA21_IRQn, DMA6_DMA22_IRQn, DMA7_DMA23_IRQn, DMA8_DMA24_IRQn, DMA9_DMA25_IRQn, DMA10_DMA26_IRQn, DMA11_DMA27_IRQn, DMA12_DMA28_IRQn, DMA13_DMA29_IRQn, DMA14_DMA30_IRQn, DMA15_DMA31_IRQn } }
#define DMA_ERROR_IRQS { DMA_ERROR_IRQn }
------------------------------------------------------------------
#define LPUART12_TX_DMA_CHANNEL 2U
#define LPUART12_TX_DMA_REQUEST kDmaRequestMuxLPUART12Tx
lpuart_edma_handle_t g_lpuartEdmaHandle12;
edma_handle_t g_lpuartTxEdmaHandle12;
volatile bool txOnGoing;
void BOARD_InitUartDma(void)
{
edma_config_t config;
DMAMUX_Init(DMAMUX1);
DMAMUX_SetSource(DMAMUX1, LPUART12_TX_DMA_CHANNEL, LPUART12_TX_DMA_REQUEST);
DMAMUX_EnableChannel(DMAMUX1, LPUART12_TX_DMA_CHANNEL);
EDMA_GetDefaultConfig(&config);
EDMA_Init(DMA1, &config);
EDMA_CreateHandle(&g_lpuartTxEdmaHandle12, DMA1, LPUART12_TX_DMA_CHANNEL);
LPUART_TransferCreateHandleEDMA(LPUART12, &g_lpuartEdmaHandle12, LPUART_UserCallback, NULL,
&g_lpuartTxEdmaHandle12, NULL);
txOnGoing = true;
}
void LPUART_UserCallback(LPUART_Type *base, lpuart_edma_handle_t *handle, status_t status, void *userData)
{
PRINTF("Callback\r\n");
if (((uint32_t)base & 0xFFFF0000) == DMA1_BASE)
{
if (kStatus_LPUART_TxIdle == status)
{
txOnGoing = false;
}
}
}
void LPUART12_Send_eDMA(uint8_t *buf, size_t size)
{
lpuart_transfer_t xfer;
xfer.data = buf;
xfer.dataSize = size;
LPUART_SendEDMA(LPUART12, &g_lpuartEdmaHandle12, &xfer);
}
Thank you,
Best Regards,
Gyosun.