This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DM8168 McASP not generating EDMA events AXEVT0,AREVT0

Other Parts Discussed in Thread: CCSTUDIO

I'm configuring the McASP in the DM8168 (from the DSP core) to be driven by EDMA, and I don't see it generating any EDMA events.  EDMA is configured first, and is waiting on event triggers.  As soon as I take the McASP FS generators out of reset, the RSTAT and XSTAT registers show ROVRN and XUNDRN respectively, and the EDMA ER register remains all zeroes.  EDMA EER says that AXEVT0 and AREVT0 are enabled. The over/underrun is understandable if EDMA is not moving data.  My McASP and EDMA setup code is below.  Can anyone tell me what I'm missing?  

Thanks in advance,

Stu

void mcasp_init(void)
{

int loop1=0;

// From SPRUGX8, section 14.2.10.2

// step 1: Reset McASP to default values by setting GBLCTL = 0
REG_SETVAL(MCASP_GBLCTL_REG, 0x00000000);
REG_SETVAL(MCASP_RGBLCTL_REG, 0x00000000);
REG_SETVAL(MCASP_XGBLCTL_REG, 0x00000000);

// step 2a: Configure Power down and emulation management
REG_SETVAL(MCASP_PWREMUMGT_REG, (REG_GETREG(MCASP_PWREMUMGT_REG) | (
(0x1 <<1) // MCASP_SOFT = 1
)));

// step 2b: Configure Receive registers
REG_SETVAL(MCASP_RMASK_REG, 0xffffffff);


REG_SETVAL(MCASP_RFMT_REG, (
(0x0 <<0) + // RROT = 0
(0x0 <<3) + // RBUSEL = 0 (********Note: Use RBUSEL=1(ConfigBus) for Ready Bit Polling case only) || (Note: Use RBUSEL=0(DataPort) for EDMA/CpuInterrupt case only)
(0xF <<4) + // RSSZ = 0xF (32-bits)
(0x1 <<15) + // RRVRS = 1
(0x1 <<16) // RDATDLY = 1
));

REG_SETVAL(MCASP_AFSRCTL_REG, (
(0x1 <<0) + // FSRP = 1
(0x1 <<1) + // FSRM = 1
(0x1 <<4) + // FRWID = 1
(0x2 <<7) // RMOD = 2
));


REG_SETVAL(MCASP_ACLKRCTL_REG, (
(0x3 <<0) + //CLKRDIV = 3
(0x1 <<5) + // CLKRM = 1
(0x1 <<7) // CLKXP = 1
));


REG_SETVAL(MCASP_AHCLKRCTL_REG, (
(0xF <<0) + // HCLKRDIV = 15
(0x0 <<14) + // HCLKRP = 0
(0x1 <<15) // HCLKRM = 1
));

REG_SETVAL(MCASP_RTDM_REG, 0x3); // RTDMS = 3


REG_SETVAL(MCASP_RINTCTL_REG, (
(0x0 <<5) // RDATA = 0
));

REG_SETVAL(MCASP_RCLKCHK_REG, 0x00ff0000);

// step 2c: Configure Transmit registers

REG_SETVAL(MCASP_XMASK_REG, 0xffffffff); // //verify


REG_SETVAL(MCASP_XFMT_REG, (
(0x0 <<0) + // XROT = 0
(0x0 <<3) + // XBUSEL = 0 (********Note: Use XBUSEL=1(ConfigBus) for Ready Bit Polling case only) || (Note: Use XBUSEL=0(DataPort) for EDMA/CpuInterrupt case only)
(0xF <<4) + // XSSZ = 0xF (32-bits)
(0x1 <<15) + // XRVRS = 1
(0x1 <<16) // XDATDLY = 1
));

REG_SETVAL(MCASP_AFSXCTL_REG, (
(0x1 <<0) + // FSXP = 1
(0x1 <<1) + // FSXM = 1
(0x1 <<4) + // FXWID = 1
(0x2 <<7) // XMOD = 2
));


REG_SETVAL(MCASP_ACLKXCTL_REG, (
(0x3 <<0) + //CLKXDIV = 3
(0x1 <<5) + //CLKXM = 1
(0x0 <<6) + // ASYNC = 0
(0x1 <<7) // CLKXP = 1
));


REG_SETVAL(MCASP_AHCLKXCTL_REG, (
(0xF <<0) + // HCLKXDIV = 15
(0x0 <<14) + // HCLKXP = 0
(0x1 <<15) // HCLKXM = 1
));


REG_SETVAL(MCASP_XTDM_REG, 0x3); // XTDMS = 3


REG_SETVAL(MCASP_XINTCTL_REG, 0x0);

REG_SETVAL(MCASP_XCLKCHK_REG, 0x00ff0000);


// step 2d: Configure Serializer registers

REG_SETVAL(MCASP_SRCTL0_REG, (
(0x2 <<0) // SRMOD = 2 (Rx)
));

REG_SETVAL(MCASP_SRCTL1_REG, (
(0x0 <<0) // SRMOD = 0 (Inactive)
));

REG_SETVAL(MCASP_SRCTL2_REG, (
(0x0 <<0) // SRMOD = 0 (Inactive)
));

REG_SETVAL(MCASP_SRCTL3_REG, (
(0x0 <<0) // SRMOD = 0 (Inactive)
));

REG_SETVAL(MCASP_SRCTL4_REG, (
(0x0 <<0) // SRMOD = 0 (Inactive)
));


REG_SETVAL(MCASP_SRCTL5_REG, (
(0x1 <<0) // SRMOD = 1 (Tx)
));

// step 2e: Configure Global registers

REG_SETVAL(MCASP_PFUNC_REG, (0x1 << 25)); // AMUTE is GPIO


REG_SETVAL(MCASP_PDIR_REG, (
(0x0 <<0) + // AXR0 = 0 // Inputs (Rx)
(0x0 <<1) + // AXR1 = 0
(0x0 <<2) + // AXR2 = 0
(0x1 <<3) + // AXR3 = 1 // Outputs (Tx)
(0x1 <<4) + // AXR4 = 1
(0x1 <<5) + // AXR5 = 1
(0x1 <<25) + // AMUTE = 1
(0x1 <<26) + // ACLKX = 1
(0x1 <<27) + // AHCLKX = 1
(0x1 <<28) + // AFSX = 1
(0x0 <<29) + // ACLKR = 0
(0x0 <<30) + // AHCLKR = 0
(0x0 <<31) // AFSR = 0
));


// step 2f: Configure DIT registers
REG_SETVAL(MCASP_DITCTL_REG, (
(0x0 <<0) // DITEN = 0
));


REG_SETVAL(MCASP_DLBCTL_REG, 0x0);


REG_SETVAL(MCASP_PDOUT_REG, (0x1 <<25)); // assert AMUTE


// step 3a: Take high-freq clock dividers out of reset

REG_SETVAL(MCASP_GBLCTL_REG, (
(0x1 <<1) + // RHCLKRST = 1
(0x1 <<9) // XHCLKRST = 1
));


// step 3b: Wait for GBLCTL bits to latch

loop1=0;
while((REG_READBITS(MCASP_GBLCTL_REG, 0x202) != 0x202) && (loop1 < 100000)) // check for RHCLKRST=1 and XHCLKRST=1
loop1++;

if(loop1 == 100000)
{
hprintf(LOG_DEBUG,"\n McASP init failed to get RHCLKRST or XHCLKRST");
return;
}


// step 4a: Take internal serial clock dividers out of reset

REG_SETVAL(MCASP_GBLCTL_REG, (REG_GETREG(MCASP_GBLCTL_REG) | (
(0x1 <<0) + // RCLKRST = 1
(0x1 <<8) // XCLKRST = 1
)));

// step 4b: Wait for GBLCTL bits to latch

loop1=0;
while((REG_READBITS(MCASP_GBLCTL_REG, 0x101) != 0x101) && (loop1 < 100000)) // check for RCLKRST=1 and XCLKRST=1
loop1++;

if(loop1 == 100000)
{
hprintf(LOG_DEBUG,"\n McASP init failed to get RCLKRST or XCLKRST");
return;
}


//*************************************************************************************************//
// DO NOT DO this step-5 for ready bit polling case (meaning no-EDMA/no-CpuInterrupts). ignore Step-5 completely
// Step 5. Setup data acquisition as required: (Do below settings in this step only for EDMA case).
//NOTE: The WNUMEVT/RNUMEVT and WNUMDMA/RNUMDMA values must be set prior to enabling the Write FIFO/Read FIFO.
//If the Write FIFO/Read FIFO is to be enabled, it must be enabled prior to taking the McASP out of
//reset.

REG_SETVAL(MCASP_WFIFOCTL_REG, (
(0x1 <<0) + // WNUMDMA = 1 Tx serializers in sequoia
(0x20 <<8) // WNUMEVT = 32_words (256_bytes/(2_bytes * 1_serializers * 2_LRslots) = 64_words max depth available for FIFO. So 32 is chosen as optimal for EDMA) (Note: FIFO size=256 bytes, 1_words=NoOfSerializers)
));

REG_SETVAL(MCASP_WFIFOCTL_REG, (REG_GETREG(MCASP_WFIFOCTL_REG) | (
(0x1 <<16) // WENA = 1
)));


REG_SETVAL(MCASP_RFIFOCTL_REG, (
(0x1 <<0) + // RNUMDMA = 1_words Rx serializers in sequoia
(0x20 <<8) // RNUMEVT = 32_words (256_bytes/(2_bytes * 1_serializers * 2_LRslots) = 64_words max depth available for FIFO. So 32 is chosen as optimal for EDMA) (Note: FIFO size=256 bytes, 1_words=NoOfSerializers)
));

REG_SETVAL(MCASP_RFIFOCTL_REG, (REG_GETREG(MCASP_RFIFOCTL_REG) | (
(0x1 <<16) // RENA = 1
)));


//*************************************************************************************************//

//Step 6. Activate serializers.

// Step 6a: clear status regs
REG_SETVAL(MCASP_XSTAT_REG, 0x000001FF);
REG_SETVAL(MCASP_RSTAT_REG, 0x000001FF);

// Step 6b: take serializers out of reset

REG_SETVAL(MCASP_GBLCTL_REG, (REG_GETREG(MCASP_GBLCTL_REG) | (
(0x1 <<2) + // RSRCLR = 1
(0x1 <<10) // XSRCLR = 1
)));

// Step 6c: wait for GBLCTL bits to latch

loop1=0;
while((REG_READBITS(MCASP_GBLCTL_REG, 0x404) != 0x404) && (loop1 < 100000)) // check for RSRCLR=1 and XSRCLR=1
loop1++;

if(loop1 == 100000)
{
hprintf(LOG_DEBUG,"\n McASP init failed to get RSRCLR or XSRCLR");
return;
}

// Step 7: Verify that all transmit buffers are serviced

// Step 7a: clear XDATA bit in XSTAT
REG_SETVAL(MCASP_XSTAT_REG, REG_GETREG(MCASP_XSTAT_REG)); // note this reg is W1C (write 1 to clear)

// Step 7c: if polling, write to XBUF
// REG_SETVAL(MCASP_XBUF5_REG, 0x5555); // Do this for polling only


// Step 8a: take state machines out of reset

REG_SETVAL(MCASP_GBLCTL_REG, (REG_GETREG(MCASP_GBLCTL_REG) | (
(0x1 <<3) + // RSMRST = 1
(0x1 <<11) // XSMRST = 1
)));

// Step 8b: wait for GBLCTL bits to latch

loop1=0;
while((REG_READBITS(MCASP_GBLCTL_REG, 0x808) != 0x808) && (loop1 < 100000)) // check for RSMRST = 1 and XSMRST=1
loop1++;

if(loop1 == 100000)
{
hprintf(LOG_DEBUG,"\n McASP init failed to get RSMRST or XSMRST");
return;
}

// Step 9a: take frame sync generators out of reset

REG_SETVAL(MCASP_GBLCTL_REG, (REG_GETREG(MCASP_GBLCTL_REG) | (
(0x1 <<4) + // RFRST = 1
(0x1 <<12) // XFRST = 1
)));

// Step 9b: wait for GBLCTL bits to latch

loop1=0;
while((REG_READBITS(MCASP_GBLCTL_REG, 0x1010) != 0x1010) && (loop1 < 100000)) // check for RFRST = 1 and XFRST=1
loop1++;

if(loop1 == 100000)
{
hprintf(LOG_DEBUG,"\n McASP init failed to get RFRST or XFRST");
return;
}

hprintf(LOG_DEBUG,"McASP init completed");

}

 

