TI中文支持网
TI专业的中文技术问题搜集分享网站

用EDMA的方式从mcbsp发送数据,c_int08中断只能进去一次或2次,然后就无法发送数据了,求教是怎么回事??

自己在用mcbsp做通讯,用的芯片是C6414,但是程序运行时中断总进不去。。。。。。mcbsp没法传输数据,不知道程序哪部分有问题,如何才能正常的进入中断呢???还请好心人帮忙看看~~~~

部分代码如下,附件全部工程文件

void main()
{

Uint16 *xmitbufptr;

CSL_init();

IRQ_globalDisable();

IRQ_setVecs(vectors);

IRQ_reset(IRQ_EVT_EDMAINT);

EDMA_clearPram(0x00000000);

hEdma14 = EDMA_open(EDMA_CHA_XEVT1, EDMA_OPEN_RESET);
hEdma15 = EDMA_open(EDMA_CHA_REVT1, EDMA_OPEN_RESET);
hEdmaTxTable = EDMA_allocTable(-1);

hMcbsp1 = MCBSP_open(MCBSP_DEV1, MCBSP_OPEN_RESET);

ConfigEDMA();

IRQ_enable(IRQ_EVT_EDMAINT);

EDMA_intEnable(14);
EDMA_intEnable(15);

EDMA_link(hEdma14, hEdmaTxTable);
EDMA_link(hEdma15, hEdmaRxTable);

EDMA_enableChannel(hEdma14);
EDMA_enableChannel(hEdma15);

ConfigMcBSP();
for (waittime=0; waittime<0xF; waittime++);

MCBSP_enableSrgr(hMcbsp1);

for (waittime=0; waittime<0xF; waittime++);

MCBSP_enableRcv(hMcbsp1);
MCBSP_enableXmt(hMcbsp1);

MCBSP_enableFsync(hMcbsp1);

ConfigEmifa();//配置emifa

IRQ_nmiEnable();
IRQ_globalEnable();

*DSP_READY = 1;//dsp运行

for(;;)
{

xmitbufptr = (Uint16 *)xmitbuf;
for(i = 0; i < 16; i++)
{
*xmitbufptr++ = 0xbbbb;
}

}

}

interrupt void c_int08(void)
{
if (EDMA_intTest(14))
{
EDMA_intClear(14);
printf("Transmit Completed\n");
}
if (EDMA_intTest(15))
{
EDMA_intClear(15);
printf("Receive Completed\n\n");
}
}

