EDMA3无法进入completion code function void intcinit() { /* Opening a intc handle for edma event */ vectId = CSL_INTC_VECTID_4; //打开中断向量句柄,建立事件与中断之间的映射关系 hIntcEdma = CSL_intcOpen (&intcObjEdma, CSL_INTC0_CPU_3_2_EDMA3CCINT1, \ &vectId , NULL); /* Association of an EDMA event handler with the INTC routine */ EventRecord.handler = &eventEdmaHandler; EventRecord.arg = (void*)(hModule); CSL_intcPlugEventHandler(hIntcEdma,&EventRecord); //建立事件和句柄的映射关系 /* Enabling event edma 使能EDMA收图完成中断 */ CSL_intcHwControl(hIntcEdma,CSL_INTC_CMD_EVTENABLE,NULL); /* Hook up the EDMA event with an completion code function handler */ EdmaEventHook(CSL_EDMA3_CHA_GPINT0, ImgEDMARecCompleted_INT);//收图完成中断 EdmaEventHook(CSL_EDMA3_CHA_GPINT1, UartEDMARecGyroCompleted_INT); EdmaEventHook(CSL_EDMA3_CHA_UTXEVT, UartEDMASendUppcCompleted_INT);//DSP给上位机数据完成中断 EdmaEventHook(CSL_EDMA3_CHA_URXEVT, UartEDMARecUppcData_INT);//DSP接收上位机数据中断 EdmaEventHook(CSL_EDMA3_CHA_GPINT3, DDR3EdmaReadCompleted_INT);//DDR3读取数据中断 /***************** interrupt configration for EDMA completed ***************/ ....... } void EDMA3init() { /* Edma Module Initialization */ CSL_edma3Init(&edmaContext); //初始化edma上下文对象变量,返回状态CSL_SOK /* Edma Module Level Open, 得到EDMA寄存器组的首地址,赋给edmaObj->regs,最后返回的指针hModule实际上指向edmaObj*/ hModule = CSL_edma3Open(&edmaObj,CSL_EDMA3,NULL,&status); /* Query Module Info ,得到EDMA控制器的状态,实际上就是把PID和CCCFG寄存器的值读出到info*/ CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INFO, &info); ........ regionAccess.region = CSL_EDMA3_REGION_1 ; regionAccess.drae = 0xFFFFFFFF ; regionAccess.draeh = 0xFFFFFFFF ; /*使能region区域的寄存器访问,实际上就是把regionAccess的drae和draeh写入*/ CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_DMAREGION_ENABLE,®ionAccess); ......... /********************************Setup for DDR3 Data reading***************************************************/ //DSP接收上位机数据 /* Channel open */ chParam.regionNum = CSL_EDMA3_REGION_1; chParam.chaNum = CSL_EDMA3_CHA_GPINT3; //52号通道 /*打开EDMA的通道,实际上就是把chParam的regionNum和chaNum赋给ChObjImgRec的region和chaNum, 并且把EDMA寄存器组的首地址,赋给ChObjImgRec->regs,最后返回的指针hChannel_img_rec指向ChObjImgRec*/ hChannel_DDR3_read= CSL_edma3ChannelOpen(&chobjDDR3Read, CSL_EDMA3, &chParam, &status); /* 返回相应通道的参数寄存器的地址到hParamBasicImgRec*/ hParamBasicDDR3Read= CSL_edma3GetParamHandle(hChannel_DDR3_read,CSL_EDMA3_CHA_GPINT3,&status); /* Edma parameter entry Setup */ myParamSetupUartSend.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \ CSL_EDMA3_TCCH_DIS, \ CSL_EDMA3_ITCINT_DIS, \ CSL_EDMA3_TCINT_EN,\ CSL_EDMA3_CHA_GPINT3,\ CSL_EDMA3_TCC_NORMAL,\ CSL_EDMA3_FIFOWIDTH_NONE, \ CSL_EDMA3_STATIC_DIS, \ CSL_EDMA3_SYNC_A, \ CSL_EDMA3_ADDRMODE_INCR, \ CSL_EDMA3_ADDRMODE_INCR); myParamSetupUartSend.srcAddr = (Uint32)DDR3_DATA1; //PC机发给DSP的数据源地址 myParamSetupUartSend.aCntbCnt = CSL_EDMA3_CNT_MAKE(144,1); //增量地址模式传输36*4字节 myParamSetupUartSend.dstAddr = (Uint32)L2_memory; // PC机发给DSP的数据目的地址 myParamSetupUartSend.srcDstBidx = CSL_EDMA3_BIDX_MAKE(0,0); myParamSetupUartSend.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE (CSL_EDMA3_LINK_NULL, 1); myParamSetupUartSend.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,0); myParamSetupUartSend.cCnt = 1; /*通道建立,实际上是将传输使用的通道号(总共64个)和使用的参数号(总共256组)建立映射关系 (通过设置DCHMAP寄存器)*/ CSL_edma3HwChannelSetupParam (hChannel_DDR3_read, CSL_EDMA3_CHA_GPINT3); /*选择事件的优先级队列*/ CSL_edma3HwChannelSetupQue(hChannel_DDR3_read, CSL_EDMA3_QUE_1); /*参数组写入寄存器*/ CSL_edma3ParamSetup(hParamBasicDDR3Read,&myParamSetupDDR3Read); /********************************Setup for DDR3 Data reading***************************************************/ ......... /* Enable interrupts ,使能相应通道的传输完成中断,本例中有4个通道,都需要使能, 若增加了传输通道,这里相应的位也要追加置1*/ regionIntr.region = CSL_EDMA3_REGION_1 ; //设置ESR寄存器,将4、5、6、7、9号通道位置1 regionIntr.intr = (1<