Hi,everyone,
I meet a question when I use UART with EDMA in AM4378,using Startware.
I want use UART to transmit 8 Byte with EDMA ,1byte transmitted every event.I want to transmit "abcdefgh",but i just got 1 0x00.Some code is following.
/////////////////////////////////////////////////////////////////////////////////////////////////
uart initialization:
gUart1AppObj = UARTAPPOBJ_DEFAULT;
gUart1AppObj.instNum = 1;
gUart1AppObj.instAddr = CHIPDBBaseAddress(CHIPDB_MOD_ID_UART, gUart1AppObj.instNum);
gUart1AppObj.uartAppCfg.enableIntr = TRUE;
gUart1AppObj.uartAppCfg.uartAppIntrCfg.intrLine = 105U;
gUart1AppObj.uartAppCfg.uartAppIntrCfg.intrPriority = 0x20U;
gUart1AppObj.uartAppCfg.uartAppIntrCfg.pFnIntrHandler = &Uart1AppIsr;
gUart1AppObj.uartAppCfg.enableDma = TRUE;
gUart1AppObj.uartAppCfg.dmaCfg.dmaType = DMA_TYPE_ENHACED;
gUart1AppObj.uartAppCfg.dmaCfg.rxEvtInfo.dmaType = DMA_TYPE_ENHACED;
gUart1AppObj.uartAppCfg.dmaCfg.rxEvtInfo.instNum = 0U;
gUart1AppObj.uartAppCfg.dmaCfg.rxEvtInfo.evtToChMapType = DMA_UTILS_EVENT_MAP_TYPE_DIRECT;
gUart1AppObj.uartAppCfg.dmaCfg.rxEvtInfo.evtNum = 29U;
gUart1AppObj.uartAppCfg.dmaCfg.rxEvtInfo.chNum = 29U;
gUart1AppObj.uartAppCfg.dmaCfg.rxEvtInfo.xferIdx = 29U;
gUart1AppObj.uartAppCfg.dmaCfg.txEvtInfo.dmaType = DMA_TYPE_ENHACED;
gUart1AppObj.uartAppCfg.dmaCfg.txEvtInfo.instNum = 0U;
gUart1AppObj.uartAppCfg.dmaCfg.txEvtInfo.evtToChMapType = DMA_UTILS_EVENT_MAP_TYPE_DIRECT;
gUart1AppObj.uartAppCfg.dmaCfg.txEvtInfo.evtNum = 28U;
gUart1AppObj.uartAppCfg.dmaCfg.txEvtInfo.chNum = 28U;
gUart1AppObj.uartAppCfg.dmaCfg.txEvtInfo.xferIdx = 28U;
gUart1AppObj.uartAppCfg.dmaCfg.pFxnCallBack = &Uart1AppDmaCallBack;
UARTInit(&gUart1AppObj);
UARTIntrEnable(gUart1AppObj.instAddr, UART_INTR_RX_THRESHOLD);
/////////////////////////////////////////////////////////////////////////
static int32_t UARTInit(uartAppObj_t *pObj)
{
int32_t status = S_PASS;
/* Clock Configuration */
status = PRCMModuleEnable(CHIPDB_MOD_ID_UART, pObj->instNum, FALSE);
/* PinMux Configuration */
status = PINMUXModuleConfig(CHIPDB_MOD_ID_UART, pObj->instNum, NULL);
/* Resetting the UART module. */
UARTModuleReset(pObj->instAddr);
UartAppSetBaudRate(pObj, pObj->uartAppCfg.baudRate);
UartAppLineCharacteristicConfig(pObj,
pObj->uartAppCfg.charLen,
pObj->uartAppCfg.stopBits,
pObj->uartAppCfg.parity);
/* Disabling Break Control. */
UARTBreakCtrlEnable(pObj->instAddr, FALSE);
if(TRUE == pObj->uartAppCfg.enableIntr)
{
/* Configure the RX and TX FIFOs */
UartAppFifoConfig(pObj);
/* Configure the interrupts for UART. */
status = UartAppIntrConfig(pObj);
}
UARTDmaEnable(pObj->instAddr, UART_DMA_MODE_MODE1);
return status;
}
//////////////////////////////////////////////////////////////////////////////////////
static void UartAppFifoConfig(uartAppObj_t *pObj)
{
uartFifoCfg_t uartFifoCfg;
uartFifoCfg.uartTxGran = UART_TRIGGER_LVL_GRAN_1;//UART_TRIGGER_LVL_GRAN_4
uartFifoCfg.uartRxGran = UART_TRIGGER_LVL_GRAN_1;
/* Set the trigger levels for TX and RX. */
uartFifoCfg.uartTxTriggerLvl = 8U;//
uartFifoCfg.uartRxTriggerLvl = 1U;
uartFifoCfg.clearTxFifo = TRUE;
uartFifoCfg.clearRxFifo = TRUE;
uartFifoCfg.enableDma = TRUE;
UARTFifoConfig(pObj->instAddr, &uartFifoCfg);
}
////////////////////////////////////////////////////////////////////////////
Then EDMA configuration:
xferObj.pSrc->addr = (uint32_t)pBuf;
xferObj.pSrc->addrMode = DMA_XFER_DATA_ADDR_MODE_INC;
xferObj.pSrc->fifoWidth = 0U;
xferObj.pSrc->packetActSize = 1U;
xferObj.pSrc->frameActSize = noOfBytes;
xferObj.pSrc->blockSize = 1U;
xferObj.pSrc->packetInactSize = 0U;
xferObj.pSrc->frameInactSize = 0U;
xferObj.pSrc->syncMode = DMA_UTILS_DATA_SYNC_BLOCK;
xferObj.pDst->addr = (uint32_t)(pObj->instAddr + 0U);
xferObj.pDst->addrMode = DMA_XFER_DATA_ADDR_MODE_CONST;
xferObj.pDst->fifoWidth = 0U;
xferObj.pDst->packetActSize = 1U;
xferObj.pDst->frameActSize = 1U;
xferObj.pDst->blockSize = 1U;
xferObj.pDst->packetInactSize = 0U;
xferObj.pDst->frameInactSize = 0U;
xferObj.pDst->syncMode = DMA_UTILS_DATA_SYNC_BLOCK;
xferObj.intrConfig = DMA_UTILS_DATA_SYNC_MASK_BLOCK;
xferObj.linkEnable = FALSE;
xferObj.nxtXferIdx = 0U;
DMAUtilsDataXferConfig(pUartDmaCfg->dmaType,
pUartDmaCfg->txEvtInfo.instNum,
pUartDmaCfg->txEvtInfo.xferIdx,
&xferObj);
chObj.xferIdx = pUartDmaCfg->txEvtInfo.xferIdx;
chObj.queueNum = 1U;
chObj.intrEnable = TRUE;
chObj.callBack = pUartDmaCfg->pFxnCallBack;
chObj.triggerType = DMA_XFER_TRIGGER_TYPE_EVENT;
DMAUtilsChConfig(pUartDmaCfg->dmaType,
pUartDmaCfg->txEvtInfo.instNum,
pUartDmaCfg->txEvtInfo.chNum,
&chObj);
////////////////////////////////////////////////////////////////////////////
At last,begin transmit
DMAUtilsXferStart(pUartDmaCfg->dmaType, pUartDmaCfg->txEvtInfo.instNum,
pUartDmaCfg->txEvtInfo.chNum,
DMA_XFER_TRIGGER_TYPE_EVENT);