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.

TMS320F28035: CLA cannot be triggered

Part Number: TMS320F28035


Hi, I'm writing a program that uses ePWM7 ADCSOCA to trigger SOC1 and then ADCINT1. In ADCISR, CLA1TASK1 is triggered through software __asm("  IACK  #0x0001"); 

In this case, ADCINT1 can be triggered and executed, but CLA1TASK1 cannot be triggered.

If I configure ADCINT1 to be triggered by software, then both ADCINT and CLA1TASK1 can be triggered and executed.

What may cause the problem?

The code for ePWM7 ADCSOCA to trigger SOC1 and then ADCINT1 is shown below:

 //ePWM7 initialization

void EPWM7_Config( USHORT period )

{

           EPwm7Regs.ETSEL.bit.SOCAEN         = 1;                     // Enable SOC on A group

           EPwm7Regs.ETSEL.bit.SOCASEL       = 4;                     // Select SOC from from CPMA on upcount

           EPwm7Regs.ETPS.bit.SOCAPRD         = 1;                     // Generate pulse on 1st event

 

           EPwm7Regs.CMPA.half.CMPA = period/2;           // Set compare A value

           EPwm7Regs.TBPRD                              = period;          // Set period for ePWM1

           EPwm7Regs.TBCTL.bit.CTRMODE = 0;                     // count up and start

 

           UNPROTECT_REGS( );

           SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;

           PROTECT_REGS( );

}

 

//ADC initialization

void Adc_SOC_Init( void )

{

             EALLOW;

             PieVectTable.ADCINT1 = &adc_isr; //映射ADC中断

             EDIS;

 

             InitAdc();

             PieCtrlRegs.PIEIER1.bit.INTx1 = 1;   //使能PIE级INT1.1中断

             IER |= M_INT1;                       //使能CPU级INT1中断

           //   EINT;                                //使能总中断

 

             EALLOW;

              AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;    //转换完成前一个ADC时钟周期产生EOC

              AdcRegs.INTSEL1N2.bit.INT1E     = 1;    //使能ADCINT1

              AdcRegs.INTSEL1N2.bit.INT1CONT  = 0;    //关闭连续模式

              AdcRegs.INTSEL1N2.bit.INT1SEL   = 1;    //将ADCINT1映射到EOC1

 

              AdcRegs.ADCSOC0CTL.bit.TRIGSEL  = 0x11;  //epwm7A 触发

              AdcRegs.ADCSOC1CTL.bit.TRIGSEL  = 0x11;  //

                      AdcRegs.ADCSOC2CTL.bit.TRIGSEL  = 0x11;  //

                      AdcRegs.ADCSOC3CTL.bit.TRIGSEL  = 0x11;

                      AdcRegs.ADCSOC4CTL.bit.TRIGSEL  = 0x11;

                      AdcRegs.ADCSOC5CTL.bit.TRIGSEL  = 0x11;

                      AdcRegs.ADCSOC6CTL.bit.TRIGSEL  = 0x11;

                      AdcRegs.ADCSOC7CTL.bit.TRIGSEL  = 0x11;

                      AdcRegs.ADCSOC8CTL.bit.TRIGSEL  = 0x11;

                      AdcRegs.ADCSOC9CTL.bit.TRIGSEL  = 0x11;

                      AdcRegs.ADCSOC10CTL.bit.TRIGSEL  = 0x11;

                      AdcRegs.ADCSOC11CTL.bit.TRIGSEL  = 0x11;

                      AdcRegs.ADCSOC12CTL.bit.TRIGSEL  = 0x11;

                      AdcRegs.ADCSOC13CTL.bit.TRIGSEL  = 0x11;

 

 

                     AdcRegs.ADCSOC0CTL.bit.CHSEL            = 8;    //B0  DC V1

                     AdcRegs.ADCSOC1CTL.bit.CHSEL            = 9;    //B1  DC V2

                     AdcRegs.ADCSOC2CTL.bit.CHSEL            = 10;  //B2  DC V3

                     AdcRegs.ADCSOC3CTL.bit.CHSEL            = 11;  //B3  DC V4

                     AdcRegs.ADCSOC4CTL.bit.CHSEL            = 12;  //B4  DC V5

                     AdcRegs.ADCSOC5CTL.bit.CHSEL            = 13;  //B5  DC V6

                     AdcRegs.ADCSOC6CTL.bit.CHSEL            = 14;  //B6  DC V7

 

                     AdcRegs.ADCSOC7CTL.bit.CHSEL            = 7;    //A7  DC I1

                     AdcRegs.ADCSOC8CTL.bit.CHSEL            = 6;    //A6  DC I2

                     AdcRegs.ADCSOC9CTL.bit.CHSEL            = 5;    //A5  DC I3

                     AdcRegs.ADCSOC10CTL.bit.CHSEL            = 4;    //A4  DC I4

                     AdcRegs.ADCSOC11CTL.bit.CHSEL            = 3;    //A3  DC I5

                     AdcRegs.ADCSOC12CTL.bit.CHSEL            = 2;    //A2  DC I6

                     AdcRegs.ADCSOC13CTL.bit.CHSEL            = 1;    //A1  DC I7

 

 

                     AdcRegs.ADCSOC0CTL.bit.ACQPS            = 6;    //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                     AdcRegs.ADCSOC1CTL.bit.ACQPS            = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                     AdcRegs.ADCSOC2CTL.bit.ACQPS            = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                     AdcRegs.ADCSOC3CTL.bit.ACQPS            = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                     AdcRegs.ADCSOC4CTL.bit.ACQPS            = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                     AdcRegs.ADCSOC5CTL.bit.ACQPS            = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                     AdcRegs.ADCSOC6CTL.bit.ACQPS            = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                     AdcRegs.ADCSOC7CTL.bit.ACQPS            = 6;    //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                     AdcRegs.ADCSOC8CTL.bit.ACQPS            = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                     AdcRegs.ADCSOC9CTL.bit.ACQPS            = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                      AdcRegs.ADCSOC10CTL.bit.ACQPS = 6;           //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                      AdcRegs.ADCSOC11CTL.bit.ACQPS = 6;           //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                      AdcRegs.ADCSOC12CTL.bit.ACQPS = 6;           //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

                      AdcRegs.ADCSOC13CTL.bit.ACQPS = 6;           //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

              EDIS;

}

 