void edma_init(void)

{

chNumMcASPRx = CSL_EDMA3_CHA_AREVT0;
chNumMcASPTx = CSL_EDMA3_CHA_AXEVT0;

tccMcASPRxPing = TCC_NUM_0;
tccMcASPRxPong = TCC_NUM_1;
tccMcASPTxPing = TCC_NUM_2;
tccMcASPTxPong = TCC_NUM_3;

ParamNumMcASPRxBasic = chNumMcASPRx;
ParamNumMcASPRxLinkPing = PARAM_NUM_72;
ParamNumMcASPRxLinkPong = PARAM_NUM_73;
ParamNumMcASPTxBasic = chNumMcASPTx;
ParamNumMcASPTxLinkPing = PARAM_NUM_74;
ParamNumMcASPTxLinkPong = PARAM_NUM_75;

CSL_edma3MapDMAChannelToParamBlock(hModule, chNumMcASPRx, ParamNumMcASPRxBasic);
CSL_edma3MapDMAChannelToParamBlock(hModule, chNumMcASPTx, ParamNumMcASPTxBasic);
CSL_edma3MapDMAChannelToEventQueue (hModule, chNumMcASPRx, CSL_EDMA3_QUE_2);
CSL_edma3MapDMAChannelToEventQueue (hModule, chNumMcASPTx, CSL_EDMA3_QUE_2);

EdmaEventHook(tccMcASPTxPing, edmaMcaspIsrFrameRxTxPing);
EdmaEventHook(tccMcASPTxPong, edmaMcaspIsrFrameRxTxPing);

regionAccess.region = EDMA_REGION ;
ullTemp = (unsigned long long)1 << chNumMcASPRx;
ullTemp |= (unsigned long long)1 << chNumMcASPTx;
ullTemp |= (unsigned long long)1 << tccMcASPRxPing;
ullTemp |= (unsigned long long)1 << tccMcASPRxPong;
ullTemp |= (unsigned long long)1 << tccMcASPTxPing;
ullTemp |= (unsigned long long)1 << tccMcASPTxPong;
regionAccess.drae = _loll(ullTemp);
regionAccess.draeh = _hill(ullTemp);

statusMcASP = CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_DMAREGION_ENABLE, &regionAccess);
if (statusMcASP != CSL_SOK) {
Sys_CountMcASP ++;
return;
}

