Maxim Integrated MAX11131 SPI 12-bit 16-channel ADC with SampleSet

Dependents:   MAX11131BOB_Tester MAX11131BOB_12bit_16ch_SampleSet_SPI_ADC MAX11131BOB_Serial_Tester

Revision:
0:f7d706d2904d
Child:
1:77f1ee332e4a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MAX11131.h	Wed Jun 05 02:16:46 2019 +0000
@@ -0,0 +1,1721 @@
+// /*******************************************************************************
+// * Copyright (C) 2019 Maxim Integrated Products, Inc., All Rights Reserved.
+// *
+// * Permission is hereby granted, free of charge, to any person obtaining a
+// * copy of this software and associated documentation files (the "Software"),
+// * to deal in the Software without restriction, including without limitation
+// * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// * and/or sell copies of the Software, and to permit persons to whom the
+// * Software is furnished to do so, subject to the following conditions:
+// *
+// * The above copyright notice and this permission notice shall be included
+// * in all copies or substantial portions of the Software.
+// *
+// * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+// * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+// * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// * OTHER DEALINGS IN THE SOFTWARE.
+// *
+// * Except as contained in this notice, the name of Maxim Integrated
+// * Products, Inc. shall not be used except as stated in the Maxim Integrated
+// * Products, Inc. Branding Policy.
+// *
+// * The mere transfer of this software does not imply any licenses
+// * of trade secrets, proprietary technology, copyrights, patents,
+// * trademarks, maskwork rights, or any other form of intellectual
+// * property whatsoever. Maxim Integrated Products, Inc. retains all
+// * ownership rights.
+// *******************************************************************************
+// */
+// *********************************************************************
+// @file MAX11131.h
+// *********************************************************************
+// Header file
+// DO NOT EDIT; except areas designated "CUSTOMIZE". Automatically generated file.
+// generated by XMLSystemOfDevicesToMBED.py
+// System Name = ExampleSystem
+// System Description = Device driver example
+// Device Name = MAX11131
+// Device Description = 3Msps, Low-Power, Serial SPI 12-Bit, 16-Channel, Differential/Single-Ended Input, SAR ADC
+// Device Manufacturer = Maxim Integrated
+// Device PartNumber = MAX11131ATI+
+// Device RegValue_Width = DataWidth16bit_HL
+//
+// ADC MaxOutputDataRate = 3Msps
+// ADC NumChannels = 16
+// ADC ResolutionBits = 12
+//
+// SPI CS = ActiveLow
+// SPI FrameStart = CS
+// SPI CPOL = 1
+// SPI CPHA = 1
+// SPI MOSI and MISO Data are both stable on Rising edge of SCLK
+// SPI SCLK Idle High
+// SPI SCLKMaxMHz = 48
+// SPI SCLKMinMHz = 0.48
+//
+
+
+// Prevent multiple declaration
+#ifndef __MAX11131_H__
+#define __MAX11131_H__
+
+#include "mbed.h"
+
+// CODE GENERATOR: conditional defines
+//----------------------------------------
+// Global setting for all channels: ADC_CONFIGURATION.REFSEL
+//
+// CUSTOMIZE: select one of the following options
+// either by uncommenting in this file or define at the project level
+//--------------------
+// external single-ended reference
+//~ #define REFSEL_0 	1
+//
+//--------------------
+// external differential reference (For the 16-channel chips: channel AIN15 is unavailable, the pin is assigned to REF-.)
+//~ #define REFSEL_1 	1
+//
+//--------------------
+//
+// Default settings if not defined at project level
+#ifndef REFSEL_0
+# ifndef REFSEL_1
+#  define REFSEL_0 	1
+#  define REFSEL_1 	0
+# endif // REFSEL_1
+#endif // REFSEL_0
+//
+// (optional diagnostic) pragma message the active setting
+#if REFSEL_0
+//~ #  pragma message("REFSEL_0: external single-ended reference")
+#endif // REFSEL_0
+#if REFSEL_1
+//~ #  pragma message("REFSEL_1: external differential reference (For the 16-channel chips: channel AIN15 is unavailable, the pin is assigned to REF-.)")
+#endif // REFSEL_1
+//
+// Validate the REFSEL_0 setting
+#if REFSEL_0
+# if REFSEL_1
+#  error("cannot have both REFSEL_0 and REFSEL_1; choose one")
+# endif // REFSEL_1
+#endif // REFSEL_0
+
+//----------------------------------------
+// Global setting for all channels: UNIPOLAR.PDIFF_COMM
+//
+// CUSTOMIZE: select one of the following options
+// either by uncommenting in this file or define at the project level
+//--------------------
+// all single-ended channels are pseudo-differential with REF- as common
+//~ #define PDIFF_COMM_1 	1
+//
+//--------------------
+// all single-ended channels use GND as common
+//~ #define PDIFF_COMM_0 	1
+//
+//--------------------
+//
+// Default settings if not defined at project level
+#ifndef PDIFF_COMM_1
+# ifndef PDIFF_COMM_0
+#  define PDIFF_COMM_1 	0
+#  define PDIFF_COMM_0 	1
+# endif // PDIFF_COMM_0
+#endif // PDIFF_COMM_1
+//
+// (optional diagnostic) pragma message the active setting
+#if PDIFF_COMM_1
+//~ #  pragma message("PDIFF_COMM_1: all single-ended channels are pseudo-differential with REF- as common")
+#endif // PDIFF_COMM_1
+#if PDIFF_COMM_0
+//~ #  pragma message("PDIFF_COMM_0: all single-ended channels use GND as common")
+#endif // PDIFF_COMM_0
+//
+// Validate the PDIFF_COMM_1 setting
+#if PDIFF_COMM_1
+# if PDIFF_COMM_0
+#  error("cannot have both PDIFF_COMM_1 and PDIFF_COMM_0; choose one")
+# endif // PDIFF_COMM_0
+#endif // PDIFF_COMM_1
+
+//----------------------------------------
+// ADC Channels AIN0, AIN1
+//
+// CUSTOMIZE: select one of the following options
+// either by uncommenting in this file or define at the project level
+//--------------------
+// ADC Channels AIN0, AIN1 = Differential Unipolar (AIN0 > AIN1)
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN0, AIN1 are a Differential pair using Unipolar transfer function.
+// AIN0 voltage must always be between 0 and VREF.
+// AIN1 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_0_1_DifferentialUnipolar 	1
+//
+//--------------------
+// ADC Channels AIN0, AIN1 = Differential Bipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN0, AIN1 are a Differential pair using Bipolar transfer function with range ±½Vref
+// AIN0 voltage must always be between 0 and VREF.
+// AIN1 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_0_1_DifferentialBipolarFSVref 	1
+//
+//--------------------
+// ADC Channels AIN0, AIN1 = Differential Bipolar
+// Full Scale = 2 * VREF
+// Voltage per LSB count = VREF/2048
+// AIN0, AIN1 are a Differential pair using Bipolar transfer function with range ±Vref
+// AIN0 voltage must always be between 0 and VREF.
+// AIN1 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_0_1_DifferentialBipolarFS2Vref 	1
+//
+//--------------------
+// ADC Channels AIN0, AIN1 = Both Single-Ended, Unipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN0 is a Single-Ended input using Unipolar transfer function.
+// AIN1 is a Single-Ended input using Unipolar transfer function.
+// If PDIFF_COM_1, both are Pseudo-Differential with REF- as common.
+// AIN0 voltage must always be between 0 and VREF.
+// AIN1 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_0_1_SingleEnded 	1
+//
+//--------------------
+//
+// Default settings if not defined at project level
+#ifndef AIN_0_1_DifferentialUnipolar
+# ifndef AIN_0_1_DifferentialBipolarFSVref
+#  ifndef AIN_0_1_DifferentialBipolarFS2Vref
+#   ifndef AIN_0_1_SingleEnded
+#    define AIN_0_1_DifferentialUnipolar 	0
+#    define AIN_0_1_DifferentialBipolarFSVref 	0
+#    define AIN_0_1_DifferentialBipolarFS2Vref 	0
+#    define AIN_0_1_SingleEnded 	1
+#   endif // AIN_0_1_SingleEnded
+#  endif // AIN_0_1_DifferentialBipolarFS2Vref
+# endif // AIN_0_1_DifferentialBipolarFSVref
+#endif // AIN_0_1_DifferentialUnipolar
+//
+// (optional diagnostic) pragma message the active setting
+#if AIN_0_1_DifferentialUnipolar
+//~ #  pragma message("AIN_0_1_DifferentialUnipolar: ADC Channels AIN0, AIN1 = Differential Unipolar (AIN0 > AIN1)")
+#endif // AIN_0_1_DifferentialUnipolar
+#if AIN_0_1_DifferentialBipolarFSVref
+//~ #  pragma message("AIN_0_1_DifferentialBipolarFSVref: ADC Channels AIN0, AIN1 = Differential Bipolar")
+#endif // AIN_0_1_DifferentialBipolarFSVref
+#if AIN_0_1_DifferentialBipolarFS2Vref
+//~ #  pragma message("AIN_0_1_DifferentialBipolarFS2Vref: ADC Channels AIN0, AIN1 = Differential Bipolar")
+#endif // AIN_0_1_DifferentialBipolarFS2Vref
+#if AIN_0_1_SingleEnded
+//~ #  pragma message("AIN_0_1_SingleEnded: ADC Channels AIN0, AIN1 = Both Single-Ended, Unipolar")
+#endif // AIN_0_1_SingleEnded
+//
+// Validate the AIN_0_1_DifferentialUnipolar setting
+#if AIN_0_1_DifferentialUnipolar
+# if AIN_0_1_DifferentialBipolarFSVref
+#  error("cannot have both AIN_0_1_DifferentialUnipolar and AIN_0_1_DifferentialBipolarFSVref; choose one")
+# endif // AIN_0_1_DifferentialBipolarFSVref
+# if AIN_0_1_DifferentialBipolarFS2Vref
+#  error("cannot have both AIN_0_1_DifferentialUnipolar and AIN_0_1_DifferentialBipolarFS2Vref; choose one")
+# endif // AIN_0_1_DifferentialBipolarFS2Vref
+# if AIN_0_1_SingleEnded
+#  error("cannot have both AIN_0_1_DifferentialUnipolar and AIN_0_1_SingleEnded; choose one")
+# endif // AIN_0_1_SingleEnded
+#endif // AIN_0_1_DifferentialUnipolar
+//
+// Validate the AIN_0_1_DifferentialBipolarFSVref setting
+#if AIN_0_1_DifferentialBipolarFSVref
+# if AIN_0_1_DifferentialBipolarFS2Vref
+#  error("cannot have both AIN_0_1_DifferentialBipolarFSVref and AIN_0_1_DifferentialBipolarFS2Vref; choose one")
+# endif // AIN_0_1_DifferentialBipolarFS2Vref
+# if AIN_0_1_SingleEnded
+#  error("cannot have both AIN_0_1_DifferentialBipolarFSVref and AIN_0_1_SingleEnded; choose one")
+# endif // AIN_0_1_SingleEnded
+#endif // AIN_0_1_DifferentialBipolarFSVref
+//
+// Validate the AIN_0_1_DifferentialBipolarFS2Vref setting
+#if AIN_0_1_DifferentialBipolarFS2Vref
+# if AIN_0_1_SingleEnded
+#  error("cannot have both AIN_0_1_DifferentialBipolarFS2Vref and AIN_0_1_SingleEnded; choose one")
+# endif // AIN_0_1_SingleEnded
+#endif // AIN_0_1_DifferentialBipolarFS2Vref
+
+//----------------------------------------
+// ADC Channels AIN2, AIN3
+//
+// CUSTOMIZE: select one of the following options
+// either by uncommenting in this file or define at the project level
+//--------------------
+// ADC Channels AIN2, AIN3 = Differential Bipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN2, AIN3 are a Differential pair using Bipolar transfer function with range ±½Vref
+// AIN2 voltage must always be between 0 and VREF.
+// AIN3 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_2_3_DifferentialBipolarFSVref 	1
+//
+//--------------------
+// ADC Channels AIN2, AIN3 = Differential Bipolar
+// Full Scale = 2 * VREF
+// Voltage per LSB count = VREF/2048
+// AIN2, AIN3 are a Differential pair using Bipolar transfer function with range ±Vref
+// AIN2 voltage must always be between 0 and VREF.
+// AIN3 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_2_3_DifferentialBipolarFS2Vref 	1
+//
+//--------------------
+// ADC Channels AIN2, AIN3 = Both Single-Ended, Unipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN2 is a Single-Ended input using Unipolar transfer function.
+// AIN3 is a Single-Ended input using Unipolar transfer function.
+// If PDIFF_COM_1, both are Pseudo-Differential with REF- as common.
+// AIN2 voltage must always be between 0 and VREF.
+// AIN3 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_2_3_SingleEnded 	1
+//
+//--------------------
+// ADC Channels AIN2, AIN3 = Differential Unipolar (AIN2 > AIN3)
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN2, AIN3 are a Differential pair using Unipolar transfer function.
+// AIN2 voltage must always be between 0 and VREF.
+// AIN3 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_2_3_DifferentialUnipolar 	1
+//
+//--------------------
+//
+// Default settings if not defined at project level
+#ifndef AIN_2_3_DifferentialBipolarFSVref
+# ifndef AIN_2_3_DifferentialBipolarFS2Vref
+#  ifndef AIN_2_3_SingleEnded
+#   ifndef AIN_2_3_DifferentialUnipolar
+#    define AIN_2_3_DifferentialBipolarFSVref 	0
+#    define AIN_2_3_DifferentialBipolarFS2Vref 	0
+#    define AIN_2_3_SingleEnded 	1
+#    define AIN_2_3_DifferentialUnipolar 	0
+#   endif // AIN_2_3_DifferentialUnipolar
+#  endif // AIN_2_3_SingleEnded
+# endif // AIN_2_3_DifferentialBipolarFS2Vref
+#endif // AIN_2_3_DifferentialBipolarFSVref
+//
+// (optional diagnostic) pragma message the active setting
+#if AIN_2_3_DifferentialBipolarFSVref
+//~ #  pragma message("AIN_2_3_DifferentialBipolarFSVref: ADC Channels AIN2, AIN3 = Differential Bipolar")
+#endif // AIN_2_3_DifferentialBipolarFSVref
+#if AIN_2_3_DifferentialBipolarFS2Vref
+//~ #  pragma message("AIN_2_3_DifferentialBipolarFS2Vref: ADC Channels AIN2, AIN3 = Differential Bipolar")
+#endif // AIN_2_3_DifferentialBipolarFS2Vref
+#if AIN_2_3_SingleEnded
+//~ #  pragma message("AIN_2_3_SingleEnded: ADC Channels AIN2, AIN3 = Both Single-Ended, Unipolar")
+#endif // AIN_2_3_SingleEnded
+#if AIN_2_3_DifferentialUnipolar
+//~ #  pragma message("AIN_2_3_DifferentialUnipolar: ADC Channels AIN2, AIN3 = Differential Unipolar (AIN2 > AIN3)")
+#endif // AIN_2_3_DifferentialUnipolar
+//
+// Validate the AIN_2_3_DifferentialBipolarFSVref setting
+#if AIN_2_3_DifferentialBipolarFSVref
+# if AIN_2_3_DifferentialBipolarFS2Vref
+#  error("cannot have both AIN_2_3_DifferentialBipolarFSVref and AIN_2_3_DifferentialBipolarFS2Vref; choose one")
+# endif // AIN_2_3_DifferentialBipolarFS2Vref
+# if AIN_2_3_SingleEnded
+#  error("cannot have both AIN_2_3_DifferentialBipolarFSVref and AIN_2_3_SingleEnded; choose one")
+# endif // AIN_2_3_SingleEnded
+# if AIN_2_3_DifferentialUnipolar
+#  error("cannot have both AIN_2_3_DifferentialBipolarFSVref and AIN_2_3_DifferentialUnipolar; choose one")
+# endif // AIN_2_3_DifferentialUnipolar
+#endif // AIN_2_3_DifferentialBipolarFSVref
+//
+// Validate the AIN_2_3_DifferentialBipolarFS2Vref setting
+#if AIN_2_3_DifferentialBipolarFS2Vref
+# if AIN_2_3_SingleEnded
+#  error("cannot have both AIN_2_3_DifferentialBipolarFS2Vref and AIN_2_3_SingleEnded; choose one")
+# endif // AIN_2_3_SingleEnded
+# if AIN_2_3_DifferentialUnipolar
+#  error("cannot have both AIN_2_3_DifferentialBipolarFS2Vref and AIN_2_3_DifferentialUnipolar; choose one")
+# endif // AIN_2_3_DifferentialUnipolar
+#endif // AIN_2_3_DifferentialBipolarFS2Vref
+//
+// Validate the AIN_2_3_SingleEnded setting
+#if AIN_2_3_SingleEnded
+# if AIN_2_3_DifferentialUnipolar
+#  error("cannot have both AIN_2_3_SingleEnded and AIN_2_3_DifferentialUnipolar; choose one")
+# endif // AIN_2_3_DifferentialUnipolar
+#endif // AIN_2_3_SingleEnded
+
+//----------------------------------------
+// ADC Channels AIN4, AIN5
+//
+// CUSTOMIZE: select one of the following options
+// either by uncommenting in this file or define at the project level
+//--------------------
+// ADC Channels AIN4, AIN5 = Differential Unipolar (AIN4 > AIN5)
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN4, AIN5 are a Differential pair using Unipolar transfer function.
+// AIN4 voltage must always be between 0 and VREF.
+// AIN5 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_4_5_DifferentialUnipolar 	1
+//
+//--------------------
+// ADC Channels AIN4, AIN5 = Differential Bipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN4, AIN5 are a Differential pair using Bipolar transfer function with range ±½Vref
+// AIN4 voltage must always be between 0 and VREF.
+// AIN5 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_4_5_DifferentialBipolarFSVref 	1
+//
+//--------------------
+// ADC Channels AIN4, AIN5 = Differential Bipolar
+// Full Scale = 2 * VREF
+// Voltage per LSB count = VREF/2048
+// AIN4, AIN5 are a Differential pair using Bipolar transfer function with range ±Vref
+// AIN4 voltage must always be between 0 and VREF.
+// AIN5 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_4_5_DifferentialBipolarFS2Vref 	1
+//
+//--------------------
+// ADC Channels AIN4, AIN5 = Both Single-Ended, Unipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN4 is a Single-Ended input using Unipolar transfer function.
+// AIN5 is a Single-Ended input using Unipolar transfer function.
+// If PDIFF_COM_1, both are Pseudo-Differential with REF- as common.
+// AIN4 voltage must always be between 0 and VREF.
+// AIN5 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_4_5_SingleEnded 	1
+//
+//--------------------
+//
+// Default settings if not defined at project level
+#ifndef AIN_4_5_DifferentialUnipolar
+# ifndef AIN_4_5_DifferentialBipolarFSVref
+#  ifndef AIN_4_5_DifferentialBipolarFS2Vref
+#   ifndef AIN_4_5_SingleEnded
+#    define AIN_4_5_DifferentialUnipolar 	0
+#    define AIN_4_5_DifferentialBipolarFSVref 	0
+#    define AIN_4_5_DifferentialBipolarFS2Vref 	0
+#    define AIN_4_5_SingleEnded 	1
+#   endif // AIN_4_5_SingleEnded
+#  endif // AIN_4_5_DifferentialBipolarFS2Vref
+# endif // AIN_4_5_DifferentialBipolarFSVref
+#endif // AIN_4_5_DifferentialUnipolar
+//
+// (optional diagnostic) pragma message the active setting
+#if AIN_4_5_DifferentialUnipolar
+//~ #  pragma message("AIN_4_5_DifferentialUnipolar: ADC Channels AIN4, AIN5 = Differential Unipolar (AIN4 > AIN5)")
+#endif // AIN_4_5_DifferentialUnipolar
+#if AIN_4_5_DifferentialBipolarFSVref
+//~ #  pragma message("AIN_4_5_DifferentialBipolarFSVref: ADC Channels AIN4, AIN5 = Differential Bipolar")
+#endif // AIN_4_5_DifferentialBipolarFSVref
+#if AIN_4_5_DifferentialBipolarFS2Vref
+//~ #  pragma message("AIN_4_5_DifferentialBipolarFS2Vref: ADC Channels AIN4, AIN5 = Differential Bipolar")
+#endif // AIN_4_5_DifferentialBipolarFS2Vref
+#if AIN_4_5_SingleEnded
+//~ #  pragma message("AIN_4_5_SingleEnded: ADC Channels AIN4, AIN5 = Both Single-Ended, Unipolar")
+#endif // AIN_4_5_SingleEnded
+//
+// Validate the AIN_4_5_DifferentialUnipolar setting
+#if AIN_4_5_DifferentialUnipolar
+# if AIN_4_5_DifferentialBipolarFSVref
+#  error("cannot have both AIN_4_5_DifferentialUnipolar and AIN_4_5_DifferentialBipolarFSVref; choose one")
+# endif // AIN_4_5_DifferentialBipolarFSVref
+# if AIN_4_5_DifferentialBipolarFS2Vref
+#  error("cannot have both AIN_4_5_DifferentialUnipolar and AIN_4_5_DifferentialBipolarFS2Vref; choose one")
+# endif // AIN_4_5_DifferentialBipolarFS2Vref
+# if AIN_4_5_SingleEnded
+#  error("cannot have both AIN_4_5_DifferentialUnipolar and AIN_4_5_SingleEnded; choose one")
+# endif // AIN_4_5_SingleEnded
+#endif // AIN_4_5_DifferentialUnipolar
+//
+// Validate the AIN_4_5_DifferentialBipolarFSVref setting
+#if AIN_4_5_DifferentialBipolarFSVref
+# if AIN_4_5_DifferentialBipolarFS2Vref
+#  error("cannot have both AIN_4_5_DifferentialBipolarFSVref and AIN_4_5_DifferentialBipolarFS2Vref; choose one")
+# endif // AIN_4_5_DifferentialBipolarFS2Vref
+# if AIN_4_5_SingleEnded
+#  error("cannot have both AIN_4_5_DifferentialBipolarFSVref and AIN_4_5_SingleEnded; choose one")
+# endif // AIN_4_5_SingleEnded
+#endif // AIN_4_5_DifferentialBipolarFSVref
+//
+// Validate the AIN_4_5_DifferentialBipolarFS2Vref setting
+#if AIN_4_5_DifferentialBipolarFS2Vref
+# if AIN_4_5_SingleEnded
+#  error("cannot have both AIN_4_5_DifferentialBipolarFS2Vref and AIN_4_5_SingleEnded; choose one")
+# endif // AIN_4_5_SingleEnded
+#endif // AIN_4_5_DifferentialBipolarFS2Vref
+
+//----------------------------------------
+// ADC Channels AIN6, AIN7
+//
+// CUSTOMIZE: select one of the following options
+// either by uncommenting in this file or define at the project level
+//--------------------
+// ADC Channels AIN6, AIN7 = Differential Bipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN6, AIN7 are a Differential pair using Bipolar transfer function with range ±½Vref
+// AIN6 voltage must always be between 0 and VREF.
+// AIN7 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_6_7_DifferentialBipolarFSVref 	1
+//
+//--------------------
+// ADC Channels AIN6, AIN7 = Differential Bipolar
+// Full Scale = 2 * VREF
+// Voltage per LSB count = VREF/2048
+// AIN6, AIN7 are a Differential pair using Bipolar transfer function with range ±Vref
+// AIN6 voltage must always be between 0 and VREF.
+// AIN7 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_6_7_DifferentialBipolarFS2Vref 	1
+//
+//--------------------
+// ADC Channels AIN6, AIN7 = Both Single-Ended, Unipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN6 is a Single-Ended input using Unipolar transfer function.
+// AIN7 is a Single-Ended input using Unipolar transfer function.
+// If PDIFF_COM_1, both are Pseudo-Differential with REF- as common.
+// AIN6 voltage must always be between 0 and VREF.
+// AIN7 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_6_7_SingleEnded 	1
+//
+//--------------------
+// ADC Channels AIN6, AIN7 = Differential Unipolar (AIN6 > AIN7)
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN6, AIN7 are a Differential pair using Unipolar transfer function.
+// AIN6 voltage must always be between 0 and VREF.
+// AIN7 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_6_7_DifferentialUnipolar 	1
+//
+//--------------------
+//
+// Default settings if not defined at project level
+#ifndef AIN_6_7_DifferentialBipolarFSVref
+# ifndef AIN_6_7_DifferentialBipolarFS2Vref
+#  ifndef AIN_6_7_SingleEnded
+#   ifndef AIN_6_7_DifferentialUnipolar
+#    define AIN_6_7_DifferentialBipolarFSVref 	0
+#    define AIN_6_7_DifferentialBipolarFS2Vref 	0
+#    define AIN_6_7_SingleEnded 	1
+#    define AIN_6_7_DifferentialUnipolar 	0
+#   endif // AIN_6_7_DifferentialUnipolar
+#  endif // AIN_6_7_SingleEnded
+# endif // AIN_6_7_DifferentialBipolarFS2Vref
+#endif // AIN_6_7_DifferentialBipolarFSVref
+//
+// (optional diagnostic) pragma message the active setting
+#if AIN_6_7_DifferentialBipolarFSVref
+//~ #  pragma message("AIN_6_7_DifferentialBipolarFSVref: ADC Channels AIN6, AIN7 = Differential Bipolar")
+#endif // AIN_6_7_DifferentialBipolarFSVref
+#if AIN_6_7_DifferentialBipolarFS2Vref
+//~ #  pragma message("AIN_6_7_DifferentialBipolarFS2Vref: ADC Channels AIN6, AIN7 = Differential Bipolar")
+#endif // AIN_6_7_DifferentialBipolarFS2Vref
+#if AIN_6_7_SingleEnded
+//~ #  pragma message("AIN_6_7_SingleEnded: ADC Channels AIN6, AIN7 = Both Single-Ended, Unipolar")
+#endif // AIN_6_7_SingleEnded
+#if AIN_6_7_DifferentialUnipolar
+//~ #  pragma message("AIN_6_7_DifferentialUnipolar: ADC Channels AIN6, AIN7 = Differential Unipolar (AIN6 > AIN7)")
+#endif // AIN_6_7_DifferentialUnipolar
+//
+// Validate the AIN_6_7_DifferentialBipolarFSVref setting
+#if AIN_6_7_DifferentialBipolarFSVref
+# if AIN_6_7_DifferentialBipolarFS2Vref
+#  error("cannot have both AIN_6_7_DifferentialBipolarFSVref and AIN_6_7_DifferentialBipolarFS2Vref; choose one")
+# endif // AIN_6_7_DifferentialBipolarFS2Vref
+# if AIN_6_7_SingleEnded
+#  error("cannot have both AIN_6_7_DifferentialBipolarFSVref and AIN_6_7_SingleEnded; choose one")
+# endif // AIN_6_7_SingleEnded
+# if AIN_6_7_DifferentialUnipolar
+#  error("cannot have both AIN_6_7_DifferentialBipolarFSVref and AIN_6_7_DifferentialUnipolar; choose one")
+# endif // AIN_6_7_DifferentialUnipolar
+#endif // AIN_6_7_DifferentialBipolarFSVref
+//
+// Validate the AIN_6_7_DifferentialBipolarFS2Vref setting
+#if AIN_6_7_DifferentialBipolarFS2Vref
+# if AIN_6_7_SingleEnded
+#  error("cannot have both AIN_6_7_DifferentialBipolarFS2Vref and AIN_6_7_SingleEnded; choose one")
+# endif // AIN_6_7_SingleEnded
+# if AIN_6_7_DifferentialUnipolar
+#  error("cannot have both AIN_6_7_DifferentialBipolarFS2Vref and AIN_6_7_DifferentialUnipolar; choose one")
+# endif // AIN_6_7_DifferentialUnipolar
+#endif // AIN_6_7_DifferentialBipolarFS2Vref
+//
+// Validate the AIN_6_7_SingleEnded setting
+#if AIN_6_7_SingleEnded
+# if AIN_6_7_DifferentialUnipolar
+#  error("cannot have both AIN_6_7_SingleEnded and AIN_6_7_DifferentialUnipolar; choose one")
+# endif // AIN_6_7_DifferentialUnipolar
+#endif // AIN_6_7_SingleEnded
+
+//----------------------------------------
+// ADC Channels AIN8, AIN9
+//
+// CUSTOMIZE: select one of the following options
+// either by uncommenting in this file or define at the project level
+//--------------------
+// ADC Channels AIN8, AIN9 = Differential Unipolar (AIN8 > AIN9)
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN8, AIN9 are a Differential pair using Unipolar transfer function.
+// AIN8 voltage must always be between 0 and VREF.
+// AIN9 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_8_9_DifferentialUnipolar 	1
+//
+//--------------------
+// ADC Channels AIN8, AIN9 = Differential Bipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN8, AIN9 are a Differential pair using Bipolar transfer function with range ±½Vref
+// AIN8 voltage must always be between 0 and VREF.
+// AIN9 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_8_9_DifferentialBipolarFSVref 	1
+//
+//--------------------
+// ADC Channels AIN8, AIN9 = Differential Bipolar
+// Full Scale = 2 * VREF
+// Voltage per LSB count = VREF/2048
+// AIN8, AIN9 are a Differential pair using Bipolar transfer function with range ±Vref
+// AIN8 voltage must always be between 0 and VREF.
+// AIN9 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_8_9_DifferentialBipolarFS2Vref 	1
+//
+//--------------------
+// ADC Channels AIN8, AIN9 = Both Single-Ended, Unipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN8 is a Single-Ended input using Unipolar transfer function.
+// AIN9 is a Single-Ended input using Unipolar transfer function.
+// If PDIFF_COM_1, both are Pseudo-Differential with REF- as common.
+// AIN8 voltage must always be between 0 and VREF.
+// AIN9 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_8_9_SingleEnded 	1
+//
+//--------------------
+//
+// Default settings if not defined at project level
+#ifndef AIN_8_9_DifferentialUnipolar
+# ifndef AIN_8_9_DifferentialBipolarFSVref
+#  ifndef AIN_8_9_DifferentialBipolarFS2Vref
+#   ifndef AIN_8_9_SingleEnded
+#    define AIN_8_9_DifferentialUnipolar 	0
+#    define AIN_8_9_DifferentialBipolarFSVref 	0
+#    define AIN_8_9_DifferentialBipolarFS2Vref 	0
+#    define AIN_8_9_SingleEnded 	1
+#   endif // AIN_8_9_SingleEnded
+#  endif // AIN_8_9_DifferentialBipolarFS2Vref
+# endif // AIN_8_9_DifferentialBipolarFSVref
+#endif // AIN_8_9_DifferentialUnipolar
+//
+// (optional diagnostic) pragma message the active setting
+#if AIN_8_9_DifferentialUnipolar
+//~ #  pragma message("AIN_8_9_DifferentialUnipolar: ADC Channels AIN8, AIN9 = Differential Unipolar (AIN8 > AIN9)")
+#endif // AIN_8_9_DifferentialUnipolar
+#if AIN_8_9_DifferentialBipolarFSVref
+//~ #  pragma message("AIN_8_9_DifferentialBipolarFSVref: ADC Channels AIN8, AIN9 = Differential Bipolar")
+#endif // AIN_8_9_DifferentialBipolarFSVref
+#if AIN_8_9_DifferentialBipolarFS2Vref
+//~ #  pragma message("AIN_8_9_DifferentialBipolarFS2Vref: ADC Channels AIN8, AIN9 = Differential Bipolar")
+#endif // AIN_8_9_DifferentialBipolarFS2Vref
+#if AIN_8_9_SingleEnded
+//~ #  pragma message("AIN_8_9_SingleEnded: ADC Channels AIN8, AIN9 = Both Single-Ended, Unipolar")
+#endif // AIN_8_9_SingleEnded
+//
+// Validate the AIN_8_9_DifferentialUnipolar setting
+#if AIN_8_9_DifferentialUnipolar
+# if AIN_8_9_DifferentialBipolarFSVref
+#  error("cannot have both AIN_8_9_DifferentialUnipolar and AIN_8_9_DifferentialBipolarFSVref; choose one")
+# endif // AIN_8_9_DifferentialBipolarFSVref
+# if AIN_8_9_DifferentialBipolarFS2Vref
+#  error("cannot have both AIN_8_9_DifferentialUnipolar and AIN_8_9_DifferentialBipolarFS2Vref; choose one")
+# endif // AIN_8_9_DifferentialBipolarFS2Vref
+# if AIN_8_9_SingleEnded
+#  error("cannot have both AIN_8_9_DifferentialUnipolar and AIN_8_9_SingleEnded; choose one")
+# endif // AIN_8_9_SingleEnded
+#endif // AIN_8_9_DifferentialUnipolar
+//
+// Validate the AIN_8_9_DifferentialBipolarFSVref setting
+#if AIN_8_9_DifferentialBipolarFSVref
+# if AIN_8_9_DifferentialBipolarFS2Vref
+#  error("cannot have both AIN_8_9_DifferentialBipolarFSVref and AIN_8_9_DifferentialBipolarFS2Vref; choose one")
+# endif // AIN_8_9_DifferentialBipolarFS2Vref
+# if AIN_8_9_SingleEnded
+#  error("cannot have both AIN_8_9_DifferentialBipolarFSVref and AIN_8_9_SingleEnded; choose one")
+# endif // AIN_8_9_SingleEnded
+#endif // AIN_8_9_DifferentialBipolarFSVref
+//
+// Validate the AIN_8_9_DifferentialBipolarFS2Vref setting
+#if AIN_8_9_DifferentialBipolarFS2Vref
+# if AIN_8_9_SingleEnded
+#  error("cannot have both AIN_8_9_DifferentialBipolarFS2Vref and AIN_8_9_SingleEnded; choose one")
+# endif // AIN_8_9_SingleEnded
+#endif // AIN_8_9_DifferentialBipolarFS2Vref
+
+//----------------------------------------
+// ADC Channels AIN10, AIN11
+//
+// CUSTOMIZE: select one of the following options
+// either by uncommenting in this file or define at the project level
+//--------------------
+// ADC Channels AIN10, AIN11 = Differential Bipolar
+// Full Scale = 2 * VREF
+// Voltage per LSB count = VREF/2048
+// AIN10, AIN11 are a Differential pair using Bipolar transfer function with range ±Vref
+// AIN10 voltage must always be between 0 and VREF.
+// AIN11 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_10_11_DifferentialBipolarFS2Vref 	1
+//
+//--------------------
+// ADC Channels AIN10, AIN11 = Both Single-Ended, Unipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN10 is a Single-Ended input using Unipolar transfer function.
+// AIN11 is a Single-Ended input using Unipolar transfer function.
+// If PDIFF_COM_1, both are Pseudo-Differential with REF- as common.
+// AIN10 voltage must always be between 0 and VREF.
+// AIN11 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_10_11_SingleEnded 	1
+//
+//--------------------
+// ADC Channels AIN10, AIN11 = Differential Unipolar (AIN10 > AIN11)
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN10, AIN11 are a Differential pair using Unipolar transfer function.
+// AIN10 voltage must always be between 0 and VREF.
+// AIN11 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_10_11_DifferentialUnipolar 	1
+//
+//--------------------
+// ADC Channels AIN10, AIN11 = Differential Bipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN10, AIN11 are a Differential pair using Bipolar transfer function with range ±½Vref
+// AIN10 voltage must always be between 0 and VREF.
+// AIN11 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_10_11_DifferentialBipolarFSVref 	1
+//
+//--------------------
+//
+// Default settings if not defined at project level
+#ifndef AIN_10_11_DifferentialBipolarFS2Vref
+# ifndef AIN_10_11_SingleEnded
+#  ifndef AIN_10_11_DifferentialUnipolar
+#   ifndef AIN_10_11_DifferentialBipolarFSVref
+#    define AIN_10_11_DifferentialBipolarFS2Vref 	0
+#    define AIN_10_11_SingleEnded 	1
+#    define AIN_10_11_DifferentialUnipolar 	0
+#    define AIN_10_11_DifferentialBipolarFSVref 	0
+#   endif // AIN_10_11_DifferentialBipolarFSVref
+#  endif // AIN_10_11_DifferentialUnipolar
+# endif // AIN_10_11_SingleEnded
+#endif // AIN_10_11_DifferentialBipolarFS2Vref
+//
+// (optional diagnostic) pragma message the active setting
+#if AIN_10_11_DifferentialBipolarFS2Vref
+//~ #  pragma message("AIN_10_11_DifferentialBipolarFS2Vref: ADC Channels AIN10, AIN11 = Differential Bipolar")
+#endif // AIN_10_11_DifferentialBipolarFS2Vref
+#if AIN_10_11_SingleEnded
+//~ #  pragma message("AIN_10_11_SingleEnded: ADC Channels AIN10, AIN11 = Both Single-Ended, Unipolar")
+#endif // AIN_10_11_SingleEnded
+#if AIN_10_11_DifferentialUnipolar
+//~ #  pragma message("AIN_10_11_DifferentialUnipolar: ADC Channels AIN10, AIN11 = Differential Unipolar (AIN10 > AIN11)")
+#endif // AIN_10_11_DifferentialUnipolar
+#if AIN_10_11_DifferentialBipolarFSVref
+//~ #  pragma message("AIN_10_11_DifferentialBipolarFSVref: ADC Channels AIN10, AIN11 = Differential Bipolar")
+#endif // AIN_10_11_DifferentialBipolarFSVref
+//
+// Validate the AIN_10_11_DifferentialBipolarFS2Vref setting
+#if AIN_10_11_DifferentialBipolarFS2Vref
+# if AIN_10_11_SingleEnded
+#  error("cannot have both AIN_10_11_DifferentialBipolarFS2Vref and AIN_10_11_SingleEnded; choose one")
+# endif // AIN_10_11_SingleEnded
+# if AIN_10_11_DifferentialUnipolar
+#  error("cannot have both AIN_10_11_DifferentialBipolarFS2Vref and AIN_10_11_DifferentialUnipolar; choose one")
+# endif // AIN_10_11_DifferentialUnipolar
+# if AIN_10_11_DifferentialBipolarFSVref
+#  error("cannot have both AIN_10_11_DifferentialBipolarFS2Vref and AIN_10_11_DifferentialBipolarFSVref; choose one")
+# endif // AIN_10_11_DifferentialBipolarFSVref
+#endif // AIN_10_11_DifferentialBipolarFS2Vref
+//
+// Validate the AIN_10_11_SingleEnded setting
+#if AIN_10_11_SingleEnded
+# if AIN_10_11_DifferentialUnipolar
+#  error("cannot have both AIN_10_11_SingleEnded and AIN_10_11_DifferentialUnipolar; choose one")
+# endif // AIN_10_11_DifferentialUnipolar
+# if AIN_10_11_DifferentialBipolarFSVref
+#  error("cannot have both AIN_10_11_SingleEnded and AIN_10_11_DifferentialBipolarFSVref; choose one")
+# endif // AIN_10_11_DifferentialBipolarFSVref
+#endif // AIN_10_11_SingleEnded
+//
+// Validate the AIN_10_11_DifferentialUnipolar setting
+#if AIN_10_11_DifferentialUnipolar
+# if AIN_10_11_DifferentialBipolarFSVref
+#  error("cannot have both AIN_10_11_DifferentialUnipolar and AIN_10_11_DifferentialBipolarFSVref; choose one")
+# endif // AIN_10_11_DifferentialBipolarFSVref
+#endif // AIN_10_11_DifferentialUnipolar
+
+//----------------------------------------
+// ADC Channels AIN12, AIN13
+//
+// CUSTOMIZE: select one of the following options
+// either by uncommenting in this file or define at the project level
+//--------------------
+// ADC Channels AIN12, AIN13 = Differential Bipolar
+// Full Scale = 2 * VREF
+// Voltage per LSB count = VREF/2048
+// AIN12, AIN13 are a Differential pair using Bipolar transfer function with range ±Vref
+// AIN12 voltage must always be between 0 and VREF.
+// AIN13 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_12_13_DifferentialBipolarFS2Vref 	1
+//
+//--------------------
+// ADC Channels AIN12, AIN13 = Both Single-Ended, Unipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN12 is a Single-Ended input using Unipolar transfer function.
+// AIN13 is a Single-Ended input using Unipolar transfer function.
+// If PDIFF_COM_1, both are Pseudo-Differential with REF- as common.
+// AIN12 voltage must always be between 0 and VREF.
+// AIN13 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_12_13_SingleEnded 	1
+//
+//--------------------
+// ADC Channels AIN12, AIN13 = Differential Unipolar (AIN12 > AIN13)
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN12, AIN13 are a Differential pair using Unipolar transfer function.
+// AIN12 voltage must always be between 0 and VREF.
+// AIN13 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_12_13_DifferentialUnipolar 	1
+//
+//--------------------
+// ADC Channels AIN12, AIN13 = Differential Bipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN12, AIN13 are a Differential pair using Bipolar transfer function with range ±½Vref
+// AIN12 voltage must always be between 0 and VREF.
+// AIN13 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_12_13_DifferentialBipolarFSVref 	1
+//
+//--------------------
+//
+// Default settings if not defined at project level
+#ifndef AIN_12_13_DifferentialBipolarFS2Vref
+# ifndef AIN_12_13_SingleEnded
+#  ifndef AIN_12_13_DifferentialUnipolar
+#   ifndef AIN_12_13_DifferentialBipolarFSVref
+#    define AIN_12_13_DifferentialBipolarFS2Vref 	0
+#    define AIN_12_13_SingleEnded 	1
+#    define AIN_12_13_DifferentialUnipolar 	0
+#    define AIN_12_13_DifferentialBipolarFSVref 	0
+#   endif // AIN_12_13_DifferentialBipolarFSVref
+#  endif // AIN_12_13_DifferentialUnipolar
+# endif // AIN_12_13_SingleEnded
+#endif // AIN_12_13_DifferentialBipolarFS2Vref
+//
+// (optional diagnostic) pragma message the active setting
+#if AIN_12_13_DifferentialBipolarFS2Vref
+//~ #  pragma message("AIN_12_13_DifferentialBipolarFS2Vref: ADC Channels AIN12, AIN13 = Differential Bipolar")
+#endif // AIN_12_13_DifferentialBipolarFS2Vref
+#if AIN_12_13_SingleEnded
+//~ #  pragma message("AIN_12_13_SingleEnded: ADC Channels AIN12, AIN13 = Both Single-Ended, Unipolar")
+#endif // AIN_12_13_SingleEnded
+#if AIN_12_13_DifferentialUnipolar
+//~ #  pragma message("AIN_12_13_DifferentialUnipolar: ADC Channels AIN12, AIN13 = Differential Unipolar (AIN12 > AIN13)")
+#endif // AIN_12_13_DifferentialUnipolar
+#if AIN_12_13_DifferentialBipolarFSVref
+//~ #  pragma message("AIN_12_13_DifferentialBipolarFSVref: ADC Channels AIN12, AIN13 = Differential Bipolar")
+#endif // AIN_12_13_DifferentialBipolarFSVref
+//
+// Validate the AIN_12_13_DifferentialBipolarFS2Vref setting
+#if AIN_12_13_DifferentialBipolarFS2Vref
+# if AIN_12_13_SingleEnded
+#  error("cannot have both AIN_12_13_DifferentialBipolarFS2Vref and AIN_12_13_SingleEnded; choose one")
+# endif // AIN_12_13_SingleEnded
+# if AIN_12_13_DifferentialUnipolar
+#  error("cannot have both AIN_12_13_DifferentialBipolarFS2Vref and AIN_12_13_DifferentialUnipolar; choose one")
+# endif // AIN_12_13_DifferentialUnipolar
+# if AIN_12_13_DifferentialBipolarFSVref
+#  error("cannot have both AIN_12_13_DifferentialBipolarFS2Vref and AIN_12_13_DifferentialBipolarFSVref; choose one")
+# endif // AIN_12_13_DifferentialBipolarFSVref
+#endif // AIN_12_13_DifferentialBipolarFS2Vref
+//
+// Validate the AIN_12_13_SingleEnded setting
+#if AIN_12_13_SingleEnded
+# if AIN_12_13_DifferentialUnipolar
+#  error("cannot have both AIN_12_13_SingleEnded and AIN_12_13_DifferentialUnipolar; choose one")
+# endif // AIN_12_13_DifferentialUnipolar
+# if AIN_12_13_DifferentialBipolarFSVref
+#  error("cannot have both AIN_12_13_SingleEnded and AIN_12_13_DifferentialBipolarFSVref; choose one")
+# endif // AIN_12_13_DifferentialBipolarFSVref
+#endif // AIN_12_13_SingleEnded
+//
+// Validate the AIN_12_13_DifferentialUnipolar setting
+#if AIN_12_13_DifferentialUnipolar
+# if AIN_12_13_DifferentialBipolarFSVref
+#  error("cannot have both AIN_12_13_DifferentialUnipolar and AIN_12_13_DifferentialBipolarFSVref; choose one")
+# endif // AIN_12_13_DifferentialBipolarFSVref
+#endif // AIN_12_13_DifferentialUnipolar
+
+//----------------------------------------
+// ADC Channels AIN14, AIN15
+//
+// CUSTOMIZE: select one of the following options
+// either by uncommenting in this file or define at the project level
+//--------------------
+// ADC Channels AIN14, AIN15 = Differential Bipolar
+// Full Scale = 2 * VREF
+// Voltage per LSB count = VREF/2048
+// AIN14, AIN15 are a Differential pair using Bipolar transfer function with range ±Vref
+// AIN14 voltage must always be between 0 and VREF.
+// AIN15 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_14_15_DifferentialBipolarFS2Vref 	1
+//
+//--------------------
+// ADC Channels AIN14, AIN15 = Both Single-Ended, Unipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN14 is a Single-Ended input using Unipolar transfer function.
+// AIN15 is a Single-Ended input using Unipolar transfer function.
+// If PDIFF_COM_1, both are Pseudo-Differential with REF- as common.
+// AIN14 voltage must always be between 0 and VREF.
+// AIN15 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_14_15_SingleEnded 	1
+//
+//--------------------
+// ADC Channels AIN14, AIN15 = Differential Unipolar (AIN14 > AIN15)
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN14, AIN15 are a Differential pair using Unipolar transfer function.
+// AIN14 voltage must always be between 0 and VREF.
+// AIN15 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_14_15_DifferentialUnipolar 	1
+//
+//--------------------
+// ADC Channels AIN14, AIN15 = Differential Bipolar
+// Full Scale = VREF
+// Voltage per LSB count = VREF/2048
+// AIN14, AIN15 are a Differential pair using Bipolar transfer function with range ±½Vref
+// AIN14 voltage must always be between 0 and VREF.
+// AIN15 voltage must always be between 0 and VREF.
+//
+//~ #define AIN_14_15_DifferentialBipolarFSVref 	1
+//
+//--------------------
+//
+// Default settings if not defined at project level
+#ifndef AIN_14_15_DifferentialBipolarFS2Vref
+# ifndef AIN_14_15_SingleEnded
+#  ifndef AIN_14_15_DifferentialUnipolar
+#   ifndef AIN_14_15_DifferentialBipolarFSVref
+#    define AIN_14_15_DifferentialBipolarFS2Vref 	0
+#    define AIN_14_15_SingleEnded 	1
+#    define AIN_14_15_DifferentialUnipolar 	0
+#    define AIN_14_15_DifferentialBipolarFSVref 	0
+#   endif // AIN_14_15_DifferentialBipolarFSVref
+#  endif // AIN_14_15_DifferentialUnipolar
+# endif // AIN_14_15_SingleEnded
+#endif // AIN_14_15_DifferentialBipolarFS2Vref
+//
+// (optional diagnostic) pragma message the active setting
+#if AIN_14_15_DifferentialBipolarFS2Vref
+//~ #  pragma message("AIN_14_15_DifferentialBipolarFS2Vref: ADC Channels AIN14, AIN15 = Differential Bipolar")
+#endif // AIN_14_15_DifferentialBipolarFS2Vref
+#if AIN_14_15_SingleEnded
+//~ #  pragma message("AIN_14_15_SingleEnded: ADC Channels AIN14, AIN15 = Both Single-Ended, Unipolar")
+#endif // AIN_14_15_SingleEnded
+#if AIN_14_15_DifferentialUnipolar
+//~ #  pragma message("AIN_14_15_DifferentialUnipolar: ADC Channels AIN14, AIN15 = Differential Unipolar (AIN14 > AIN15)")
+#endif // AIN_14_15_DifferentialUnipolar
+#if AIN_14_15_DifferentialBipolarFSVref
+//~ #  pragma message("AIN_14_15_DifferentialBipolarFSVref: ADC Channels AIN14, AIN15 = Differential Bipolar")
+#endif // AIN_14_15_DifferentialBipolarFSVref
+//
+// Validate the AIN_14_15_DifferentialBipolarFS2Vref setting
+#if AIN_14_15_DifferentialBipolarFS2Vref
+# if AIN_14_15_SingleEnded
+#  error("cannot have both AIN_14_15_DifferentialBipolarFS2Vref and AIN_14_15_SingleEnded; choose one")
+# endif // AIN_14_15_SingleEnded
+# if AIN_14_15_DifferentialUnipolar
+#  error("cannot have both AIN_14_15_DifferentialBipolarFS2Vref and AIN_14_15_DifferentialUnipolar; choose one")
+# endif // AIN_14_15_DifferentialUnipolar
+# if AIN_14_15_DifferentialBipolarFSVref
+#  error("cannot have both AIN_14_15_DifferentialBipolarFS2Vref and AIN_14_15_DifferentialBipolarFSVref; choose one")
+# endif // AIN_14_15_DifferentialBipolarFSVref
+#endif // AIN_14_15_DifferentialBipolarFS2Vref
+//
+// Validate the AIN_14_15_SingleEnded setting
+#if AIN_14_15_SingleEnded
+# if AIN_14_15_DifferentialUnipolar
+#  error("cannot have both AIN_14_15_SingleEnded and AIN_14_15_DifferentialUnipolar; choose one")
+# endif // AIN_14_15_DifferentialUnipolar
+# if AIN_14_15_DifferentialBipolarFSVref
+#  error("cannot have both AIN_14_15_SingleEnded and AIN_14_15_DifferentialBipolarFSVref; choose one")
+# endif // AIN_14_15_DifferentialBipolarFSVref
+#endif // AIN_14_15_SingleEnded
+//
+// Validate the AIN_14_15_DifferentialUnipolar setting
+#if AIN_14_15_DifferentialUnipolar
+# if AIN_14_15_DifferentialBipolarFSVref
+#  error("cannot have both AIN_14_15_DifferentialUnipolar and AIN_14_15_DifferentialBipolarFSVref; choose one")
+# endif // AIN_14_15_DifferentialBipolarFSVref
+#endif // AIN_14_15_DifferentialUnipolar
+
+// CODE GENERATOR: class declaration and docstrings
+/**
+ * @brief MAX11131 3Msps, Low-Power, Serial SPI 12-Bit, 16-Channel, Differential/Single-Ended Input, SAR ADC
+ *
+ *
+ *
+ * Datasheet: https://www.maximintegrated.com/MAX11131
+ *
+ *
+ *
+ * //---------- CODE GENERATOR: testMainCppCodeList
+ * @code
+ * // CODE GENERATOR: example code includes
+ * // example code includes
+ * #include "mbed.h"
+ * //#include "max32625.h"
+ * #include "MAX11131.h"
+ *
+ * // optional: serial port
+ * // note: some platforms such as Nucleo-F446RE do not support the USBSerial library.
+ * // In those cases, remove the USBDevice lib from the project and rebuild.
+ * #if defined(TARGET_MAX32625MBED)
+ * #include "USBSerial.h"
+ * USBSerial serial; // virtual serial port over USB (DEV connector)
+ * #elif defined(TARGET_MAX32630MBED)
+ * #include "USBSerial.h"
+ * USBSerial serial; // virtual serial port over USB (DEV connector)
+ * #else
+ * //#include "USBSerial.h"
+ * Serial serial(USBTX, USBRX); // tx, rx
+ * #endif
+ *
+ * // example code board support
+ * //MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
+ * //DigitalOut rLED(LED1);
+ * //DigitalOut gLED(LED2);
+ * //DigitalOut bLED(LED3);
+ * //
+ * // Arduino "shield" connector port definitions (MAX32625MBED shown)
+ * #if defined(TARGET_MAX32625MBED)
+ * #define A0 AIN_0
+ * #define A1 AIN_1
+ * #define A2 AIN_2
+ * #define A3 AIN_3
+ * #define D0 P0_0
+ * #define D1 P0_1
+ * #define D2 P0_2
+ * #define D3 P0_3
+ * #define D4 P0_4
+ * #define D5 P0_5
+ * #define D6 P0_6
+ * #define D7 P0_7
+ * #define D8 P1_4
+ * #define D9 P1_5
+ * #define D10 P1_3
+ * #define D11 P1_1
+ * #define D12 P1_2
+ * #define D13 P1_0
+ * #endif
+ *
+ * // example code declare SPI interface
+ * #if defined(TARGET_MAX32625MBED)
+ * SPI spi(SPI1_MOSI, SPI1_MISO, SPI1_SCK); // mosi, miso, sclk spi1 TARGET_MAX32625MBED: P1_1 P1_2 P1_0 Arduino 10-pin header D11 D12 D13
+ * DigitalOut spi_cs(SPI1_SS); // TARGET_MAX32625MBED: P1_3 Arduino 10-pin header D10
+ * #elif defined(TARGET_MAX32600MBED)
+ * SPI spi(SPI2_MOSI, SPI2_MISO, SPI2_SCK); // mosi, miso, sclk spi1 TARGET_MAX32600MBED: Arduino 10-pin header D11 D12 D13
+ * DigitalOut spi_cs(SPI2_SS); // Generic: Arduino 10-pin header D10
+ * #else
+ * SPI spi(D11, D12, D13); // mosi, miso, sclk spi1 TARGET_MAX32600MBED: Arduino 10-pin header D11 D12 D13
+ * DigitalOut spi_cs(D10); // Generic: Arduino 10-pin header D10
+ * #endif
+ *
+ * // example code declare GPIO interface pins
+ * DigitalOut CNVST_pin(D9); // Digital Trigger Input to MAX11131 device
+ * // AnalogOut REF__pin(Px_x_PortName_To_Be_Determined); // Reference Input to MAX11131 device
+ * // AnalogOut REF__AIN15_pin(Px_x_PortName_To_Be_Determined); // Reference Input to MAX11131 device
+ * DigitalIn EOC_pin(D2); // Digital Event Output from MAX11131 device
+ * // example code declare device instance
+ * MAX11131 g_MAX11131_device(spi, spi_cs, CNVST_pin, EOC_pin, MAX11131::MAX11131_IC);
+ *
+ * // example code main function
+ * int main()
+ * {
+ *     while (1)
+ *     {
+ *         // example code: serial port banner message
+ *     #if defined(TARGET_MAX32625MBED)
+ *         serial.printf("MAX32625MBED ");
+ *     #elif defined(TARGET_MAX32600MBED)
+ *         serial.printf("MAX32600MBED ");
+ *     #elif defined(TARGET_NUCLEO_F446RE)
+ *         serial.printf("NUCLEO_F446RE ");
+ *     #endif
+ *         serial.printf("MAX5715BOB\r\n");
+ *
+ *         //MAX11131 dac(spi, spi_cs, MAX11131::MAX11131_IC);
+ *         //dac.Init();
+ *
+ *         // CODE GENERATOR: example code: member function Init
+ *         g_MAX11131_device.Init();
+ *
+ *         // CODE GENERATOR: example code: has no member function REF
+ *         // CODE GENERATOR: example code: has no member function CODE_LOAD
+ *         // CODE GENERATOR: example code: has no member function CODEallLOADall
+ *         // CODE GENERATOR: example code: has no member function CODEnLOADn
+ *         // CODE GENERATOR: example code: member function ScanManual
+ *         // @param[in] g_MAX11131_device.channelNumber_0_15: AIN Channel Number
+ *         // @param[in] g_MAX11131_device.PowerManagement_0_2: 0=Normal, 1=AutoShutdown, 2=AutoStandby
+ *         // @param[in] g_MAX11131_device.chan_id_0_1: ADC_MODE_CONTROL.CHAN_ID
+ *         int channelId_0_15 = 3;
+ *         g_MAX11131_device.channelNumber_0_15 = channelId_0_15;
+ *         g_MAX11131_device.PowerManagement_0_2 = 0;
+ *         g_MAX11131_device.chan_id_0_1 = 1;
+ *         g_MAX11131_device.NumWords = g_MAX11131_device.ScanManual();
+ *
+ *         // CODE GENERATOR: example code: member function ReadAINcode
+ *         // TODO1: CODE GENERATOR: example code: member function ReadAINcode
+ *         // Read raw ADC codes from device into AINcode[] and RAW_misoData16[]
+ *         // @pre one of the MAX11311_Scan functions was called, setting g_MAX11131_device.NumWords
+ *         g_MAX11131_device.ReadAINcode();
+ *         // @post RAW_misoData16[index] contains the raw SPI Master-In,Slave-Out data
+ *         // @post AINcode[NUM_CHANNELS] contains the latest readings in LSBs
+ *
+ *         wait(3.0);
+ *     }
+ * }
+ * @endcode
+ * //---------- CODE GENERATOR: end testMainCppCodeList
+ */
+class MAX11131 {
+public:
+// CODE GENERATOR: TypedefEnum EnumItem declarations
+// CODE GENERATOR: TypedefEnum MAX11131_SCAN_enum_t
+    //----------------------------------------
+    /// ADC_MODE_CONTROL.SCAN[3:0] ADC Scan Control (command)
+    typedef enum MAX11131_SCAN_enum_t {
+        SCAN_0000_NOP = 0x00, //!< 8'b00000000
+        SCAN_0001_Manual = 0x01, //!< 8'b00000001
+        SCAN_0010_Repeat = 0x02, //!< 8'b00000010
+        SCAN_0011_StandardInternalClock = 0x03, //!< 8'b00000011
+        SCAN_0100_StandardExternalClock = 0x04, //!< 8'b00000100
+        SCAN_0101_UpperInternalClock = 0x05, //!< 8'b00000101
+        SCAN_0110_UpperExternalClock = 0x06, //!< 8'b00000110
+        SCAN_0111_CustomInternalClock = 0x07, //!< 8'b00000111
+        SCAN_1000_CustomExternalClock = 0x08, //!< 8'b00001000
+        SCAN_1001_SampleSetExternalClock = 0x09, //!< 8'b00001001
+    } MAX11131_SCAN_enum_t;
+
+// CODE GENERATOR: TypedefEnum MAX11131_RESET_enum_t
+    //----------------------------------------
+    /// ADC_MODE_CONTROL.RESET[1:0] Reset 0=Normal 1=ResetFIFO 2=ResetAllRegisters 3=reserved
+    typedef enum MAX11131_RESET_enum_t {
+        RESET_00_Normal = 0x00, //!< 8'b00000000
+        RESET_01_ResetFIFO = 0x01, //!< 8'b00000001
+        RESET_10_ResetAllRegisters = 0x02, //!< 8'b00000010
+    } MAX11131_RESET_enum_t;
+
+// CODE GENERATOR: TypedefEnum MAX11131_PM_enum_t
+    //----------------------------------------
+    /// ADC_MODE_CONTROL.PM[1:0] Power Management 0=Normal, 1=AutoShutdown, 2=AutoStandby 3=reserved
+    typedef enum MAX11131_PM_enum_t {
+        PM_00_Normal = 0x00, //!< 8'b00000000
+        PM_01_AutoShutdown = 0x01, //!< 8'b00000001
+        PM_10_AutoStandby = 0x02, //!< 8'b00000010
+    } MAX11131_PM_enum_t;
+
+// TODO1: CODE GENERATOR: ic_variant -- IC's supported with this driver
+    /**
+     * @brief IC's supported with this driver
+     * @details MAX11131
+     */
+    typedef enum
+    {
+        MAX11131_IC = 0,
+        //MAX11131_IC = 1
+    } MAX11131_ic_t;
+
+// TODO1: CODE GENERATOR: class constructor declaration
+    /**********************************************************//**
+    * @brief Constructor for MAX11131 Class.
+    *
+    * @details Requires an existing SPI object as well as a DigitalOut object.
+    * The DigitalOut object is used for a chip enable signal
+    *
+    * On Entry:
+    *     @param[in] spi - pointer to existing SPI object
+    *     @param[in] cs_pin - pointer to a DigitalOut pin object
+    *     CODE GENERATOR: class constructor docstrings gpio InputPin pins
+    *     @param[in] CNVST_pin - pointer to a DigitalOut pin object
+    *     CODE GENERATOR: class constructor docstrings gpio OutputPin pins
+    *     @param[in] EOC_pin - pointer to a DigitalIn pin object
+    *     @param[in] ic_variant - which type of MAX11131 is used
+    *
+    * On Exit:
+    *
+    * @return None
+    **************************************************************/
+    MAX11131(SPI &spi, DigitalOut &cs_pin, // SPI interface
+            // CODE GENERATOR: class constructor declaration gpio InputPin pins
+            DigitalOut &CNVST_pin, // Digital Trigger Input to MAX11131 device
+            // AnalogOut &REF__pin, // Reference Input to MAX11131 device
+            // AnalogOut &REF__AIN15_pin, // Reference Input to MAX11131 device
+            // CODE GENERATOR: class constructor declaration gpio OutputPin pins
+            DigitalIn &EOC_pin, // Digital Event Output from MAX11131 device
+            MAX11131_ic_t ic_variant);
+
+// CODE GENERATOR: class destructor declaration
+    /************************************************************
+     * @brief Default destructor for MAX11131 Class.
+     *
+     * @details Destroys SPI object if owner
+     *
+     * On Entry:
+     *
+     * On Exit:
+     *
+     * @return None
+     **************************************************************/
+    ~MAX11131();
+
+    // CODE GENERATOR: spi_frequency setter declaration
+    // set SPI SCLK frequency
+    void spi_frequency(int spi_sclk_Hz);
+
+//----------------------------------------
+// CODE GENERATOR: omit typedef enum MAX11131_device_t, class members instead of global device object
+public:
+
+    /// shadow of write-only register ADC_MODE_CONTROL
+    /// mosiData16 0x0000..0x7FFF format: 0 SCAN[3:0] CHSEL[3:0] RESET[1:0] PM[1:0] CHAN_ID SWCNV 0
+    int16_t ADC_MODE_CONTROL;
+
+    /// shadow of write-only register ADC_CONFIGURATION
+    /// mosiData16 0x8000..0x87FF format: 1 0 0 0 0 REFSEL AVGON NAVG[1:0] NSCAN[1:0] SPM[1:0] ECHO 0 0
+    int16_t ADC_CONFIGURATION;
+
+    /// shadow of write-only register UNIPOLAR
+    /// mosiData16 0x8800..0x8FFF format: 1 0 0 0 1 UCH0/1 UCH2/3 UCH4/5 UCH6/7 UCH8/9 UCH10/11 UCH12/13 UCH14/15 PDIFF_COM x x
+    int16_t UNIPOLAR;
+
+    /// shadow of write-only register BIPOLAR
+    /// mosiData16 0x9000..0x97FF format: 1 0 0 1 0 BCH0/1 BCH2/3 BCH4/5 BCH6/7 BCH8/9 BCH10/11 BCH12/13 BCH14/15 x x x
+    int16_t BIPOLAR;
+
+    /// shadow of write-only register RANGE
+    /// mosiData16 0x9800..0x9FFF format: 1 0 0 1 1 RANGE0/1 RANGE2/3 RANGE4/5 RANGE6/7 RANGE8/9 RANGE10/11 RANGE12/13 RANGE14/15 x x x
+    int16_t RANGE;
+
+    /// shadow of write-only register CSCAN0
+    /// mosiData16 0xA000..0xA7FF format: 1 0 1 0 0 CHSCAN15 CHSCAN14 CHSCAN13 CHSCAN12 CHSCAN11 CHSCAN10 CHSCAN9 CHSCAN8 x x x
+    int16_t CSCAN0;
+
+    /// shadow of write-only register CSCAN1
+    /// mosiData16 0xA800..0xAFFF format: 1 0 1 0 1 CHSCAN7 CHSCAN6 CHSCAN5 CHSCAN4 CHSCAN3 CHSCAN2 CHSCAN1 CHSCAN0 x x x
+    int16_t CSCAN1;
+
+    /// shadow of write-only register SAMPLESET
+    /// mosiData16 0xB000..0xB7FF format: 1 0 1 1 0 SEQ_LENGTH[7:0] x x x followed by enabledChannelsPattern.
+    /// NOTE: Send the sampleset pattern, with 4 entries packed into each 16-bit SPI word. Pad unused entries with 0.
+    /// NOTE: Keep CS low during the entire enabledChannelsPattern entry.
+    int16_t SAMPLESET;
+
+    /// unpacked SAMPLESET.SEQ_LENGTH[7:0] determines length of pattern
+    /// NOTE: SAMPLESET.SEQ_LENGTH[7:0] is the number of channel entries in the pattern.
+    /// NOTE: Each channel entry is 4 bits. The first 4 bits are the first channel in the sequence.
+    /// NOTE: Channels can be repeated in any arbitrary order.
+    /// NOTE: The channel entry pattern is sent immediately after writing SAMPLESET.
+    uint8_t enabledChannelsPatternLength_1_256;
+
+    /// unpacked shadow of write-only register SAMPLESET enabledChannelsPattern.
+    /// Each entry is a channel number between 0 and 15.
+    uint8_t enabledChannelsPattern[256];
+
+    /// Diagnostic: what is the meaning of SPI Master Out data.
+    /// 0:Nothing 1:regWrite 2:sampleSetPattern
+    uint8_t SPI_MOSI_Semantic;
+
+    /// number of ScanRead() words needed to retrieve all measurements.
+    uint16_t NumWords;
+
+    /// Is the currently configured mode external or internal clock. 1:External Clock 0:Internal Clock
+    uint8_t isExternalClock;
+
+    /// unpacked ADC_MODE_CONTROL.SCAN[3:0] Scan Mode MAX11131_SCAN_enum_t
+    uint8_t ScanMode;
+
+    /// unpacked ADC_MODE_CONTROL.CHSEL[3:0] Analog Input Channel Select
+    uint8_t channelNumber_0_15;
+
+    /// unpacked ADC_MODE_CONTROL.PM[1:0] Power Management MAX11131_PM_enum_t
+    uint8_t PowerManagement_0_2;
+
+    /// unpacked ADC_MODE_CONTROL.CHAN_ID
+    uint8_t chan_id_0_1;
+
+    /// unpacked ADC_CONFIGURATION.AVG and ADC_CONFIGURATION.NAVG[1:0] may be 0, 4, 8, 16, or 32
+    uint8_t average_0_4_8_16_32;
+
+    /// unpacked ADC_CONFIGURATION.NSCAN[1:0] may be 4, 8, 12, or 16
+    uint8_t nscan_4_8_12_16;
+
+    /// unpacked ADC_MODE_CONTROL.SWCNV
+    uint8_t swcnv_0_1;
+
+    /// unpacked CSCAN0 and CSCAN1
+    int16_t enabledChannelsMask;
+
+    /// Each channel's most recent value in LSBs.
+    /// Updated by ReadAINcode function.
+    /// Use VoltageOfCode function to convert LSBs to physical voltage.
+    uint16_t AINcode[16];
+
+    /// SPI master-in slave-out data.
+    /// Updated by ReadAINcode function.
+    /// SampleSet mode allows up to 256 channel entry selections.
+    int16_t RAW_misoData16[256];
+
+    /// reference voltage, in Volts
+    double VRef;
+
+// CODE GENERATOR: omit global g_MAX11131_device
+
+// CODE GENERATOR: extern function declarations
+// CODE GENERATOR: extern function declaration SPIoutputCS
+//----------------------------------------
+// Assert SPI Chip Select
+// SPI chip-select for MAX11131
+//
+    void SPIoutputCS(int isLogicHigh);
+
+// CODE GENERATOR: extern function declaration SPIwrite16bits
+//----------------------------------------
+// SPI write 16 bits
+// SPI interface to MAX11131 shift 16 bits mosiData16 into MAX11131 DIN
+// ignoring MAX11131 DOUT
+//
+    void SPIwrite16bits(int16_t mosiData16);
+
+// CODE GENERATOR: extern function declaration SPIwrite24bits
+//----------------------------------------
+// SPI write 17-24 bits
+// SPI interface to MAX11131 shift 16 bits mosiData16 into MAX11131 DIN
+// followed by one additional SCLK byte.
+// ignoring MAX11131 DOUT
+//
+    void SPIwrite24bits(int16_t mosiData16_FFFF00, int8_t mosiData8_0000FF);
+
+// CODE GENERATOR: extern function declaration SPIread16bits
+//----------------------------------------
+// SPI read 16 bits while MOSI (MAX11131 DIN) is 0
+// SPI interface to capture 16 bits miso data from MAX11131 DOUT
+//
+    int16_t SPIread16bits();
+
+// CODE GENERATOR: extern function declaration CNVSToutputPulseLow
+//----------------------------------------
+// Assert MAX11131 CNVST convert start.
+// Required when using any of the InternalClock modes with SWCNV 0.
+// Trigger measurement by driving CNVST/AIN14 pin low for a minimum active-low pulse duration of 5ns. (AIN14 is not available)
+//
+    void CNVSToutputPulseLow();
+
+// CODE GENERATOR: extern function declaration EOCinputWaitUntilLow
+//----------------------------------------
+// Wait for MAX11131 EOC pin low, indicating end of conversion.
+// Required when using any of the InternalClock modes.
+//
+    void EOCinputWaitUntilLow();
+
+// CODE GENERATOR: extern function declaration EOCinputValue
+//----------------------------------------
+// Return the status of the MAX11131 EOC pin.
+//
+    int EOCinputValue();
+
+// CODE GENERATOR: class member data
+private:
+// CODE GENERATOR: class member data for SPI interface
+    // SPI object
+    SPI &m_spi;
+    int m_SPI_SCLK_Hz;
+    int m_SPI_dataMode;
+    int m_SPI_cs_state;
+
+    // Selector pin object
+    DigitalOut &m_cs_pin;
+
+// CODE GENERATOR: class member data for gpio InputPin pins
+// InputPin Name = CNVST
+// InputPin Description = Active-Low Conversion Start Input/Analog Input 14
+// InputPin Function = Trigger
+    DigitalOut &m_CNVST_pin;
+//
+// InputPin Name = REF+
+// InputPin Description = External Positive Reference Input. Apply a reference voltage at REF+. Bypass to GND with a 0.47uF capacitor.
+// InputPin Function = Reference
+    // AnalogOut &m_REF__pin;
+//
+// InputPin Name = REF-/AIN15
+// InputPin Description = External Differential Reference Negative Input/Analog Input 15
+// InputPin Function = Reference
+    // AnalogOut &m_REF__AIN15_pin;
+//
+// CODE GENERATOR: class member data for gpio OutputPin pins
+// OutputPin Name = EOC
+// OutputPin Description = End of Conversion Output. Data is valid after EOC pulls low (Internal clock mode only).
+// OutputPin Function = Event
+    DigitalIn &m_EOC_pin;
+//
+
+    // Identifies which IC variant is being used
+    MAX11131_ic_t m_ic_variant;
+
+public:
+
+// CODE GENERATOR: class member function declarations
+    //----------------------------------------
+    /// Initialize device
+    void Init(void);
+
+    //----------------------------------------
+    /// ADC Channels AIN(channelId), AIN(channelId+1) = Both Single-Ended, Unipolar
+    /// Full Scale = VREF
+    /// Voltage per LSB count = VREF/4096
+    /// AIN(channelId) is a Single-Ended input using Unipolar transfer function.
+    /// AIN(channelId+1) is a Single-Ended input using Unipolar transfer function.
+    /// If PDIFF_COM_1, both are Pseudo-Differential with REF- as common.
+    /// AIN(channelId) voltage must always be between 0 and VREF.
+    /// AIN(channelId+1) voltage must always be between 0 and VREF.
+    ///
+    void Reconfigure_SingleEnded(int channelNumber_0_15);
+
+    //----------------------------------------
+    /// ADC Channels AIN(channelId), AIN(channelId+1) = Differential Unipolar (AIN(channelId) > AIN(channelId+1))
+    /// Full Scale = VREF
+    /// Voltage per LSB count = VREF/4096
+    /// AIN(channelId), AIN(channelId+1) are a Differential pair using Unipolar transfer function.
+    /// AIN(channelId) voltage must always be between 0 and VREF.
+    /// AIN(channelId+1) voltage must always be between 0 and VREF.
+    ///
+    void Reconfigure_DifferentialUnipolar(int channelNumber_0_15);
+
+    //----------------------------------------
+    /// ADC Channels AIN(channelId), AIN(channelId+1) = Differential Bipolar
+    /// Full Scale = VREF
+    /// Voltage per LSB count = VREF/4096
+    /// AIN(channelId), AIN(channelId+1) are a Differential pair using Bipolar transfer function with range ±½Vref
+    /// AIN(channelId) voltage must always be between 0 and VREF.
+    /// AIN(channelId+1) voltage must always be between 0 and VREF.
+    ///
+    void Reconfigure_DifferentialBipolarFSVref(int channelNumber_0_15);
+
+    //----------------------------------------
+    /// ADC Channels AIN(channelId), AIN(channelId+1) = Differential Bipolar
+    /// Full Scale = 2 * VREF
+    /// Voltage per LSB count = VREF/2048
+    /// AIN(channelId), AIN(channelId+1) are a Differential pair using Bipolar transfer function with range ±Vref
+    /// AIN(channelId) voltage must always be between 0 and VREF.
+    /// AIN(channelId+1) voltage must always be between 0 and VREF.
+    ///
+    void Reconfigure_DifferentialBipolarFS2Vref(int channelNumber_0_15);
+
+    //----------------------------------------
+    /// SCAN_0000_NOP
+    ///
+    /// Shift 16 bits out of ADC, without changing configuration.
+    /// Note: @return data format depends on CHAN_ID bit:
+    ///     "CH[3:0] DATA[11:0]" when CHAN_ID = 1, or
+    ///     "0 DATA[11:0] x x x" when CHAN_ID = 0.
+    int16_t ScanRead(void);
+
+    //----------------------------------------
+    /// SCAN_0000_NOP
+    ///
+    /// Read raw ADC codes from device into AINcode[] and RAW_misoData16[].
+    /// If internal clock mode with SWCNV=0, measurements will be triggered using CNVST pin.
+    ///
+    /// @pre one of the Scan functions was called, setting g_MAX11131_device.NumWords
+    /// @post g_MAX11131_device.RAW_misoData16[index] contains the raw SPI Master-In,Slave-Out data
+    /// @post g_MAX11131_device.AINcode[NUM_CHANNELS] contains the latest readings in LSBs
+    ///
+    void ReadAINcode(void);
+
+    //----------------------------------------
+    /// Sign-Extend a right-aligned MAX11131 code into a signed 2's complement value.
+    /// Supports the bipolar transfer functions.
+    /// @param[in] value_u12: raw 12-bit MAX11131 code (right justified).
+    /// @return sign-extended 2's complement value.
+    ///
+    int32_t TwosComplementValue(uint32_t regValue);
+
+    //----------------------------------------
+    /// Return the physical voltage corresponding to MAX11131 code.
+    /// Does not perform any offset or gain correction.
+    /// @pre g_MAX11131_device.VRef = Voltage of REF input, in Volts
+    /// @param[in] value_u12: raw 12-bit MAX11131 code (right justified).
+    /// @param[in] channelId: AIN channel number.
+    /// @return physical voltage corresponding to MAX11131 code.
+    ///
+    double VoltageOfCode(int16_t value_u12, int channelId);
+
+    //----------------------------------------
+    /// SCAN_0001_Manual
+    ///
+    /// Measure ADC channel channelNumber_0_15 once.
+    /// External clock mode.
+    /// @param[in] g_MAX11131_device.channelNumber_0_15: AIN Channel Number
+    /// @param[in] g_MAX11131_device.PowerManagement_0_2: 0=Normal, 1=AutoShutdown, 2=AutoStandby
+    /// @param[in] g_MAX11131_device.chan_id_0_1: ADC_MODE_CONTROL.CHAN_ID
+    /// @return number of ScanRead() words needed to retrieve the data.
+    /// For external clock modes, the data format depends on CHAN_ID.
+    ///     when CHAN_ID = 0: misoData16 = 0 DATA[11:0] x x x
+    ///     when CHAN_ID = 1: misoData16 = CH[3:0] DATA[11:0]
+    ///
+    int ScanManual(void);
+
+    //----------------------------------------
+    /// SCAN_0010_Repeat
+    ///
+    /// Measure ADC channel channelNumber_0_15 repeatedly with averaging.
+    /// Internal clock mode.
+    /// @param[in] g_MAX11131_device.channelNumber_0_15: AIN Channel Number
+    /// @param[in] g_MAX11131_device.average_0_4_8_16_32: Number of samples averaged per ScanRead() word.
+    ///     average_0_4_8_16_32=0 to disable averaging.
+    /// @param[in] g_MAX11131_device.nscan_4_8_12_16: Number of ScanRead() words to report.
+    /// @param[in] g_MAX11131_device.swcnv_0_1: ADC_MODE_CONTROL.SWCNV
+    ///     SWCNV=0: trigger measurement by driving CNVST pin low.
+    ///         Minimum active-low pulse duration of 5ns. (AIN14 is not available)
+    ///     SWCNV=1: trigger measurement on SPI CS rising edge.
+    ///         CS must be held low for minimum of 17 SCLK cycles.
+    ///         CNVST pin is not used. (AIN14 is available)
+    /// @param[in] g_MAX11131_device.PowerManagement_0_2: 0=Normal, 1=AutoShutdown, 2=AutoStandby
+    /// @return number of ScanRead() words needed to retrieve the data.
+    /// For internal clock modes, the data format always includes the channel address.
+    ///     misoData16 = CH[3:0] DATA[11:0]
+    ///
+    int ScanRepeat(void);
+
+    //----------------------------------------
+    /// SCAN_0011_StandardInternalClock
+    ///
+    /// Measure ADC channels in sequence from AIN0 to channelNumber_0_15.
+    /// Internal clock mode.
+    /// @param[in] g_MAX11131_device.channelNumber_0_15: AIN Channel Number
+    /// @param[in] g_MAX11131_device.average_0_4_8_16_32: Number of samples averaged per ScanRead() word.
+    ///     average_0_4_8_16_32=0 to disable averaging.
+    /// @param[in] g_MAX11131_device.PowerManagement_0_2: 0=Normal, 1=AutoShutdown, 2=AutoStandby
+    /// @param[in] g_MAX11131_device.swcnv_0_1: ADC_MODE_CONTROL.SWCNV
+    ///     SWCNV=0: trigger measurement by driving CNVST pin low.
+    ///         Minimum active-low pulse duration of 5ns. (AIN14 is not available)
+    ///     SWCNV=1: trigger measurement on SPI CS rising edge.
+    ///         CS must be held low for minimum of 17 SCLK cycles.
+    ///         CNVST pin is not used. (AIN14 is available)
+    /// @return number of ScanRead() words needed to retrieve the data.
+    /// For internal clock modes, the data format always includes the channel address.
+    ///     misoData16 = CH[3:0] DATA[11:0]
+    ///
+    int ScanStandardInternalClock(void);
+
+    //----------------------------------------
+    /// SCAN_0100_StandardExternalClock
+    ///
+    /// Measure ADC channels in sequence from AIN0 to channelNumber_0_15.
+    /// External clock mode.
+    /// @param[in] g_MAX11131_device.channelNumber_0_15: AIN Channel Number
+    /// @param[in] g_MAX11131_device.PowerManagement_0_2: 0=Normal, 1=AutoShutdown, 2=AutoStandby
+    /// @param[in] g_MAX11131_device.chan_id_0_1: ADC_MODE_CONTROL.CHAN_ID
+    /// @return number of ScanRead() words needed to retrieve the data.
+    /// For external clock modes, the data format depends on CHAN_ID.
+    ///     when CHAN_ID = 0: misoData16 = 0 DATA[11:0] x x x
+    ///     when CHAN_ID = 1: misoData16 = CH[3:0] DATA[11:0]
+    ///
+    int ScanStandardExternalClock(void);
+
+    //----------------------------------------
+    /// SCAN_0101_UpperInternalClock
+    ///
+    /// Measure ADC channels in sequence from channelNumber_0_15 to AIN15.
+    /// Internal clock mode.
+    /// @param[in] g_MAX11131_device.channelNumber_0_15: AIN Channel Number
+    /// @param[in] g_MAX11131_device.average_0_4_8_16_32: Number of samples averaged per ScanRead() word.
+    ///     average_0_4_8_16_32=0 to disable averaging.
+    /// @param[in] g_MAX11131_device.PowerManagement_0_2: 0=Normal, 1=AutoShutdown, 2=AutoStandby
+    /// @param[in] g_MAX11131_device.swcnv_0_1: ADC_MODE_CONTROL.SWCNV
+    ///     SWCNV=0: trigger measurement by driving CNVST pin low.
+    ///         Minimum active-low pulse duration of 5ns. (AIN14 is not available)
+    ///     SWCNV=1: trigger measurement on SPI CS rising edge.
+    ///         CS must be held low for minimum of 17 SCLK cycles.
+    ///         CNVST pin is not used. (AIN14 is available)
+    /// @return number of ScanRead() words needed to retrieve the data.
+    /// For internal clock modes, the data format always includes the channel address.
+    ///     misoData16 = CH[3:0] DATA[11:0]
+    ///
+    int ScanUpperInternalClock(void);
+
+    //----------------------------------------
+    /// SCAN_0110_UpperExternalClock
+    ///
+    /// Measure ADC channels in sequence from channelNumber_0_15 to AIN15.
+    /// External clock mode.
+    /// @param[in] g_MAX11131_device.channelNumber_0_15: AIN Channel Number
+    /// @param[in] g_MAX11131_device.PowerManagement_0_2: 0=Normal, 1=AutoShutdown, 2=AutoStandby
+    /// @param[in] g_MAX11131_device.chan_id_0_1: ADC_MODE_CONTROL.CHAN_ID
+    /// @return number of ScanRead() words needed to retrieve the data.
+    /// For external clock modes, the data format depends on CHAN_ID.
+    ///     when CHAN_ID = 0: misoData16 = 0 DATA[11:0] x x x
+    ///     when CHAN_ID = 1: misoData16 = CH[3:0] DATA[11:0]
+    ///
+    int ScanUpperExternalClock(void);
+
+    //----------------------------------------
+    /// SCAN_0111_CustomInternalClock
+    ///
+    /// Measure selected ADC channels in sequence from AIN0 to AIN15,
+    ///     using only the channels enabled by enabledChannelsMask.
+    ///     Bit 0x0001 enables AIN0.
+    ///     Bit 0x0002 enables AIN1.
+    ///     Bit 0x0004 enables AIN2.
+    ///     Bit 0x0008 enables AIN3.
+    ///     Bit 0x0010 enables AIN4.
+    ///     Bit 0x0020 enables AIN5.
+    ///     Bit 0x0040 enables AIN6.
+    ///     Bit 0x0080 enables AIN7.
+    ///     Bit 0x0100 enables AIN8.
+    ///     Bit 0x0200 enables AIN9.
+    ///     Bit 0x0400 enables AIN10.
+    ///     Bit 0x0800 enables AIN11.
+    ///     Bit 0x1000 enables AIN12.
+    ///     Bit 0x2000 enables AIN13.
+    ///     Bit 0x4000 enables AIN14.
+    ///     Bit 0x8000 enables AIN15.
+    /// Internal clock mode.
+    /// @param[in] g_MAX11131_device.enabledChannelsMask: Bitmap of AIN Channels to scan.
+    /// @param[in] g_MAX11131_device.average_0_4_8_16_32: Number of samples averaged per ScanRead() word.
+    ///     average_0_4_8_16_32=0 to disable averaging.
+    /// @param[in] g_MAX11131_device.PowerManagement_0_2: 0=Normal, 1=AutoShutdown, 2=AutoStandby
+    /// @param[in] g_MAX11131_device.swcnv_0_1: ADC_MODE_CONTROL.SWCNV
+    ///     SWCNV=0: trigger measurement by driving CNVST pin low.
+    ///         Minimum active-low pulse duration of 5ns. (AIN14 is not available)
+    ///     SWCNV=1: trigger measurement on SPI CS rising edge.
+    ///         CS must be held low for minimum of 17 SCLK cycles.
+    ///         CNVST pin is not used. (AIN14 is available)
+    /// @return number of ScanRead() words needed to retrieve the data.
+    /// For internal clock modes, the data format always includes the channel address.
+    ///     misoData16 = CH[3:0] DATA[11:0]
+    ///
+    int ScanCustomInternalClock(void);
+
+    //----------------------------------------
+    /// SCAN_1000_CustomExternalClock
+    ///
+    /// Measure selected ADC channels in sequence from AIN0 to AIN15,
+    ///     using only the channels enabled by enabledChannelsMask.
+    ///     Bit 0x0001 enables AIN0.
+    ///     Bit 0x0002 enables AIN1.
+    ///     Bit 0x0004 enables AIN2.
+    ///     Bit 0x0008 enables AIN3.
+    ///     Bit 0x0010 enables AIN4.
+    ///     Bit 0x0020 enables AIN5.
+    ///     Bit 0x0040 enables AIN6.
+    ///     Bit 0x0080 enables AIN7.
+    ///     Bit 0x0100 enables AIN8.
+    ///     Bit 0x0200 enables AIN9.
+    ///     Bit 0x0400 enables AIN10.
+    ///     Bit 0x0800 enables AIN11.
+    ///     Bit 0x1000 enables AIN12.
+    ///     Bit 0x2000 enables AIN13.
+    ///     Bit 0x4000 enables AIN14.
+    ///     Bit 0x8000 enables AIN15.
+    /// External clock mode.
+    /// @param[in] g_MAX11131_device.enabledChannelsMask: Bitmap of AIN Channels to scan.
+    /// @param[in] g_MAX11131_device.PowerManagement_0_2: 0=Normal, 1=AutoShutdown, 2=AutoStandby
+    /// @param[in] g_MAX11131_device.chan_id_0_1: ADC_MODE_CONTROL.CHAN_ID
+    /// @return number of ScanRead() words needed to retrieve the data.
+    /// For external clock modes, the data format depends on CHAN_ID.
+    ///     when CHAN_ID = 0: misoData16 = 0 DATA[11:0] x x x
+    ///     when CHAN_ID = 1: misoData16 = CH[3:0] DATA[11:0]
+    ///
+    int ScanCustomExternalClock(void);
+
+    //----------------------------------------
+    /// SCAN_1001_SampleSetExternalClock
+    ///
+    /// Measure ADC channels in an arbitrary pattern.
+    ///     Channels can be visited in any order, with repetition allowed.
+    /// External clock mode.
+    /// @pre g_MAX11131_device.enabledChannelsPatternLength_1_256: number of channel selections
+    /// @pre g_MAX11131_device.enabledChannelsPattern: array containing channel selection pattern
+    ///     In the array, one channel select per byte.
+    ///     In the SPI interface, immediately after SAMPLESET register is written,
+    ///     each byte encodes two channelNumber selections.
+    ///     The high 4 bits encode the first channelNumber.
+    ///     (((enabledChannelsPattern[0]) & 0x0F) << 4) | ((enabledChannelsPattern[1]) & 0x0F)
+    ///     If it is an odd number of channels, additional nybbles will be ignored.
+    ///     CS will be asserted low during the entire SAMPLESET pattern selection.
+    /// @param[in] g_MAX11131_device.PowerManagement_0_2: 0=Normal, 1=AutoShutdown, 2=AutoStandby
+    /// @param[in] g_MAX11131_device.chan_id_0_1: ADC_MODE_CONTROL.CHAN_ID
+    /// @return number of ScanRead() words needed to retrieve the data.
+    /// For external clock modes, the data format depends on CHAN_ID.
+    ///     when CHAN_ID = 0: misoData16 = 0 DATA[11:0] x x x
+    ///     when CHAN_ID = 1: misoData16 = CH[3:0] DATA[11:0]
+    ///
+    int ScanSampleSetExternalClock(void);
+
+    //----------------------------------------
+    /// Example configure and perform some measurements in ScanManual mode.
+    /// @param[out] pd_mean = address for double mean (avearge)
+    /// @param[out] pd_variance = address for double variance (variance)
+    /// @param[out] pd_stddev = address for double stddev (standard deviation)
+    /// @param[out] pd_Sx = address for double Sx (sum of all X)
+    /// @param[out] pd_Sxx = address for double Sxx (sum of squares of each X)
+    void Example_ScanManual(int channelNumber_0_15, int nWords, 
+  double* pd_mean, double* pd_variance, double* pd_stddev, 
+  double* pd_Sx, double* pd_Sxx);
+
+}; // end of class MAX11131
+
+#endif // __MAX11131_H__
+
+// End of file
+