//ADC中断服务函数

interrupt void  adc_isr(void)

{

 

           unsigned char chan;

 

           Measurement_Vd[0] = AdcResult.ADCRESULT0; //

           Measurement_Vd[1] = AdcResult.ADCRESULT1;

           Measurement_Vd[2] = AdcResult.ADCRESULT2;

           Measurement_Vd[3] = AdcResult.ADCRESULT3;

           Measurement_Vd[4] = AdcResult.ADCRESULT4;

           Measurement_Vd[5] = AdcResult.ADCRESULT5;

           //Measurement_Vd[6] = AdcResult.ADCRESULT6;

 

           Measurement_Id[0] = AdcResult.ADCRESULT7;

           Measurement_Id[1] = AdcResult.ADCRESULT8;

           Measurement_Id[2] = AdcResult.ADCRESULT9;

           Measurement_Id[3] = AdcResult.ADCRESULT10;

           Measurement_Id[4] = AdcResult.ADCRESULT11;

           Measurement_Id[5] = AdcResult.ADCRESULT12;

//        Measurement_Id[6] = AdcResult.ADCRESULT13;

////

 

           __asm("  IACK  #0x0001"); //强制触发CLA1

 

            AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;     //清除EOC1信号(ADCINT1)

            PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;   //写1清0,写0无效

  return;

}

 

//:

void main(void)

{

  //other configuration

 ...

  Adc_SOC_Init();  //初始化ADC

  EPWM7_Config( KSwPrdCnst*10 );; // 初始化EPWM7  KSwPrdCnst = 600

... //其他函数

}