void ConfigMcBSP()
{
MCBSP_Config mcbspCfg1 = {
/* SPCR Setup */
MCBSP_SPCR_RMK(
MCBSP_SPCR_FREE_DEFAULT, /* 0 */
MCBSP_SPCR_SOFT_DEFAULT, /* 0 */
MCBSP_SPCR_FRST_DEFAULT, /* 0 */
MCBSP_SPCR_GRST_DEFAULT, /* 0 */
MCBSP_SPCR_XINTM_XRDY, /* 00 */
MCBSP_SPCR_XSYNCERR_DEFAULT, /* 0 */
MCBSP_SPCR_XRST_DEFAULT, /* 0 */
MCBSP_SPCR_DLB_OFF, /* 0 */
MCBSP_SPCR_RJUST_RZF, /* 00 */
MCBSP_SPCR_CLKSTP_DEFAULT, /* 0 */
MCBSP_SPCR_DXENA_OFF, /* 0 */
MCBSP_SPCR_RINTM_RRDY, /* 00 */
MCBSP_SPCR_RSYNCERR_DEFAULT, /* 0 */
MCBSP_SPCR_RRST_DEFAULT /* 0 */
),

/* RCR Setup */
MCBSP_RCR_RMK(
MCBSP_RCR_RPHASE_SINGLE, /* 0 */
MCBSP_RCR_RFRLEN2_DEFAULT, /* 0000 */
MCBSP_RCR_RWDLEN2_DEFAULT, /* 000 */
MCBSP_RCR_RCOMPAND_MSB, /* 00 */
MCBSP_RCR_RFIG_YES, /* 1 */
MCBSP_RCR_RDATDLY_1BIT, /* 01 */
MCBSP_RCR_RFRLEN1_OF(0), /* 01000 */
MCBSP_RCR_RWDLEN1_16BIT, /* 010 */
MCBSP_RCR_RWDREVRS_DISABLE /* 0 */
),

/* XCR Setup */
MCBSP_XCR_RMK(
MCBSP_XCR_XPHASE_SINGLE, /* 0 */
MCBSP_XCR_XFRLEN2_OF(0), /* 00010 */
MCBSP_XCR_XWDLEN2_DEFAULT, /* 000 */
MCBSP_XCR_XCOMPAND_MSB, /* 00 */
MCBSP_XCR_XFIG_YES, /* 1 */
MCBSP_XCR_XDATDLY_1BIT, /* 1 */
MCBSP_XCR_XFRLEN1_OF(0), /* 01000 */
MCBSP_XCR_XWDLEN1_16BIT, /* 010 */
MCBSP_XCR_XWDREVRS_DISABLE /* 0 */
),

/* SRGR Setup */
MCBSP_SRGR_RMK(
MCBSP_SRGR_GSYNC_DEFAULT, /* 0 */
MCBSP_SRGR_CLKSP_RISING, /* 0 */
MCBSP_SRGR_CLKSM_INTERNAL, /* 1 */
MCBSP_SRGR_FSGM_DXR2XSR, /* 0 */
MCBSP_SRGR_FPER_DEFAULT, /* 0 */
MCBSP_SRGR_FWID_DEFAULT, /* 0 */
MCBSP_SRGR_CLKGDV_OF(7) /* CLKGDV */
),

/* MCR Setup */
MCBSP_MCR_DEFAULT, /* default values */

/* RCER Setup */
MCBSP_RCERE0_DEFAULT, /* default values */
MCBSP_RCERE1_DEFAULT, /* default values */
MCBSP_RCERE2_DEFAULT, /* default values */
MCBSP_RCERE3_DEFAULT, /* default values */

/* XCER Setup */
MCBSP_XCERE0_DEFAULT, /* default values */
MCBSP_XCERE1_DEFAULT, /* default values */
MCBSP_XCERE2_DEFAULT, /* default values */
MCBSP_XCERE3_DEFAULT, /* default values */

/* PCR Setup */
MCBSP_PCR_RMK(
MCBSP_PCR_XIOEN_DEFAULT, /* 0 */
MCBSP_PCR_RIOEN_DEFAULT, /* 0 */
MCBSP_PCR_FSXM_INTERNAL, /* 1 */
MCBSP_PCR_FSRM_INTERNAL, /* 0 */
MCBSP_PCR_CLKXM_OUTPUT, /* 1 */
MCBSP_PCR_CLKRM_OUTPUT, /* 0 */
MCBSP_PCR_CLKSSTAT_DEFAULT, /* 0 */
MCBSP_PCR_DXSTAT_DEFAULT, /* 0 */
MCBSP_PCR_FSXP_ACTIVELOW, /* 1 */
MCBSP_PCR_FSRP_ACTIVELOW, /* 1 */
MCBSP_PCR_CLKXP_RISING, /* 0 */
MCBSP_PCR_CLKRP_FALLING /* 0 */
)
};
MCBSP_config(hMcbsp1, &mcbspCfg1);

}

