DSPRelated.com
Forums

How to stop EDMA transferring?

Started by hbd7...@yahoo.com.cn May 19, 2008
Hi all;

I am testing UART in EDMA interrupt mode.My problem is after linking edma transfer to a new table,I send data continously. But I want to send data when I ask it to, how can I do to control edma when I start or stop sending data .Athough I know that I can stop transferring by linking to a null table:EDMA_link(hEdma14, hEdmadummy);but when I want to start again what should I do?

here is my edma configuration:

EDMA_Config edmaXmitParam= {
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW, /* 1 */
EDMA_OPT_ESIZE_16BIT, /* 01 */
EDMA_OPT_2DS_NO, /* 0 */
EDMA_OPT_SUM_INC, /* 01 */
EDMA_OPT_2DD_NO, /* 0 */
EDMA_OPT_DUM_NONE, /* 00 */
EDMA_OPT_TCINT_YES, /* 1 */
EDMA_OPT_TCC_OF(14), /* 14 */
EDMA_OPT_LINK_YES, /* 1 */
EDMA_OPT_FS_NO /* 0 */
),
EDMA_SRC_OF(xmitbuf),
EDMA_CNT_OF(CMD_SIZE*11),
EDMA_DST_OF(0),
EDMA_IDX_OF(0),
EDMA_RLD_OF(0)};
///////////////////////////////////////////////////////////////////
EDMA_Config edmaRcvParam= {
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW, /* 1 */
EDMA_OPT_ESIZE_16BIT, /* 01 */
EDMA_OPT_2DS_NO, /* 0 */
EDMA_OPT_SUM_NONE, /* 00 */
EDMA_OPT_2DD_NO, /* 0 */
EDMA_OPT_DUM_INC, /* 01 */
EDMA_OPT_TCINT_YES, /* 1 */
EDMA_OPT_TCC_OF(15), /* 15 */
EDMA_OPT_LINK_YES, /* 0 */
EDMA_OPT_FS_NO /* 0 */
),
EDMA_SRC_OF(0),
EDMA_CNT_OF(BUFFER_SIZE*11),
EDMA_DST_OF(recvbuf),
EDMA_IDX_OF(0),
EDMA_RLD_OF(0)};
void edma_init1()
{
/* Open the EDMA channels - EDMA 14 for transmit, EDMA 15 for receive */
hEdma14 = EDMA_open(EDMA_CHA_XEVT1, EDMA_OPEN_RESET);
hEdma15 = EDMA_open(EDMA_CHA_REVT1, EDMA_OPEN_RESET);
/* allocate LINK parameter location */
hEdmaLINK = EDMA_allocTable( -1 );
hEdmaLINK2 = EDMA_allocTable( -1 );

edmaXmitParam.dst = MCBSP_getXmtAddr(hMcbsp1);
edmaRcvParam.src = MCBSP_getRcvAddr(hMcbsp1);

/* update EDMA_Config with LINK location */

edmaXmitParam.rld = EDMA_RLD_RMK(0,hEdmaLINK);
edmaRcvParam.rld = EDMA_RLD_RMK(0,hEdmaLINK2);

/* configure EDMA channel & link location */
EDMA_config(hEdma14, &edmaXmitParam);
EDMA_config(hEdma15, &edmaRcvParam);

EDMA_config(hEdmaLINK, &edmaXmitParam);
EDMA_config(hEdmaLINK2, &edmaRcvParam);

EDMA_intClear(14);
EDMA_intClear(15);

/* enable EDMA channel interrupt to CPU */
EDMA_intEnable(14);
EDMA_intEnable(15);
/* Enable EDMA channels */
EDMA_enableChannel(hEdma14);
EDMA_enableChannel(hEdma15);
}

Any help would be appreciated!
Hi,

just set EDMA_OPT_LINK_NO. To trigger a transmit use EDMA_setChannel().