hModule->regs->TPCC_EMCR |= _loll(ullTemp);
hModule->regs->TPCC_EMCRH |= _hill(ullTemp);

chAttr.regionNum = EDMA_REGION;
chAttr.chaNum = chNumMcASPRx;
hChannelMcASPRx = CSL_edma3ChannelOpen(&chObjMcASPRx, CSL_EDMA3, &chAttr, &statusMcASP);
if ( (hChannelMcASPRx == NULL) || (statusMcASP != CSL_SOK)) {
Sys_CountMcASP ++;
return;
}
statusMcASP = CSL_edma3GetHwChannelSetupParam(hChannelMcASPRx,&ParamNumMcASPRxBasic);
if (statusMcASP != CSL_SOK) {
Sys_CountMcASP ++;
return;
}
hParamMcASPRxBasic = CSL_edma3GetParamHandle(hChannelMcASPRx,ParamNumMcASPRxBasic,&statusMcASP);
if (hParamMcASPRxBasic == NULL) {
Sys_CountMcASP ++;
return;
}
hParamMcASPRxLinkPing = CSL_edma3GetParamHandle(hChannelMcASPRx,ParamNumMcASPRxLinkPing,&statusMcASP);
if (hParamMcASPRxLinkPing == NULL) {
Sys_CountMcASP ++;
return;
}
hParamMcASPRxLinkPong = CSL_edma3GetParamHandle(hChannelMcASPRx,ParamNumMcASPRxLinkPong,&statusMcASP);
if (hParamMcASPRxLinkPong == NULL) {
Sys_CountMcASP ++;
return;
}
chAttr.regionNum = EDMA_REGION;
chAttr.chaNum = chNumMcASPTx;
hChannelMcASPTx = CSL_edma3ChannelOpen(&chObjMcASPTx, CSL_EDMA3, &chAttr, &statusMcASP);
if ( (hChannelMcASPTx == NULL) || (statusMcASP != CSL_SOK)) {
Sys_CountMcASP ++;
return;
}
statusMcASP = CSL_edma3GetHwChannelSetupParam(hChannelMcASPTx,&ParamNumMcASPTxBasic);
if (statusMcASP != CSL_SOK) {
Sys_CountMcASP ++;
return;
}
hParamMcASPTxBasic = CSL_edma3GetParamHandle(hChannelMcASPTx,ParamNumMcASPTxBasic,&statusMcASP);
if (hParamMcASPTxBasic == NULL) {
Sys_CountMcASP ++;
return;
}
hParamMcASPTxLinkPing = CSL_edma3GetParamHandle(hChannelMcASPTx,ParamNumMcASPTxLinkPing,&statusMcASP);
if (hParamMcASPTxLinkPing == NULL) {
Sys_CountMcASP ++;
return;
}
hParamMcASPTxLinkPong = CSL_edma3GetParamHandle(hChannelMcASPTx,ParamNumMcASPTxLinkPong,&statusMcASP);
if (hParamMcASPTxLinkPong == NULL) {
Sys_CountMcASP ++;
return;
}
regionIntr.region = EDMA_REGION ;
ullTemp = (unsigned long long)1 << tccMcASPRxPing;
ullTemp |= (unsigned long long)1 << tccMcASPRxPong;
ullTemp |= (unsigned long long)1 << tccMcASPTxPing;
ullTemp |= (unsigned long long)1 << tccMcASPTxPong;
regionIntr.intr = _loll(ullTemp);
regionIntr.intrh = _hill(ullTemp);
statusMcASP = CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_INTR_ENABLE,&regionIntr);
if (statusMcASP != CSL_SOK) {
Sys_CountMcASP ++;
return;
}
myParamSetup.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS,
CSL_EDMA3_TCCH_DIS,
CSL_EDMA3_ITCINT_DIS,
CSL_EDMA3_TCINT_EN,
tccMcASPRxPing,
CSL_EDMA3_TCC_NORMAL,
CSL_EDMA3_FIFOWIDTH_NONE,
CSL_EDMA3_STATIC_DIS,
CSL_EDMA3_SYNC_AB,
CSL_EDMA3_ADDRMODE_INCR,
CSL_EDMA3_ADDRMODE_INCR);
myParamSetup.srcAddr = 0x46000000;
myParamSetup.dstAddr = make_l3_target_addr((Uint32)pEdmaRxTxBuffs->edmaRxPingBuffer);

