I use both channels of McASP. I use ARX0[0] to receive and ARX0[1] to transmit on McASP0 and ARX1[0], ARX1[1] to transmit and ARX1[2] to receive on McASP1. All in I2S mode. For beginning I tuned McASPs for program poling. After that I made tune McASPs for dMAX servicing. I wrote interrupt for dMAX working check.
#pragma INTERRUPT( dMax )
interrupt void dMax( void )
{
static int i[4] = {0,0,0,0};
MCASP0->PDSET.dword = TESTLED;
//while( dMAX->DTCR0.dword )
{
if( dMAX->DTCR0.TCC0 ) // Send McASP0
{
dMAX->DTCR0.TCC0 = 1;
i[0]++;
}
if( dMAX->DTCR0.TCC1 ) // Rec McASP0
{
dMAX->DTCR0.TCC1 = 1;
i[1]++;
if(i[1] == 44100)
asm( " nop 4");
}
if( dMAX->DTCR0.TCC2 ) // Send McASP1
{
dMAX->DTCR0.TCC2 = 1;
i[2]++;
}
if( dMAX->DTCR0.TCC3 ) // Rec McASP1
{
dMAX->DTCR0.TCC3 = 1;
i[3]++;
}
}
MCASP0->PDCLR.dword = TESTLED;
}
I set breakpoint on receiving 44100 samples (asm( " nop 4");)
If I enable event (in DEER register) only for receiving on McASP1 or for transmitting then count on break is 88199 for i[2] or i[3] as true. If I enable both events the count of transmitting i[2] is very low, for example 17.
Patch from spra203 id applied. Without patch dMAX do not works.
In what direction should I look for error?
void DmaxMcAsp0_init(void)
{
// 3.2.1 Steps Required to Set Up a General Purpose Transfer
// 1.
dMAX->DEHPR.dword |= (1<<dMAXE_McASP0TX) | (1<<dMAXE_McASP0RX); //
// 2.
dMAX->DEPR.dword |= (1<<dMAXE_McASP0TX) | (1<<dMAXE_McASP0RX); //
//dMAX->DEPR.dword &= ~((1<<dMAXE_McASP0TX) | (1<<dMAXE_McASP0RX));
// 3.
#define McASP0_Trasfer_Entry 0
HiMAX->Event[dMAXE_McASP0TX].GP.dword =
PaRAME_ETYPE_GP | // General P
PaRAME_PTEGP(McASP0_Trasfer_Entry) |
PaRAME_ESIZEGP_32 | // work with dwords
PaRAME_CC(0) | //15 bit, 8 bit, 8 bit
PaRAME_RLOAD_YES | // Reload addresses
PaRAME_TCINT_ENABLE | // Interrupt after complete
PaRAME_ATCINT_DISABLE | // No internal interrupts
PaRAME_TCC(TCC_McASP0T) | // Transfer complete code DTCR0.TCC_McASP0T
PaRAME_SYNC_COUNT0 | // Work only count0 on one event
PaRAME_QTSL_1; // One element on transfer
// 4.
HiMAX->Entry[McASP0_Trasfer_Entry].GPZ.SRC =
HiMAX->Entry[McASP0_Trasfer_Entry].GPZ.SRC0 = IData_buf;
HiMAX->Entry[McASP0_Trasfer_Entry].GPZ.SRC1 = &IData_buf[2];
HiMAX->Entry[McASP0_Trasfer_Entry].GPZ.DST =
HiMAX->Entry[McASP0_Trasfer_Entry].GPZ.DST0 =
HiMAX->Entry[McASP0_Trasfer_Entry].GPZ.DST1 = McASP0_DMA;
HiMAX->Entry[McASP0_Trasfer_Entry].GPZ.REFERENCE.dword =
HiMAX->Entry[McASP0_Trasfer_Entry].GPZ.ACTIVE.dword = PaRAME_GPZ_COUNT0(1) | PaRAME_GPZ_COUNT1(2) | PaRAME_GPZ_COUNT2(0);
//HiMAX->Entry[McASP0_Trasfer_Entry].GPZ.INDX[0].dword = HWORD(1) | LWORD(1);
HiMAX->Entry[McASP0_Trasfer_Entry].GPZ.INDX[1].dword = HWORD(1) | LWORD(1);
// 3.
#define McASP0_Rec_Entry 1
HiMAX->Event[dMAXE_McASP0RX].GP.dword =
PaRAME_ETYPE_GP | // General P
PaRAME_PTEGP(McASP0_Rec_Entry) |
PaRAME_ESIZEGP_32 | // work with dwords
PaRAME_CC(0) | //15 bit, 8 bit, 8 bit
PaRAME_RLOAD_YES | // Reload addresses
PaRAME_TCINT_ENABLE | // Interrupt after complete
PaRAME_ATCINT_DISABLE | // No internal interrupts
PaRAME_TCC(TCC_McASP0R) | // Transfer complete code DTCR0.TCC_McASP0R
PaRAME_SYNC_COUNT0 | // Work only count0 on one event
PaRAME_QTSL_1; // One element on transfer
// 4.
HiMAX->Entry[McASP0_Rec_Entry].GPZ.SRC =
HiMAX->Entry[McASP0_Rec_Entry].GPZ.SRC0 =
HiMAX->Entry[McASP0_Rec_Entry].GPZ.SRC1 = McASP0_DMA;
HiMAX->Entry[McASP0_Rec_Entry].GPZ.DST =
HiMAX->Entry[McASP0_Rec_Entry].GPZ.DST0 = OData_buf;
HiMAX->Entry[McASP0_Rec_Entry].GPZ.DST1 = &OData_buf[2];
HiMAX->Entry[McASP0_Rec_Entry].GPZ.REFERENCE.dword =
HiMAX->Entry[McASP0_Rec_Entry].GPZ.ACTIVE.dword = PaRAME_GPZ_COUNT0(1) | PaRAME_GPZ_COUNT1(2) | PaRAME_GPZ_COUNT2(0);
HiMAX->Entry[McASP0_Rec_Entry].GPZ.INDX[1].dword = HWORD(1) | LWORD(1);
//HiMAX->Entry[McASP0_Rec_Entry].GPZ.INDX[1].dword = 0;
// 5.
dMAX->DEER.dword |= (1<<dMAXE_McASP0TX) | (1<<dMAXE_McASP0RX); //
}
void DmaxMcAsp1_init(void)
{
// 3.2.1 Steps Required to Set Up a General Purpose Transfer
// 1.
dMAX->DEHPR.dword |= (1<<dMAXE_McASP1TX) | (1<<dMAXE_McASP1RX); //
// 2.
dMAX->DEPR.dword |= (1<<dMAXE_McASP1TX) | (1<<dMAXE_McASP1RX); //
//dMAX->DEPR.dword &= ~((1<<dMAXE_McASP0TX) | (1<<dMAXE_McASP0RX));
// 3.
#define McASP1_Trasfer_Entry 2
HiMAX->Event[dMAXE_McASP1TX].GP.dword =
PaRAME_ETYPE_GP | // General P
PaRAME_PTEGP(McASP1_Trasfer_Entry) |
PaRAME_ESIZEGP_32 | // work with dwords
PaRAME_CC(0) | //15 bit, 8 bit, 8 bit
PaRAME_RLOAD_YES | // Reload addresses
PaRAME_TCINT_ENABLE | // Interrupt after complete
PaRAME_ATCINT_DISABLE | // No internal interrupts
PaRAME_TCC(TCC_McASP1T) | // Transfer complete code DTCR0.TCC_McASP0T
PaRAME_SYNC_COUNT0 | // Work only count0 on one event
PaRAME_QTSL_4; // One element on transfer
// 4.
HiMAX->Entry[McASP1_Trasfer_Entry].GPZ.SRC =
HiMAX->Entry[McASP1_Trasfer_Entry].GPZ.SRC0 = D12_buf;
HiMAX->Entry[McASP1_Trasfer_Entry].GPZ.SRC1 = &D12_buf[4];
HiMAX->Entry[McASP1_Trasfer_Entry].GPZ.DST =
HiMAX->Entry[McASP1_Trasfer_Entry].GPZ.DST0 =
HiMAX->Entry[McASP1_Trasfer_Entry].GPZ.DST1 = McASP1_DMA;
HiMAX->Entry[McASP1_Trasfer_Entry].GPZ.REFERENCE.dword =
HiMAX->Entry[McASP1_Trasfer_Entry].GPZ.ACTIVE.dword = PaRAME_GPZ_COUNT0(2) | PaRAME_GPZ_COUNT1(2) | PaRAME_GPZ_COUNT2(0);
HiMAX->Entry[McASP1_Trasfer_Entry].GPZ.INDX[0].dword = HWORD(1) | LWORD(1);
HiMAX->Entry[McASP1_Trasfer_Entry].GPZ.INDX[1].dword = HWORD(1) | LWORD(1);
// 3.
#define McASP1_Rec_Entry 3
HiMAX->Event[dMAXE_McASP1RX].GP.dword =
PaRAME_ETYPE_GP | // General P
PaRAME_PTEGP(McASP1_Rec_Entry) |
PaRAME_ESIZEGP_32 | // work with dwords
PaRAME_CC(0) | //15 bit, 8 bit, 8 bit
PaRAME_RLOAD_YES | // Reload addresses
PaRAME_TCINT_ENABLE | // Interrupt after complete
PaRAME_ATCINT_DISABLE | // No internal interrupts
PaRAME_TCC(TCC_McASP1R) | // Transfer complete code DTCR0.TCC_McASP0R
PaRAME_SYNC_COUNT0 | // Work only count0 on one event
PaRAME_QTSL_1; // One element on transfer
// 4.
HiMAX->Entry[McASP1_Rec_Entry].GPZ.SRC =
HiMAX->Entry[McASP1_Rec_Entry].GPZ.SRC0 =
HiMAX->Entry[McASP1_Rec_Entry].GPZ.SRC1 = McASP1_DMA;
HiMAX->Entry[McASP1_Rec_Entry].GPZ.DST =
HiMAX->Entry[McASP1_Rec_Entry].GPZ.DST0 = DADC_buf;
HiMAX->Entry[McASP1_Rec_Entry].GPZ.DST1 = &DADC_buf[2];
HiMAX->Entry[McASP1_Rec_Entry].GPZ.REFERENCE.dword =
HiMAX->Entry[McASP1_Rec_Entry].GPZ.ACTIVE.dword = PaRAME_GPZ_COUNT0(1) | PaRAME_GPZ_COUNT1(2) | PaRAME_GPZ_COUNT2(0);
HiMAX->Entry[McASP1_Rec_Entry].GPZ.INDX[1].dword = HWORD(1) | LWORD(1);
//HiMAX->Entry[McASP1_Rec_Entry].GPZ.INDX[1].dword = 0;
// 5.
dMAX->DEER.dword |= (1<<dMAXE_McASP1RX) | (1<<dMAXE_McASP1TX); //
}