void ConfigEDMA()
{
EDMA_configArgs(hEdma14,
/* OPT Setup */
EDMA_OPT_RMK(
EDMA_OPT_PRI_HIGH,
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_TCCM_DEFAULT, /* 0 */
EDMA_OPT_ATCINT_DEFAULT, /* 0 */
EDMA_OPT_ATCC_DEFAULT, /* 0 */
EDMA_OPT_PDTS_DEFAULT, /* 0 */
EDMA_OPT_PDTD_DEFAULT, /* 0 */
EDMA_OPT_LINK_YES, /* 1 */
EDMA_OPT_FS_NO /* 0 */
),
/* SRC Setup */
EDMA_SRC_RMK((Uint32)xmitbuf),/*xmitbuf address*/
/* CNT Setup */
EDMA_CNT_RMK(
EDMA_CNT_FRMCNT_DEFAULT,
EDMA_CNT_ELECNT_OF(8)
),
/* DST Setup */
EDMA_DST_RMK(MCBSP_getXmtAddr(hMcbsp1)),
/* IDX Setup */
EDMA_IDX_RMK(0,0),
/* RLD Setup */
EDMA_RLD_RMK(0,0)
);

EDMA_configArgs(hEdmaTxTable,
/* OPT Setup */
EDMA_OPT_RMK(
EDMA_OPT_PRI_HIGH,
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_TCCM_DEFAULT, /* 0 */
EDMA_OPT_ATCINT_DEFAULT, /* 0 */
EDMA_OPT_ATCC_DEFAULT, /* 0 */
EDMA_OPT_PDTS_DEFAULT, /* 0 */
EDMA_OPT_PDTD_DEFAULT, /* 0 */
EDMA_OPT_LINK_YES, /* 1 */
EDMA_OPT_FS_NO /* 0 */
),
/* SRC Setup */
EDMA_SRC_RMK((Uint32)xmitbuf),/*xmitbuf address*/
/* CNT Setup */
EDMA_CNT_RMK(
EDMA_CNT_FRMCNT_DEFAULT,
EDMA_CNT_ELECNT_OF(8)
),
/* DST Setup */
EDMA_DST_RMK(MCBSP_getXmtAddr(hMcbsp1)),
/* IDX Setup */
EDMA_IDX_RMK(0,0),
/* RLD Setup */
EDMA_RLD_RMK(0,0)
);

EDMA_configArgs(hEdma15,
/* OPT Setup */
EDMA_OPT_RMK(
EDMA_OPT_PRI_HIGH, /* 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_TCCM_DEFAULT, /* 0 */
EDMA_OPT_ATCINT_DEFAULT, /* 0 */
EDMA_OPT_ATCC_DEFAULT, /* 0 */
EDMA_OPT_PDTS_DEFAULT, /* 0 */
EDMA_OPT_PDTD_DEFAULT, /* 0 */
EDMA_OPT_LINK_YES, /* 0 */
EDMA_OPT_FS_NO /* 0 */
),
/* SRC Setup */
EDMA_SRC_RMK(MCBSP_getRcvAddr(hMcbsp1)),
/* CNT Setup */
EDMA_CNT_RMK(0, 16),
/* DST Setup */
EDMA_DST_RMK((Uint32) recvbuf), /*recvbuf address*/
/* IDX Setup */
EDMA_IDX_RMK(0,0),
/* RLD Setup */
EDMA_RLD_RMK(0,0)
);

EDMA_configArgs(hEdmaRxTable,
/* OPT Setup */
EDMA_OPT_RMK(
EDMA_OPT_PRI_HIGH, /* 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_TCCM_DEFAULT, /* 0 */
EDMA_OPT_ATCINT_DEFAULT, /* 0 */
EDMA_OPT_ATCC_DEFAULT, /* 0 */
EDMA_OPT_PDTS_DEFAULT, /* 0 */
EDMA_OPT_PDTD_DEFAULT, /* 0 */
EDMA_OPT_LINK_YES, /* 1 */
EDMA_OPT_FS_NO /* 0 */
),
/* SRC Setup */
EDMA_SRC_RMK(MCBSP_getRcvAddr(hMcbsp1)),
/* CNT Setup */
EDMA_CNT_RMK(0, 16),
/* DST Setup */
EDMA_DST_RMK((Uint32) recvbuf), /*recvbuf address*/
/* IDX Setup */
EDMA_IDX_RMK(0,0),
/* RLD Setup */
EDMA_RLD_RMK(0,0)
);
}

zhan shao:

你看一下是不是你第一次进中断之后,在退出中断处理函数之前没有把中断标志给清除掉。

赞(0)
未经允许不得转载:TI中文支持网 » 用EDMA的方式从mcbsp发送数据,c_int08中断只能进去一次或2次,然后就无法发送数据了,求教是怎么回事??
分享到: 更多 (0)