/* Only move the slots with audio data */
myParamSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(NBYTES2, NUM_SLOTS_MCASP);

myParamSetup.cCnt = SAMPLES_PER_10ms;
myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(0, (SAMPLES_PER_10ms*NBYTES2));
myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0, NBYTES2);

myParamSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE ((Uint32) hParamMcASPRxLinkPong, 0);
statusMcASP = CSL_edma3ParamSetup(hParamMcASPRxBasic,&myParamSetup);
if (statusMcASP != CSL_SOK) {
Sys_CountMcASP ++;
return;
}
statusMcASP = CSL_edma3ParamSetup(hParamMcASPRxLinkPing,&myParamSetup);
if (statusMcASP != CSL_SOK) {
Sys_CountMcASP ++;
return;
}
myParamSetup.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS,
CSL_EDMA3_TCCH_DIS,
CSL_EDMA3_ITCINT_DIS,
CSL_EDMA3_TCINT_EN,
tccMcASPRxPong,
CSL_EDMA3_TCC_NORMAL,
CSL_EDMA3_FIFOWIDTH_NONE,
CSL_EDMA3_STATIC_DIS,
CSL_EDMA3_SYNC_AB,
CSL_EDMA3_ADDRMODE_INCR,
CSL_EDMA3_ADDRMODE_INCR);
myParamSetup.srcAddr = (Uint32)0x46000000;
myParamSetup.dstAddr = make_l3_target_addr((UInt32)pEdmaRxTxBuffs->edmaRxPongBuffer);