HTH Gustl
h...@yahoo.com.cn schrieb:
> Hi all;
>
> I am testing UART in EDMA interrupt mode.My problem is after linking
> edma transfer to a new table,I send data continously. But I want to send
> data when I ask it to, how can I do to control edma when I start or stop
> sending data .Athough I know that I can stop transferring by linking to
> a null table:EDMA_link(hEdma14, hEdmadummy);but when I want to start
> again what should I do?
>
> here is my edma configuration:
>
> EDMA_Config edmaXmitParam= {
> EDMA_OPT_RMK(
> EDMA_OPT_PRI_LOW, /* 1 */
> EDMA_OPT_ESIZE_16BIT, /* 01 */
> EDMA_OPT_2DS_NO, /* 0 */
> EDMA_OPT_SUM_INC, /* 01 */
> EDMA_OPT_2DD_NO, /* 0 */
> EDMA_OPT_DUM_NONE, /* 00 */
> EDMA_OPT_TCINT_YES, /* 1 */
> EDMA_OPT_TCC_OF(14), /* 14 */
> EDMA_OPT_LINK_YES, /* 1 */
> EDMA_OPT_FS_NO /* 0 */
> ),
> EDMA_SRC_OF(xmitbuf),
> EDMA_CNT_OF(CMD_SIZE*11),
> EDMA_DST_OF(0),
> EDMA_IDX_OF(0),
> EDMA_RLD_OF(0)};
> ///////////////////////////////////////////////////////////////////
> EDMA_Config edmaRcvParam= {
> EDMA_OPT_RMK(
> EDMA_OPT_PRI_LOW, /* 1 */
> EDMA_OPT_ESIZE_16BIT, /* 01 */
> EDMA_OPT_2DS_NO, /* 0 */
> EDMA_OPT_SUM_NONE, /* 00 */
> EDMA_OPT_2DD_NO, /* 0 */
> EDMA_OPT_DUM_INC, /* 01 */
> EDMA_OPT_TCINT_YES, /* 1 */
> EDMA_OPT_TCC_OF(15), /* 15 */
> EDMA_OPT_LINK_YES, /* 0 */
> EDMA_OPT_FS_NO /* 0 */
> ),
> EDMA_SRC_OF(0),
> EDMA_CNT_OF(BUFFER_SIZE*11),
> EDMA_DST_OF(recvbuf),
> EDMA_IDX_OF(0),
> EDMA_RLD_OF(0)};
> void edma_init1()
> {
> /* Open the EDMA channels - EDMA 14 for transmit, EDMA 15 for receive */
> hEdma14 = EDMA_open(EDMA_CHA_XEVT1, EDMA_OPEN_RESET);
> hEdma15 = EDMA_open(EDMA_CHA_REVT1, EDMA_OPEN_RESET);
> /* allocate LINK parameter location */
> hEdmaLINK = EDMA_allocTable( -1 );
> hEdmaLINK2 = EDMA_allocTable( -1 );
>
> edmaXmitParam.dst = MCBSP_getXmtAddr(hMcbsp1);
> edmaRcvParam.src = MCBSP_getRcvAddr(hMcbsp1);
>
> /* update EDMA_Config with LINK location */
>
> edmaXmitParam.rld = EDMA_RLD_RMK(0,hEdmaLINK);
> edmaRcvParam.rld = EDMA_RLD_RMK(0,hEdmaLINK2);
>
> /* configure EDMA channel & link location */
> EDMA_config(hEdma14, &edmaXmitParam);
> EDMA_config(hEdma15, &edmaRcvParam);
>
> EDMA_config(hEdmaLINK, &edmaXmitParam);
> EDMA_config(hEdmaLINK2, &edmaRcvParam);
> EDMA_intClear(14);
> EDMA_intClear(15);
>
> /* enable EDMA channel interrupt to CPU */
> EDMA_intEnable(14);
> EDMA_intEnable(15);
> /* Enable EDMA channels */
> EDMA_enableChannel(hEdma14);
> EDMA_enableChannel(hEdma15);
> }
>
> Any help would be appreciated!
>