I'm having a little trouble with the HSADC. What I am trying to do is use HSADC0 and HSADC1 to get 2 simultaneous conversions on each ADC running both ADCs at the same time to get 4 simultaneous conversions.
I followed the demo twrkv58f220m_hsadc_dual_parallel_conversion. The only difference I made was that I am using both HSADCs and also I don't want differential conversions so I have enableDifferentialPair false on each channel.
This is my setup:
/* enable clock for ADC0 and HS ADC modules modules*/
CLOCK_EnableClock(kCLOCK_Adc0);
CLOCK_EnableClock(kCLOCK_Hsadc0);
CLOCK_EnableClock(kCLOCK_Hsadc1);
/* Initialize the HSADC common digital control.
* "kHSADC_DualConverterWorkAsTriggeredParallel" and simultaneous mode is used in this case. The two conversion
* sequence would be executed by each converter at the same time. Both converter shares the converter A's control
* logic such as start, stop, DMA enable, sync input etc.
*/
HSADC_GetDefaultConfig(&hsadcConfigStruct);
HSADC_Init(HSADC0_BASEADDR, &hsadcConfigStruct);
HSADC_Init(HSADC1_BASEADDR, &hsadcConfigStruct);
/* Configure each converter. */
HSADC_GetDefaultConverterConfig(&hsadcConverterConfigStruct);
/* Enable the calibration in power up period. */
hsadcConverterConfigStruct.powerUpCalibrationModeMask = (kHSADC_CalibrationModeSingleEnded);
HSADC_SetConverterConfig(HSADC0_BASEADDR, kHSADC_ConverterA | kHSADC_ConverterB, &hsadcConverterConfigStruct);
HSADC_SetConverterConfig(HSADC1_BASEADDR, kHSADC_ConverterA | kHSADC_ConverterB, &hsadcConverterConfigStruct);
/* Enable the power for each converter. */
HSADC_EnableConverterPower(HSADC0_BASEADDR, kHSADC_ConverterA | kHSADC_ConverterB, true);
HSADC_EnableConverterPower(HSADC1_BASEADDR, kHSADC_ConverterA | kHSADC_ConverterB, true);
while (
(kHSADC_ConverterAPowerDownFlag | kHSADC_ConverterBPowerDownFlag) ==
((kHSADC_ConverterAPowerDownFlag | kHSADC_ConverterBPowerDownFlag) & HSADC_GetStatusFlags(HSADC0_BASEADDR)))
{
}
while (
(kHSADC_ConverterAPowerDownFlag | kHSADC_ConverterBPowerDownFlag) ==
((kHSADC_ConverterAPowerDownFlag | kHSADC_ConverterBPowerDownFlag) & HSADC_GetStatusFlags(HSADC1_BASEADDR)))
{
}
/* Wait the calibration process complete. None End of Scan flag will be set after power up calibration process. */
while ((kHSADC_ConverterAEndOfCalibrationFlag | kHSADC_ConverterBEndOfCalibrationFlag) !=
((kHSADC_ConverterAEndOfCalibrationFlag | kHSADC_ConverterBEndOfCalibrationFlag) &
HSADC_GetStatusFlags(HSADC0_BASEADDR)))
{
}
while ((kHSADC_ConverterAEndOfCalibrationFlag | kHSADC_ConverterBEndOfCalibrationFlag) !=
((kHSADC_ConverterAEndOfCalibrationFlag | kHSADC_ConverterBEndOfCalibrationFlag) &
HSADC_GetStatusFlags(HSADC1_BASEADDR)))
{
}
HSADC_ClearStatusFlags(HSADC0_BASEADDR,
(kHSADC_ConverterAEndOfCalibrationFlag | kHSADC_ConverterBEndOfCalibrationFlag));
HSADC_ClearStatusFlags(HSADC1_BASEADDR,
(kHSADC_ConverterAEndOfCalibrationFlag | kHSADC_ConverterBEndOfCalibrationFlag));
/* Make each converter exit stop mode. */
HSADC_EnableConverter(HSADC0_BASEADDR, kHSADC_ConverterA | kHSADC_ConverterB, true);
HSADC_EnableConverter(HSADC1_BASEADDR, kHSADC_ConverterA | kHSADC_ConverterB, true);
ConfigureFastADCSamples();