/* Only move the slots with audio data */
myParamSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(NBYTES2, NUM_SLOTS_MCASP);

myParamSetup.cCnt = SAMPLES_PER_10ms;
myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(0, (SAMPLES_PER_10ms*NBYTES2));
myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0, NBYTES2);

myParamSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE ((Uint32) hParamMcASPRxLinkPing, 0);
statusMcASP = CSL_edma3ParamSetup(hParamMcASPRxLinkPong,&myParamSetup);
if (statusMcASP != CSL_SOK) {
Sys_CountMcASP ++;
return;
}
myParamSetup.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS,
CSL_EDMA3_TCCH_DIS,
CSL_EDMA3_ITCINT_DIS,
CSL_EDMA3_TCINT_EN,
tccMcASPTxPing,
CSL_EDMA3_TCC_NORMAL,
CSL_EDMA3_FIFOWIDTH_NONE,
CSL_EDMA3_STATIC_DIS,
CSL_EDMA3_SYNC_AB,
CSL_EDMA3_ADDRMODE_INCR,
CSL_EDMA3_ADDRMODE_INCR);
myParamSetup.srcAddr = make_l3_target_addr((Uint32)pEdmaRxTxBuffs->edmaTxPingBuffer);
myParamSetup.dstAddr = (Uint32)0x46000000;

myParamSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(NBYTES2, NUM_SLOTS_MCASP);
myParamSetup.cCnt = SAMPLES_PER_10ms;
myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE((SAMPLES_PER_10ms*NBYTES2), 0);
myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(NBYTES2, 0);

myParamSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE ((Uint32) hParamMcASPTxLinkPong, 0);
statusMcASP = CSL_edma3ParamSetup(hParamMcASPTxBasic,&myParamSetup);
if (statusMcASP != CSL_SOK) {
Sys_CountMcASP ++;
return;
}
statusMcASP = CSL_edma3ParamSetup(hParamMcASPTxLinkPing,&myParamSetup);
if (statusMcASP != CSL_SOK) {
Sys_CountMcASP ++;
return;
}
myParamSetup.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS,
CSL_EDMA3_TCCH_DIS,
CSL_EDMA3_ITCINT_DIS,
CSL_EDMA3_TCINT_EN,
tccMcASPTxPong,
CSL_EDMA3_TCC_NORMAL,
CSL_EDMA3_FIFOWIDTH_NONE,
CSL_EDMA3_STATIC_DIS,
CSL_EDMA3_SYNC_AB,
CSL_EDMA3_ADDRMODE_INCR,
CSL_EDMA3_ADDRMODE_INCR);
myParamSetup.srcAddr = make_l3_target_addr((Uint32)pEdmaRxTxBuffs->edmaTxPongBuffer);
myParamSetup.dstAddr = (Uint32)0x46000000;

myParamSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(NBYTES2, NUM_SLOTS_MCASP);
myParamSetup.cCnt = SAMPLES_PER_10ms;
myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE((SAMPLES_PER_10ms*NBYTES2), 0);
myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(NBYTES2, 0);

myParamSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE ((Uint32) hParamMcASPTxLinkPing, 0);
statusMcASP = CSL_edma3ParamSetup(hParamMcASPTxLinkPong,&myParamSetup);
if (statusMcASP != CSL_SOK) {
Sys_CountMcASP ++;
return;
}

statusMcASP = CSL_edma3HwChannelControl(hChannelMcASPRx,CSL_EDMA3_CMD_CHANNEL_ENABLE,NULL);
if (statusMcASP != CSL_SOK)
{
Sys_CountMcASP++;
return;
}
statusMcASP = CSL_edma3HwChannelControl(hChannelMcASPTx,CSL_EDMA3_CMD_CHANNEL_ENABLE,NULL);
if (statusMcASP != CSL_SOK)
{
Sys_CountMcASP++;
return;
}
#endif
return;
}

 

 

  • Stu,

    Are you using DM8168 EVM or custom board? Are you using EZSDK, other SDK or CCStudio project?

    StuJ said:
    As soon as I take the McASP FS generators out of reset, the RSTAT and XSTAT registers show ROVRN and XUNDRN respectively, and the EDMA ER register remains all zeroes.

    This looks like incorrect initialization flow, see the below wiki page:

    http://processors.wiki.ti.com/index.php/McASP_Tips#Transmitter_underflow

    See also the below links, might be in help:

    http://processors.wiki.ti.com/index.php/EDMA_sample_test_application

    http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/717/p/218710/771281.aspx#771281

    http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/716/t/192751.aspx

    http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/717/t/186595.aspx

    DM816x TRM, chapter 14 McASP, section 14.2.12 EDMA Event Support

    Regards,
    Pavel

  • The problem here ended up being the outdated TRM I was using.  The newest edition has a revised McASP initialization sequence which works.  Sort of.  EDMA is now receiving events from McASP and the PaRAM descriptors are cycling through the channel.  Ultimately, I abandoned this path because even though EDMA seemed to be moving data, I'm not reliably getting EDMA TC interrupts.  I'm now focusing on servicing the McASP via interrupts rather than relying on EDMA.