[CX3]How to setup uart dma rx mode

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
bbfe_4086196
Level 2
Level 2
5 sign-ins Welcome!

Hi,

My problem is after configure uart dma rx transfer mode, i got every byte is zero in call back. my code is as below:

CyU3PReturnStatus_t

CyFxUartApplnInit (void)

{

CyU3PDmaChannelConfig_t dmaConfig;

CyU3PUartConfig_t uartConfig;

CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;

rst_cpld();

    apiRetStatus = CyU3PUartInit ();

    if (apiRetStatus != CY_U3P_SUCCESS)

    {

        CyFxAppErrorHandler(apiRetStatus);

    }

    CyU3PMemSet ((uint8_t *)&uartConfig, 0, sizeof(uartConfig));

    uartConfig.baudRate = CY_U3P_UART_BAUDRATE_2M;

    uartConfig.stopBit = CY_U3P_UART_ONE_STOP_BIT;

    uartConfig.parity = CY_U3P_UART_NO_PARITY;

    uartConfig.flowCtrl = CyFalse;

    uartConfig.txEnable = CyTrue;

    uartConfig.rxEnable = CyTrue;

    uartConfig.isDma = CyTrue; /* DMA mode */

    apiRetStatus = CyU3PUartSetConfig (&uartConfig, NULL);

    if (apiRetStatus != CY_U3P_SUCCESS )

    {

        CyFxAppErrorHandler(apiRetStatus);

    }

CyU3PMemSet ((uint8_t *)&dmaConfig, 0, sizeof(dmaConfig));

dmaConfig.size = 192;

dmaConfig.count = 4;

dmaConfig.prodSckId = CY_U3P_LPP_SOCKET_UART_PROD;

dmaConfig.consSckId = CY_U3P_CPU_SOCKET_CONS;

dmaConfig.dmaMode = CY_U3P_DMA_MODE_BYTE;

dmaConfig.notification = CY_U3P_DMA_CB_PROD_EVENT;

dmaConfig.cb = CyFxUacMicDmaCallback;

dmaConfig.prodHeader = 0;

dmaConfig.prodFooter = 0;

dmaConfig.consHeader = 0;

dmaConfig.prodAvailCount = 0;

apiRetStatus = CyU3PDmaChannelCreate (&glUartRXChHandle,

CY_U3P_DMA_TYPE_MANUAL_IN, &dmaConfig);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyFxAppErrorHandler(apiRetStatus);

return apiRetStatus;

}

apiRetStatus = CyU3PUartTxSetBlockXfer(0xFFFFFFFF);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyFxAppErrorHandler(apiRetStatus);

}

apiRetStatus = CyU3PUartRxSetBlockXfer(0xFFFFFFFF);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyFxAppErrorHandler(apiRetStatus);

}

apiRetStatus = CyU3PDmaChannelSetXfer (&glUartRXChHandle, 0);

    if (apiRetStatus != CY_U3P_SUCCESS)

    {

        return apiRetStatus;

    }

#if 0

/* Initialize the debug module. */

apiRetStatus = CyU3PDebugInit (CY_U3P_LPP_SOCKET_UART_CONS, 8);

if (apiRetStatus != CY_U3P_SUCCESS)

{

CyFxAppErrorHandler(apiRetStatus);

}

CyU3PDebugPreamble (CyFalse);

#endif

return apiRetStatus;

}

Callback code:

static void

CyFxUacMicDmaCallback(

CyU3PDmaChannel   *chHandle, /* Handle to the DMA channel. */

CyU3PDmaCbType_t   type,     /* Callback type.             */

CyU3PDmaCBInput_t *input)    /* Callback status.           */

{

if (type == CY_U3P_DMA_CB_PROD_EVENT && recording == CyTrue) {

nprintf("%d-> %x %x %x %x\r\n",

input->buffer_p.count,

input->buffer_p.buffer[52],

input->buffer_p.buffer[43],

input->buffer_p.buffer[74],

input->buffer_p.buffer[95]);

CyU3PEventSet(&glMicEvent, MIC_EVENT, CYU3P_EVENT_OR);

}

}

from the log (send back to pc via vcom port), data always be zero, length is correct

192-> 0 0 0 0

but from logic analyzer the data is not zero.

aa.png

Is there anything wrong in configuration ? thanks.

0 Likes
1 Reply