Try this code, ADC and DAC in Free Running mode:
/*******************************************************************/
/* Free Run ADC conversions of 1 analog input (A0) */
/* Free Run DAC output on channel 1 (DAC1) */
/*******************************************************************/
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
adc_setup();
dac_setup();
}
void loop()
{
}
/************* Configure adc_setup function *******************/
void adc_setup() {
PMC->PMC_PCER1 |= PMC_PCER1_PID37; // ADC power ON
ADC->ADC_CR = ADC_CR_SWRST; // Reset ADC
ADC->ADC_MR |= ADC_MR_TRGEN_DIS // Hardware trigger disable
| ADC_MR_FREERUN
| ADC_MR_PRESCAL(0); // Or PRESCAL (1) to limit to 21 MHz !
ADC->ADC_ACR = ADC_ACR_IBCTL(0b01); // For frequencies > 500 KHz
ADC->ADC_IER = ADC_IER_EOC7; // End Of Conversion interrupt enable for channel 7
NVIC_EnableIRQ(ADC_IRQn); // Enable ADC interrupt
ADC->ADC_CHER = ADC_CHER_CH7; // Enable Channel 7 = A0
}
void ADC_Handler() {
static uint32_t Count;
DACC->DACC_CDR = ADC->ADC_CDR[7]; // Reading ADC->ADC_CDR[i] clears EOCi bit
// For debugging only
if (Count++ == 1000000) {
Count = 0;
PIOB->PIO_ODSR ^= PIO_ODSR_P27;
}
}
/************* Configure adc_setup function *******************/
void dac_setup ()
{
PMC->PMC_PCER1 = PMC_PCER1_PID38; // DACC power ON
DACC->DACC_CR = DACC_CR_SWRST ; // Reset DACC
DACC->DACC_MR = DACC_MR_TRGEN_DIS // Hardware trigger disable, Free Run mode
| DACC_MR_USER_SEL_CHANNEL1 // select channel 1
| DACC_MR_REFRESH (1)
| DACC_MR_STARTUP_8
| DACC_MR_MAXS;
DACC->DACC_CHER = DACC_CHER_CH1; // enable channel 1 = DAC1
}