uart1_tx使用edma来发送数据,可以进中断,也可以清除IPR,但是同样的中断处理函数,只是UART1_RX的paRAM与串口发送的不一致,但是都是按照手册上PING-PONG的配置写的,在中断处理函数中就没有办法清除,自己的中断处理函数也挂接了,而且通过仿真器查看,收到的数据是错的,比如用hex方式发送20个a,收到的是20个07,用32位的hex显示的,下面是配置代码和中断处理函数代码,由于没有办法拷贝出代码,只能一句一句打上来:
EDMA3CCPaRAMEntry paramSet;
paramSet.srcAddr = (uint32)SOC_UART_1_REG;
paramSet.destAddr = (uint32)g_secret_addr_0;
paramSet,aCnt = 1;
paramSet,bCnt = 10;
paramSet,cCnt = 1;
paramSet,srcBIdx = 0;
paramSet,destBIdx = 1;
paramSet,srcCIdx = 0;
paramSet,destCIdx = 0;
/* RX_PAR_ID = 64 */
paramSet.linkAddr = (uint16)((RX_PAR_ID)*32);
paramSet.bCntReload = 10;
paramSet.opt |= ((EDMA3_CHA_UART1_RX << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC);
paramSet.opt |= (1 << EDMA3CC_OPT_TCINTEN_SHIFT);
EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, EDMA3_CHA_UART1_RX, ¶mSet);
/* 配置PONG */
paramSet.destAddr = (uint32)g_secret_addr_1;
paramSet.linkAddr = (uint16)((RX_PAR_ID+1)*32);
EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, RX_PAR_ID, ¶mSet);
/* 配置PING */
paramSet.destAddr = (uint32)g_secret_addr_0;
paramSet.linkAddr = (uint16)((RX_PAR_ID)*32);
EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, (RX_PAR_ID+1), ¶mSet);
/* 中断处理函数 */
static void edma3ComplHandler(uint32 baseAdd, uint32 regionNum)
{
volatitle uint32 pendingIrqs;
volatitle uint32 isIPR = 0;
uint32 index1;
uint32 Cnt = 0;
index1 = 1;
#ifdef _TMS320C6X
IntEventClear(SYS_INT_EDMA3_0_CC0_INT1);
#else
IntSystemStatusClear(SYS_INT_CCINT0);
#endif
isIPR = HWREG(baseAdd + EDMA3CC_S_IPR(regionNum));
if(isIPR)
{
while((Cnt < EDMA3CC_COMPL_HANDLER_RETRY_COUNT) &&(index1 != 0))
{
index1 = 0;
pendingIrqs = HWREG(baseAdd + EDMA3CC_S_IPR(regionNum));
while(pendingIrqs)
{
if((pendingIrqs & 1) == TURE)
{
HWREG(baseAdd + EDMA3CC_S_ICR(regionNum)) = (1 << index1);
cb_Fxn[index1](index1, EDMA_XFER_COMPLETE);
}
++index1;
pendingIrqs >>= 1;
}
Cnt++;
}
}
}