void ConfigureFastADCSamples(void)
{
/* Configure the samples. */
HSADC_GetDefaultSampleConfig(&hsadcSampleConfigStruct);
/* For converter HSADC0 Conv A. */
hsadcSampleConfigStruct.channelNumber = DCBUSV_HSADC0A_CH6_CHANNEL_NUM1;
hsadcSampleConfigStruct.channel67MuxNumber = DCBUSV_HSADC0A_CH6_CHANNEL67_NUM1_MUXNUM;
hsadcSampleConfigStruct.enableDifferentialPair = DCBUSV_HSADC0A_CH6_CHANNEL67_NUM1_ENABLE_DIFF;
HSADC_SetSampleConfig(HSADC0_BASEADDR, DCBUSV_HSADC0A_SAMPLE_NUM, &hsadcSampleConfigStruct);
/* For converter HSADC0 Conv B. */
/* For converter B.
* In HSADC_SetSampleConfig(), the channel number 0~7 represents input 0~7 of converter A and channel number 8~15
* represents input 0~7 of converter B.
*/
hsadcSampleConfigStruct.channelNumber = (PHC_HSADC0B_CH2_CHANNEL_NUM1 + 8U);
hsadcSampleConfigStruct.channel67MuxNumber = PHC_HSADC0B_CH2_CHANNEL67_NUM1_MUXNUM;
hsadcSampleConfigStruct.enableDifferentialPair = PHC_HSADC0B_CH2_CHANNEL67_NUM1_ENABLE_DIFF;
HSADC_SetSampleConfig(HSADC0_BASEADDR, PHC_HSADC0B_SAMPLE_NUM, &hsadcSampleConfigStruct);
/* For converter HSADC1 Conv A. */
hsadcSampleConfigStruct.channelNumber = PHA_HSADC1A_CH2_CHANNEL_NUM1;
hsadcSampleConfigStruct.channel67MuxNumber = PHA_HSADC1A_CH2_CHANNEL67_NUM1_MUXNUM;
hsadcSampleConfigStruct.enableDifferentialPair = PHA_HSADC1A_CH2_CHANNEL67_NUM1_ENABLE_DIFF;
HSADC_SetSampleConfig(HSADC1_BASEADDR, PHA_HSADC1A_SAMPLE_NUM, &hsadcSampleConfigStruct);
/* For converter HSADC1 Conv B. */
/* For converter B.
* In HSADC_SetSampleConfig(), the channel number 0~7 represents input 0~7 of converter A and channel number 8~15
* represents input 0~7 of converter B.
*/
hsadcSampleConfigStruct.channelNumber = (PHB_HSADC1B_CH2_CHANNEL_NUM1 + 8U);
hsadcSampleConfigStruct.channel67MuxNumber = PHB_HSADC1B_CH2_CHANNEL67_NUM1_MUXNUM;
hsadcSampleConfigStruct.enableDifferentialPair = PHB_HSADC1B_CH2_CHANNEL67_NUM1_ENABLE_DIFF;
HSADC_SetSampleConfig(HSADC1_BASEADDR, PHB_HSADC1B_SAMPLE_NUM, &hsadcSampleConfigStruct);
/* Enable the sample slot. */
uint16_t sampleMask = HSADC_SAMPLE_MASK(0U) /* For converter A. */
| HSADC_SAMPLE_MASK(8U); /* For converter B. */
HSADC_EnableSample(HSADC0_BASEADDR, sampleMask, true);
HSADC_EnableSample(HSADC0_BASEADDR, (uint16_t)(~sampleMask), false); /* Disable other sample slots. */
HSADC_EnableSample(HSADC1_BASEADDR, sampleMask, true);
HSADC_EnableSample(HSADC1_BASEADDR, (uint16_t)(~sampleMask), false); /* Disable other sample slots. */
}
I have a FTM keeping a 250us interrupt for me and am kicking off the ADC conversion there:

Then to read ADCs I am doing this:

Do you see anything wrong I did in the setup? What is strange is that these are 12 bit ADCs and I seem to be getting a 16 bit number returned from the function:
