This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM437x UART with EDMA issue

Other Parts Discussed in Thread: AM4378

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);