I see in the SDK sample for software triggered ADC_ETC, it triggers the conversion for ADC1 only.
The trigger also has a sync mode to trigger both ADC1 and ADC2 simultaneously that I would like to try.
I am able to get the "done" interrupts triggered for both ADC1 and ADC2 from a single trigger once, but after that it doesn't trigger again.
Also the results output isn't as expected for both converters. I'm not sure how to set up the chain length and channels for the ADC_ETC as the SDK API reference manual seems to be missing quite a bit for ADC_ETC module.
Actually I don't even understand what a "chain" is, as it isn't documented well. Do I need two chains when using "sync" mode? I imagine my error is somewhere in the TriggerChainConfig sections.
Here is my modified sample code for both converters:
#include "fsl_debug_console.h"
#include "board.h"
#include "fsl_adc.h"
#include "fsl_adc_etc.h"
#include "fsl_common.h"
#include "pin_mux.h"
#include "clock_config.h"
#define DEMO_ADC_BASE ADC1
#define DEMO_ADC_USER_CHANNEL 9U
#define DEMO_ADC_CHANNEL_GROUP 0U
#define DEMO_ADC2_BASE ADC2
#define DEMO_ADC2_USER_CHANNEL 10U
#define DEMO_ADC2_CHANNEL_GROUP 0U
#define DEMO_ADC_ETC_BASE ADC_ETC
#define DEMO_ADC_ETC_CHAIN_LENGTH 1U
#define DEMO_ADC_ETC_CHANNEL 15U
#define EXAMPLE_ADC_ETC_DONE0_Handler ADC_ETC_IRQ0_IRQHandler
#define EXAMPLE_ADC_ETC_DONE1_Handler ADC_ETC_IRQ1_IRQHandler
void ADC_Configuration(void);
volatile bool g_AdcConversionDoneFlag;
volatile bool g_AdcConversionDoneFlag2;
volatile uint32_t g_AdcConversionValue;
volatile uint32_t g_AdcConversionValue2;
void EXAMPLE_ADC_ETC_DONE0_Handler(void)
{
ADC_ETC_ClearInterruptStatusFlags(DEMO_ADC_ETC_BASE, kADC_ETC_Trg0TriggerSource, kADC_ETC_Done0StatusFlagMask);
g_AdcConversionDoneFlag = true;
g_AdcConversionValue = ADC_ETC_GetADCConversionValue(DEMO_ADC_ETC_BASE, 0U, 0U);
}
void EXAMPLE_ADC_ETC_DONE1_Handler(void)
{
ADC_ETC_ClearInterruptStatusFlags(DEMO_ADC_ETC_BASE, kADC_ETC_Trg0TriggerSource, kADC_ETC_Done1StatusFlagMask);
g_AdcConversionDoneFlag2 = true;
g_AdcConversionValue2 = ADC_ETC_GetADCConversionValue(DEMO_ADC_ETC_BASE, 0U, 1U);
}
int main(void)
{
adc_etc_config_t adcEtcConfig;
adc_etc_trigger_config_t adcEtcTriggerConfig;
adc_etc_trigger_chain_config_t adcEtcTriggerChainConfig;
BOARD_ConfigMPU();
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
PRINTF("ADC_ETC_Software_Trigger_Conv Example Start!\r\n");
ADC_Configuration();
ADC_ETC_GetDefaultConfig(&adcEtcConfig);
adcEtcConfig.XBARtriggerMask = 1U;
ADC_ETC_Init(DEMO_ADC_ETC_BASE, &adcEtcConfig);
adcEtcTriggerConfig.enableSyncMode = true;
adcEtcTriggerConfig.enableSWTriggerMode = true;
adcEtcTriggerConfig.triggerChainLength = DEMO_ADC_ETC_CHAIN_LENGTH;
adcEtcTriggerConfig.triggerPriority = 0U;
adcEtcTriggerConfig.sampleIntervalDelay = 0U;
adcEtcTriggerConfig.initialDelay = 0U;
ADC_ETC_SetTriggerConfig(DEMO_ADC_ETC_BASE, 0U, &adcEtcTriggerConfig);
adcEtcTriggerChainConfig.enableB2BMode = false;
adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U
<< DEMO_ADC_CHANNEL_GROUP;
adcEtcTriggerChainConfig.ADCChannelSelect =
DEMO_ADC_ETC_CHANNEL;
adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done0InterruptEnable;
ADC_ETC_SetTriggerChainConfig(DEMO_ADC_ETC_BASE, 0U, 0U,
&adcEtcTriggerChainConfig);
adcEtcTriggerChainConfig.enableB2BMode = false;
adcEtcTriggerChainConfig.ADCHCRegisterSelect = 1U
<< DEMO_ADC_CHANNEL_GROUP;
adcEtcTriggerChainConfig.ADCChannelSelect =
DEMO_ADC_ETC_CHANNEL;
adcEtcTriggerChainConfig.InterruptEnable = kADC_ETC_Done1InterruptEnable;
ADC_ETC_SetTriggerChainConfig(DEMO_ADC_ETC_BASE, 0U, 1U,
&adcEtcTriggerChainConfig);
EnableIRQ(ADC_ETC_IRQ0_IRQn);
EnableIRQ(ADC_ETC_IRQ1_IRQn);
while (1)
{
g_AdcConversionDoneFlag = false;
g_AdcConversionDoneFlag2 = false;
PRINTF("Press any key to get user channel's ADC value.\r\n");
GETCHAR();
ADC_ETC_DoSoftwareTrigger(DEMO_ADC_ETC_BASE, 0U);
while (!g_AdcConversionDoneFlag && !g_AdcConversionDoneFlag2)
{
}
PRINTF("ADC conversion val1 is %d\r\n", g_AdcConversionValue);
PRINTF("ADC conversion val2 is %d\r\n", g_AdcConversionValue2);
}
}
void ADC_Configuration(void)
{
adc_config_t adcConfig;
adc_channel_config_t adcChannelConfigStruct;
ADC_GetDefaultConfig(&adcConfig);
ADC_Init(DEMO_ADC_BASE, &adcConfig);
ADC_Init(DEMO_ADC2_BASE, &adcConfig);
ADC_EnableHardwareTrigger(DEMO_ADC_BASE, true);
ADC_EnableHardwareTrigger(DEMO_ADC2_BASE, true);
adcChannelConfigStruct.channelNumber = DEMO_ADC_USER_CHANNEL;
adcChannelConfigStruct.enableInterruptOnConversionCompleted = false;
ADC_SetChannelConfig(DEMO_ADC_BASE, DEMO_ADC_CHANNEL_GROUP, &adcChannelConfigStruct);
if (kStatus_Success == ADC_DoAutoCalibration(DEMO_ADC_BASE))
{
PRINTF("ADC_DoAutoCalibration() Done.\r\n");
}
else
{
PRINTF("ADC_DoAutoCalibration() Failed.\r\n");
}
adcChannelConfigStruct.channelNumber = DEMO_ADC2_USER_CHANNEL;
adcChannelConfigStruct.enableInterruptOnConversionCompleted = false;
ADC_SetChannelConfig(DEMO_ADC2_BASE, DEMO_ADC2_CHANNEL_GROUP, &adcChannelConfigStruct);
if (kStatus_Success == ADC_DoAutoCalibration(DEMO_ADC2_BASE))
{
PRINTF("ADC2_DoAutoCalibration() Done.\r\n");
}
else
{
PRINTF("ADC2_DoAutoCalibration() Failed.\r\n");
}
}