AnsweredAssumed Answered

Injection fails -- sometimes!

Question asked by Andrew Dowd on Apr 12, 2018
Latest reply on Apr 12, 2018 by Andrew Dowd

STM32L151R8 - I'm using the Injection channels with a 4 channel sequence.  The conversion is handled by software and is repeated immediately (on a different set of data).   This works fine for a while. Eventually, the second polling loop fails with a timeout.  After some debugging, I found it always fails on the second polling loop.  Also, when it fails, no amount of waiting will ever make it pass.  (The JEOC bit never goes high).  

 

I am using the regular ADC channels as well, but I don't believe this problem is coupled with the regular channels.  I disabled the trigger to the ADC channels, so no conversions are occurring during this code.  This made no difference.  

 

Injection code:

 

assert(HAL_ADCEx_InjectedStart(&hadc) == HAL_OK); 
NOP();
assert(HAL_ADCEx_InjectedPollForConversion(&hadc,5) == HAL_OK);
for(i=0; i<ADC_INJ_NUMCONV; i++) { 
   data1[i] = HAL_ADCEx_InjectedGetValue(&hadc,ADC_INJECTED_RANK_1+i);
}
// Change external MUX to put new data into injection inputs
assert(HAL_ADCEx_InjectedStart(&hadc) == HAL_OK);
NOP();
assert(HAL_ADCEx_InjectedPollForConversion(&hadc,5) == HAL_OK);    //Fails! 
for(i=0 ; i<ADC_INJ_NUMCONV; i++) { 
   data2[i] = HAL_ADCEx_InjectedGetValue(&hadc,ADC_INJECTED_RANK_1+i);
}

 

Note, as a workaround, I tried replacing the polling all with the following:

 

void inject_wait(void) {
   while(HAL_ADCEx_InjectedPollForConversion(&hadc,2) != HAL_OK) {
      assert(HAL_ADCEx_InjectedStart(&hadc) == HAL_OK);
   }
}

 

This basically keeps trying to start the injection conversion, until it succeeds.  This never causes an assertion, but the data conversion is not done correctly.  What I see is data from the previous conversion.  It's like the injection converter needs a break between executions (?).  

Outcomes