Hello, I develop on Omap L138, DSP-Part a McBsp with EDMA3. I am using CCS 4.2.3.00004.
The external device is the master and the Dsp is the slave.
The McBsp is running well, because receiving by polling is good.
So now I want to move the incomming data into internal buffer (buffer1 and buffer2 are switching) using EDMA3.
In memory watch and register watch I don't see changing anything what the programm is doing.
All registers are always 0.
Here is my program :
in_buffer1 = (int*) EDMA3_INBUFFER1;
in_buffer1_last = (int*) EDMA3_INBUFFER1_LAST;
in_buffer2 = (int*) EDMA3_INBUFFER2;
in_buffer2_last = (int*) EDMA3_INBUFFER2_LAST;
CSL_FINS(edma3cc0Regs->EESR, EDMA3CC_EVENT_ETYPE, 3); // enable event on 1st channel
CSL_FINS(edma3cc0Regs->ESR, EDMA3CC_EVENT_ETYPE, 3); // clear pending event on 1st channel
CSL_FINST(edma3cc0Regs->PARAMSET[0].OPT, EDMA3CC_OPT_ITCINTEN, ENABLE); // int enable
CSL_FINS(edma3cc0Regs->PARAMSET[0].OPT, EDMA3CC_OPT_TCC, 1);
CSL_FINS(edma3cc0Regs->PARAMSET[0].SRC, EDMA3CC_SRC_SRC, CSL_MCBSP_1_CTRL_REGS); // McBsp1 is source
CSL_FINS(edma3cc0Regs->PARAMSET[0].A_B_CNT, EDMA3CC_A_B_CNT_ACNT, 1);
CSL_FINS(edma3cc0Regs->PARAMSET[0].A_B_CNT, EDMA3CC_A_B_CNT_BCNT, EDMA3_BUFFER_SIZE);
CSL_FINS(edma3cc0Regs->PARAMSET[0].DST, EDMA3CC_DST_DST, (Uint32)in_buffer1); //in_buffer1 is destination
CSL_FINS(edma3cc0Regs->PARAMSET[0].SRC_DST_BIDX, EDMA3CC_SRC_DST_BIDX_DSTBIDX, 1);
CSL_FINS(edma3cc0Regs->PARAMSET[0].SRC_DST_BIDX, EDMA3CC_SRC_DST_BIDX_SRCBIDX, 0);
CSL_FINS(edma3cc0Regs->PARAMSET[0].LINK_BCNTRLD, EDMA3CC_LINK_BCNTRLD_BCNTRLD, (Uint16)&edma3cc0Regs->PARAMSET[1]); // next param set [1]
CSL_FINS(edma3cc0Regs->PARAMSET[0].SRC_DST_CIDX, EDMA3CC_SRC_DST_CIDX_DSTCIDX, 0);
CSL_FINS(edma3cc0Regs->PARAMSET[0].SRC_DST_CIDX, EDMA3CC_SRC_DST_CIDX_SRCCIDX, 0);
CSL_FINS(edma3cc0Regs->PARAMSET[0].CCNT, EDMA3CC_CCNT_CCNT, 1);
CSL_FINST(edma3cc0Regs->PARAMSET[1].OPT, EDMA3CC_OPT_ITCINTEN, ENABLE); // int enable
CSL_FINS(edma3cc0Regs->PARAMSET[1].OPT, EDMA3CC_OPT_TCC, 2);
CSL_FINS(edma3cc0Regs->PARAMSET[1].SRC, EDMA3CC_SRC_SRC, CSL_MCBSP_1_CTRL_REGS); // McBsp1 is source
CSL_FINS(edma3cc0Regs->PARAMSET[1].A_B_CNT, EDMA3CC_A_B_CNT_ACNT, 1);
CSL_FINS(edma3cc0Regs->PARAMSET[1].A_B_CNT, EDMA3CC_A_B_CNT_BCNT, EDMA3_BUFFER_SIZE);
CSL_FINS(edma3cc0Regs->PARAMSET[1].DST, EDMA3CC_DST_DST, (Uint32)in_buffer2); //in_buffer2 is destination
CSL_FINS(edma3cc0Regs->PARAMSET[1].SRC_DST_BIDX, EDMA3CC_SRC_DST_BIDX_DSTBIDX, 1);
CSL_FINS(edma3cc0Regs->PARAMSET[1].SRC_DST_BIDX, EDMA3CC_SRC_DST_BIDX_SRCBIDX, 0);
CSL_FINS(edma3cc0Regs->PARAMSET[1].LINK_BCNTRLD, EDMA3CC_LINK_BCNTRLD_BCNTRLD, (Uint16)&edma3cc0Regs->PARAMSET[2]); // next param set [0]
CSL_FINS(edma3cc0Regs->PARAMSET[1].SRC_DST_CIDX, EDMA3CC_SRC_DST_CIDX_DSTCIDX, 0);
CSL_FINS(edma3cc0Regs->PARAMSET[1].SRC_DST_CIDX, EDMA3CC_SRC_DST_CIDX_SRCCIDX, 0);
CSL_FINS(edma3cc0Regs->PARAMSET[1].CCNT, EDMA3CC_CCNT_CCNT, 1);
CSL_FINST(edma3cc0Regs->PARAMSET[2].OPT, EDMA3CC_OPT_ITCINTEN, ENABLE); // int enable
CSL_FINS(edma3cc0Regs->PARAMSET[2].OPT, EDMA3CC_OPT_TCC, 1);
CSL_FINS(edma3cc0Regs->PARAMSET[2].SRC, EDMA3CC_SRC_SRC, CSL_MCBSP_1_CTRL_REGS); // McBsp1 is source
CSL_FINS(edma3cc0Regs->PARAMSET[2].A_B_CNT, EDMA3CC_A_B_CNT_ACNT, 1);
CSL_FINS(edma3cc0Regs->PARAMSET[2].A_B_CNT, EDMA3CC_A_B_CNT_BCNT, EDMA3_BUFFER_SIZE);
CSL_FINS(edma3cc0Regs->PARAMSET[2].DST, EDMA3CC_DST_DST, (Uint16)in_buffer1); //in_buffer1 is destination
CSL_FINS(edma3cc0Regs->PARAMSET[2].SRC_DST_BIDX, EDMA3CC_SRC_DST_BIDX_DSTBIDX, 1);
CSL_FINS(edma3cc0Regs->PARAMSET[2].SRC_DST_BIDX, EDMA3CC_SRC_DST_BIDX_SRCBIDX, 0);
CSL_FINS(edma3cc0Regs->PARAMSET[2].LINK_BCNTRLD, EDMA3CC_LINK_BCNTRLD_BCNTRLD, (Uint32)&edma3cc0Regs->PARAMSET[1]); // next param set [1]
CSL_FINS(edma3cc0Regs->PARAMSET[2].SRC_DST_CIDX, EDMA3CC_SRC_DST_CIDX_DSTCIDX, 0);
CSL_FINS(edma3cc0Regs->PARAMSET[2].SRC_DST_CIDX, EDMA3CC_SRC_DST_CIDX_SRCCIDX, 0);
CSL_FINS(edma3cc0Regs->PARAMSET[2].CCNT, EDMA3CC_CCNT_CCNT, 1);
// Enable EDMA3 Interrupts
edma3cc0Regs->IER = 1;
CSL_FINST(edma3cc0Regs->IER, EDMA3CC_IER_I0, ENABLE);
// Map EDMA system interrupts to DSP INT5
CSL_FINS(dspintcRegs->INTMUX1, DSPINTC_INTMUX1_INTSEL5, CSL_INTC_EVENTID_EDMA3_0_CC0_INT1);
}
The interrupt 5 in IER is enabled on another place.
What is the reason for this ?
May I use IDMA ?
Volker