Other Parts Discussed in Thread: CONTROLSUITE
Hello everyone,
I am trying to trigger a cla Task by an ecap Interrupt. My ADC Interrupts are triggering the cla just fine but I don't know what I am doing wrong in the configuration of the ecap/cla.
Here is my CLA Interrupt configuration.
static inline void Init_CLA_Interrupt(void)
{
EALLOW;
// Soft Reset of the CLA - After a soft reset you must wait at least 1 SYSCLKOUT cycle before reconfiguring the MIER bits.
Cla1Regs.MCTL.bit.SOFTRESET = ON;
// Configuration of CLA1TASKSRCSELLOCK Registers not necessary, Task are only assigned once
// Set triggers to CLA Tasks
// AdcDrv assigns Adc Interrupts(max 4 per adc) to different adc channels (16 per adc)
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK1 = CLA_TRIG_ECAP5INT;
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK2 = CLA_TRIG_ADCAINT1;
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK3 = CLA_TRIG_ADCDINT1;
DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK4 = CLA_TRIG_EPWM2INT;
DmaClaSrcSelRegs.CLA1TASKSRCSEL2.bit.TASK5 = CLA_TRIG_SD1INT;
DmaClaSrcSelRegs.CLA1TASKSRCSEL2.bit.TASK8 = CLA_TRIG_NOPERPH;
// Set pointers for the CLA Tasks
Cla1Regs.MVECT1 = (UL)(Cla1Task1);
Cla1Regs.MVECT2 = (UL)(Cla1Task2);
Cla1Regs.MVECT3 = (UL)(Cla1Task3);
Cla1Regs.MVECT4 = (UL)(Cla1Task4);
Cla1Regs.MVECT5 = (UL)(Cla1Task5);
Cla1Regs.MVECT8 = (UL)(Cla1Task8);
// Set Interrupt Enable for all 8 CLA Tasks
Cla1Regs.MIER.all = 0xFF;
EDIS;
EALLOW;
// clear all old interrupt flags
Cla1Regs.MICLR.all = 0xFF;
// clear old Overflow flags
Cla1Regs.MICLROVF.all = 0xFF;
// Configure the vectors for the end-of-task interrupt for all tasks
PieVectTable.CLA1_1_INT = endOfClaResetTask1Isr;
PieVectTable.CLA1_2_INT = endOfClaIsr;
PieVectTable.CLA1_3_INT = endOfClaIsr;
PieVectTable.CLA1_4_INT = endOfClaResetIsr;
PieVectTable.CLA1_5_INT = endOfClaIsr;
PieVectTable.CLA1_8_INT = endOfClaInitIsr;
// Enable CLA interrupts at the group and subgroup levels
PieCtrlRegs.PIEIER11.all = 0xFFFF; // enable all interrupts in group 11
IER |= (M_INT11 ); // enable group 11
// cla accesses interrupts directly, not through pie (c2000 cla faq)
// Enable CLA interrupts at the group and subgroup levels for ecap
//PieCtrlRegs.PIEIER4.all = 0xFFFF; // enable all interrupts in group 4
//IER |= (M_INT4 ); // enable group 4
EDIS;
EALLOW;
// Initialize CLA Variables through a software interrupt to CLA task 8
Cla1Regs.MIFRC.bit.INT8 = ON;
asm(" RPT #3 || NOP");
while(Cla1Regs.MIRUN.bit.INT8 == 1);
EDIS;
}
And here is my ecap configuration.
void Init_CaptureDrv(void)
{
US module = (US) ECAP_DRV_MODULE_1;
UL period = 0U;
EALLOW;
// ///////////////////////////////////////////////////////
// //APWM
// ///////////////////////////////////////////////////////
// // Pinmux configuration GPIO25 => J6 pin 51; OUTPUTXBAR2
// OutputXbarRegs.OUTPUT2MUX0TO15CFG.bit.MUX8 = 3U; // MUX8 => ECAP5OUT
// OutputXbarRegs.OUTPUT2MUXENABLE.bit.MUX8 = ON;
// ///////////////////////////////////////////////////////
// //eCAP
// ///////////////////////////////////////////////////////
// // GPIO95 => J5 pin 42
// GpioCtrlRegs.GPCPUD.bit.GPIO95 = OFF; //pull up enabled
// GpioCtrlRegs.GPCDIR.bit.GPIO95 = OFF; //input
// InputXbarRegs.INPUT7SELECT = 95U;
// InputXbarRegs.INPUTSELECTLOCK.bit.INPUT7SELECT = OFF; //register is not locked
// Shadow registers
UL sRegCTRPHS = 0x00000000; // Shadow Register Counter phase
UL sRegCAPx = 0x00000000; // Shadow Register CAPx
US sRegECEINT = 0x0000; // Shadow Register Interrupt Enable (EALLOW)
US sRegECFLG = 0x0000; // Shadow Register Interrupt Flag
US sRegECCLR = 0x0000; // Shadow Register Interrupt Clear
US sRegECFRC = 0x0000; // Shadow Register Interrupt Force
for(module = (US) ECAP_DRV_MODULE_1; module <= (US) ECAP_DRV_MODULE_4; module++)
{
// configure as capture
eCapDrv.pRegsECAP[module]->ECCTL2.bit.CAP_APWM = OFF;
// Disable CAP1-CAP4 register loads and make sure the counter is stopped
eCapDrv.pRegsECAP[module]->ECCTL1.bit.CAPLDEN = OFF;
eCapDrv.pRegsECAP[module]->ECCTL2.bit.TSCTRSTOP = OFF;
// set counter phase to 0
eCapDrv.pRegsECAP[module]->CTRPHS = sRegCTRPHS;
// initialize eCap Registers to 0
eCapDrv.pRegsECAP[module]->CAP1 = sRegCAPx;
// disable interrupts and clear flags
eCapDrv.pRegsECAP[module]->ECEINT.all = sRegECEINT;
eCapDrv.pRegsECAP[module]->ECFLG.all = sRegECFLG;
eCapDrv.pRegsECAP[module]->ECCLR.all = sRegECCLR;
eCapDrv.pRegsECAP[module]->ECFRC.all = sRegECFRC;
// Two rising and two falling edges to determine period and duty cycle
eCapDrv.pRegsECAP[module]->ECCTL1.bit.FREE_SOFT = 3U; // TSCTR is free running
eCapDrv.pRegsECAP[module]->ECCTL1.bit.CAP1POL = OFF; // Rising Edge
eCapDrv.pRegsECAP[module]->ECCTL1.bit.CAP2POL = ON; // Falling Edge
eCapDrv.pRegsECAP[module]->ECCTL1.bit.CAP3POL = OFF; // Rising Edge
eCapDrv.pRegsECAP[module]->ECCTL1.bit.CAP4POL = ON; // Falling Edge
eCapDrv.pRegsECAP[module]->ECCTL1.bit.CTRRST1 = ON; // Difference operation
eCapDrv.pRegsECAP[module]->ECCTL1.bit.CTRRST2 = ON; // Difference operation
eCapDrv.pRegsECAP[module]->ECCTL1.bit.CTRRST3 = ON; // Difference operation
eCapDrv.pRegsECAP[module]->ECCTL1.bit.CTRRST4 = ON; // Difference operation
eCapDrv.pRegsECAP[module]->ECCTL1.bit.PRESCALE = OFF; // Use no prescaler
// Synchronization
eCapDrv.pRegsECAP[module]->ECCTL2.bit.SYNCI_EN = ON; // Enable sync in
eCapDrv.pRegsECAP[module]->ECCTL2.bit.SYNCO_SEL = OFF; // Sync in is passed through to sync out
eCapDrv.pRegsECAP[module]->ECCTL1.bit.CAPLDEN = ON; // Enable capture units
eCapDrv.pRegsECAP[module]->ECCTL2.bit.TSCTRSTOP = ON; // Start Counter
eCapDrv.pRegsECAP[module]->ECCTL2.bit.REARM = ON; // Arm one-shot
eCapDrv.pRegsECAP[module]->ECCTL2.bit.CONT_ONESHT = OFF; // Continuous operation mode
}
// Configure APWM
period = (UL)CLKDRV_SYSCLKOUT__MHZ / (UL)SDCLK_FREQ__MHZ;
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL2.bit.CAP_APWM = ON; // eCap5 works as APWM
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL2.bit.SYNCI_EN = OFF; // Disable sync-in option
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL2.bit.SYNCO_SEL = 3U; // Disable sync out signal
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->CAP1 = (period - 1U); // UL set period value
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->CAP2 = (period/2U - 1U); // UL set compare value
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->CAP3 = (period - 1U); // UL set period value
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->CAP4 = (period/2U - 1U); // UL set compare value
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCLR.all = 0xFF; // Clear pending __interrupts.
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL1.bit.FREE_SOFT = 3U; // TSCTR counter is unaffected by emulation suspend (Run Free)
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL1.bit.PRESCALE = OFF; // No prescale
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECCTL2.bit.TSCTRSTOP = ON; // Time Stamp Counter free running
//DEBUG
eCapDrv.pRegsECAP[ECAP_DRV_MODULE_5]->ECEINT.bit.CTR_EQ_PRD = ON; // Interrupt on CTR = PRD
EDIS; // Enable write protection
}
The flag indicating the Interrupt is popping up:
I also found in the c2000 faq that the cla Interrupts do not go through the pie instead they can trigger the Task directly. I don't see this happening. Any help is appreciated!
Thanks!
Alex