Skip to content

Bug in adc_configure_trigger for Arduino Due #1819

Closed
@madrang

Description

@madrang

In https://github.com/arduino/Arduino/blob/ide-1.5.x/hardware/arduino/sam/system/libsam/source/adc.c

/**
 * \brief Configure conversion trigger and free run mode.
 *
 * \param p_adc Pointer to an ADC instance.
 * \param trigger Conversion trigger.
 * \param uc_freerun ADC_MR_FREERUN_ON enables freerun mode,
 * ADC_MR_FREERUN_OFF disables freerun mode.
 *
 */
void adc_configure_trigger(Adc *p_adc, const enum adc_trigger_t trigger,
                uint8_t uc_freerun)
{
        p_adc->ADC_MR |= trigger | ((uc_freerun << 7) & ADC_MR_FREERUN);
}

ADC_MR_FREERUN_ON == 0x80
ADC_MR_FREERUN_OFF == 0x00

Running the following on a due show the problem

  Serial.begin(115200);

  Serial.print("ADC->ADC_MR == ");
  Serial.println(ADC->ADC_MR);

  //Should enable FreeRun but it will not.
  adc_configure_trigger(ADC, ADC_TRIG_SW, ADC_MR_FREERUN_ON);

  Serial.print("ADC->ADC_MR == ");
  Serial.println(ADC->ADC_MR);

  //This call properly enables FreeRun
  ADC->ADC_MR |= ADC_MR_FREERUN_ON;      // DAC in free running mode.

  Serial.print("ADC->ADC_MR == ");
  Serial.println(ADC->ADC_MR);

  //This should disable FreeRun but it will not.
  adc_configure_trigger(ADC, ADC_TRIG_SW, ADC_MR_FREERUN_OFF);

  Serial.print("ADC->ADC_MR == ");
  Serial.println(ADC->ADC_MR);

Edit: Updated my sketch to include

  int ADCMR = ADC->ADC_MR;

  adc_configure_trigger(ADC, ADC_TRIG_SW, ADC_MR_FREERUN_ON); // DAC in free running mode.

  //Temporary bug fix
  if(ADCMR == ADC->ADC_MR) {
    Serial.println("Bug with adc_configure_trigger, See https://github.com/arduino/Arduino/issues/1819 for more information.");
    ADC->ADC_MR |= ADC_MR_FREERUN_ON;  // DAC in free running mode.
  }

Metadata

Metadata

Assignees

Labels

Board: Arduino DueApplies only to the DueComponent: CoreRelated to the code for the standard Arduino API

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions