Part Number: TMS320F280049
Hello,
My system is the following:
1. PWM SOCA interrupt trigger ADC conversion
// Disable SOCA
EPWM_disableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
// Configure the SOC to occur on the first period event
EPWM_setADCTriggerSource(EPWM1_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_ZERO);
// Set prescale to trigger ADC each 20us (2 periods of PWM)
EPWM_setADCTriggerEventPrescale(EPWM1_BASE, EPWM_SOC_A, 2);
// Start ePWM1, enabling SOCA
EPWM_enableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
// Measure TLoad, pin A1
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0,ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN1, 140);
// Measure IBus, pin A2
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1,ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN2, 140);
// Measure UBus, pin A3
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2,ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN3, 140);
// Measure VLoad is connected to PGA5_IN pin internally connected to A14
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM1_SOCA,
ADC_CH_ADCIN14, 140);
// Set SOC3 to set the interrupt 1 flag of ADC A. Enable the interrupt and make
// sure its flag is cleared.
ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER3);
ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1);
ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
// Enable ADC A interrupt 1
Interrupt_enable(INT_ADCA1);
2. At is turn, interrupt 1 of ADC trigger DMA transfer
DMA_initController();
DMA_setEmulationMode(DMA_EMULATION_STOP);
DMA_configAddresses(DMA_CH1_BASE, (void*)(&adcaRawMeasureSamples[0]), (void*)(&AdcaResultRegs.ADCRESULT0));
DMA_configBurst(DMA_CH1_BASE, sizeof(ADCA_MEASURE_t), DMA_SRC_BURST_STEP, DMA_DEST_BURST_STEP);
DMA_configTransfer(DMA_CH1_BASE, NUM_MEASURE_SAMPLE, DMA_CH1_SRC_TRANSFER_STEP, DMA_DEST_TRANSFER_STEP);
DMA_configMode(DMA_CH1_BASE, DMA_TRIGGER_ADCA1, DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE | DMA_CFG_SIZE_16BIT);
DMA_enableTrigger(DMA_CH1_BASE);
DMA_setInterruptMode(DMA_CH1_BASE, DMA_INT_AT_END);
DMA_enableInterrupt(DMA_CH1_BASE);
DMA_disableOverrunInterrupt(DMA_CH1_BASE);
DMA_clearTriggerFlag(DMA_CH1_BASE);
Interrupt_enable(INT_DMA_CH1);
DMA_startChannel(DMA_CH1_BASE);
3. At the end of DMA transfer ADC result is treated inside DMA channel 1 interrupt
My problem is that my system doesn't works if I don't declare and interrupt function for ADC as following:
Interrupt_register(INT_ADCA1, &adcA1ISR);
static __interrupt void adcA1ISR(void)
{
// Clear the interrupt flag and issue ACK
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
//
// Check if overflow has occurred
//
if(true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1))
{
ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
}
else
{
// Nothing to do
}
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
So I need help to disable ADC interrupt because for me DMA component is in charge to clear ADC interrupt flag and this interrupt is not needed normaly.
Thanks in advance.
Best regards,
Martial