MAX11410 high speed 24-bit Delta-Sigma ADC

Dependents:   MAX11410BOB_24bit_ADC MAX11410BOB_Serial_Tester

Revision:
23:22e7830bcccb
Parent:
22:c6812214a933
Child:
24:428b7670e45f
--- a/MAX11410.cpp	Mon Apr 13 02:59:22 2020 +0000
+++ b/MAX11410.cpp	Mon Apr 13 11:14:55 2020 +0000
@@ -446,8 +446,8 @@
 // @future test tinyTester.print("POR value 0x0d CMD_r000_1101_dddd_dddd_MUX_CTRL2")
 // @test group POR RegRead(MAX11410::CMD_r000_1101_dddd_dddd_MUX_CTRL2, buffer) expect 1 expect-buffer 0x00
 //
-// @future test tinyTester.print("POR value 0x0e CMD_r000_1110_xxdd_xddd_PGA")
-// @test group POR RegRead(MAX11410::CMD_r000_1110_xxdd_xddd_PGA, buffer) expect 1 expect-buffer 0x00
+// @future test tinyTester.print("POR value 0x0e CMD_r000_1110_00ss_0ggg_PGA")
+// @test group POR RegRead(MAX11410::CMD_r000_1110_00ss_0ggg_PGA, buffer) expect 1 expect-buffer 0x00
 //
 // @future test     CMD_r000_1111_dddd_dddd_WAIT_EXT = 0x0f, //!< 0b0001111
 // @future test     CMD_r001_0000_xxxx_xxxx_WAIT_START = 0x10, //!< 0b0010000
@@ -461,21 +461,18 @@
 // @test group RES1KA0A1TOGNDMORE RegWrite(0x0A, 0x03) expect 1 // *source=0x03 idac_mode=100uA, 1k resistor 0.1V
 // @test group RES1KA0A1TOGNDMORE tinyTester.print("idac_mode=100uA, 1k resistor 0.1V")
 // @test group RES1KA0A1TOGNDMORE tinyTester.Wait_Output_Settling()
-// @test group RES1KA0A1TOGND_BAD Measure_Voltage(0,10) // TODO1 #175 MAX11410 Self Test why does Measure_Voltage(0,10) without expect cause an mbed hard fault?
 // @test group RES1KA0A1TOGNDMORE Measure_Voltage(0,10) expect 0.1
 // @test group RES1KA0A1TOGNDMORE AINcode[0] expect (uint32_t)337731 within 33773 // idac_mode=100uA, 1k resistor 0.1V
 //
 // @test group RES1KA0A1TOGNDMORE RegWrite(0x0A, 0x0D) expect 1 // *source=0x0d idac_mode=800uA, 1k resistor 0.8V
 // @test group RES1KA0A1TOGNDMORE tinyTester.print("idac_mode=800uA, 1k resistor 0.8V")
 // @test group RES1KA0A1TOGNDMORE tinyTester.Wait_Output_Settling()
-// @test group RES1KA0A1TOGND_BAD Measure_Voltage(0,10) // TODO1 #175 MAX11410 Self Test why does Measure_Voltage(0,10) without expect cause an mbed hard fault?
 // @test group RES1KA0A1TOGNDMORE Measure_Voltage(0,10) expect 0.8
 // @test group RES1KA0A1TOGNDMORE AINcode[0] expect (uint32_t)2724467 within 33773 // idac_mode=800uA, 1k resistor 0.8V
 //
 // @test group RES1KA0A1TOGND RegWrite(0x0A, 0x0B) expect 1 // *source=0x0b idac_mode=400uA, 1k resistor 0.4V
 // @test group RES1KA0A1TOGNDMORE tinyTester.print("idac_mode=400uA, 1k resistor 0.4V")
 // @test group RES1KA0A1TOGND tinyTester.Wait_Output_Settling()
-// @test group RES1KA0A1TOGND_BAD Measure_Voltage(0,10) // TODO1 #175 MAX11410 Self Test why does Measure_Voltage(0,10) without expect cause an mbed hard fault?
 // @test group RES1KA0A1TOGND Measure_Voltage(0,10) expect 0.4
 // @test group RES1KA0A1TOGNDMORE AINcode[0] expect (uint32_t)1343163 within 33773 // idac_mode=400uA, 1k resistor 0.4V
 //
@@ -541,7 +538,7 @@
     ctrl = 0x01;
     
     //----------------------------------------
-    // set by Configure_PGA gain index register pga CMD_r000_1110_xxdd_xddd_PGA
+    // set by Configure_PGA gain index register pga CMD_r000_1110_00ss_0ggg_PGA
     pgaGain = 1;
     
     //----------------------------------------
@@ -562,6 +559,22 @@
     rtd_ms = 100;
     
     //----------------------------------------
+    // filter register configuration in Measure_RTD() -- 0x34 LINEF_11_SINC4 RATE_0100 output data rate 60SPS
+    rtd_filter = 0x34;
+    
+    //----------------------------------------
+    // ctrl register configuration in Measure_RTD() -- 0x40 unipolar, 0x01 REF_SEL_001_REF1P_REF1N
+    rtd_ctrl = 0x41;
+    
+    //----------------------------------------
+    // source register configuration in Measure_RTD() -- 0x0B IDAC_MODE_1011_400uA
+    rtd_source = 0x0B;
+    
+    //----------------------------------------
+    // pga register configuration in Measure_RTD() -- 0x21 SIG_PATH_10_PGA GAIN_001_2
+    rtd_pga = 0x21;
+    
+    //----------------------------------------
     // list of registers to be read by menu item * with no arguments
     static MAX11410::MAX11410_CMD_enum_t readAllStatusListValues[] = {
     MAX11410::CMD_r000_0000_xxxx_xxdd_PD,
@@ -578,7 +591,7 @@
     MAX11410::CMD_r000_1011_dddd_dddd_MUX_CTRL0,
     MAX11410::CMD_r000_1100_dddd_dddd_MUX_CTRL1,
     MAX11410::CMD_r000_1101_dddd_dddd_MUX_CTRL2,
-    MAX11410::CMD_r000_1110_xxdd_xddd_PGA,
+    MAX11410::CMD_r000_1110_00ss_0ggg_PGA,
     MAX11410::CMD_r000_1111_dddd_dddd_WAIT_EXT,
     MAX11410::CMD_r001_0000_xxxx_xxxx_WAIT_START,
     };
@@ -1019,7 +1032,7 @@
         case CMD_r000_1011_dddd_dddd_MUX_CTRL0:
         case CMD_r000_1100_dddd_dddd_MUX_CTRL1:
         case CMD_r000_1101_dddd_dddd_MUX_CTRL2:
-        case CMD_r000_1110_xxdd_xddd_PGA:
+        case CMD_r000_1110_00ss_0ggg_PGA:
         case CMD_r000_1111_dddd_dddd_WAIT_EXT:
         case CMD_r001_0000_xxxx_xxxx_WAIT_START:
             return 8;  // 8-bit register size
@@ -1194,7 +1207,7 @@
         case CMD_r000_1011_dddd_dddd_MUX_CTRL0: return "MUX_CTRL0";
         case CMD_r000_1100_dddd_dddd_MUX_CTRL1: return "MUX_CTRL1";
         case CMD_r000_1101_dddd_dddd_MUX_CTRL2: return "MUX_CTRL2";
-        case CMD_r000_1110_xxdd_xddd_PGA: return "PGA";
+        case CMD_r000_1110_00ss_0ggg_PGA: return "PGA";
         case CMD_r000_1111_dddd_dddd_WAIT_EXT: return "WAIT_EXT";
         case CMD_r001_0000_xxxx_xxxx_WAIT_START: return "WAIT_START";
         case CMD_r001_0001_xxxx_xxxx_xxxx_xxxx_xxxx_xddd_PART_ID: return "PART_ID";
@@ -1334,13 +1347,13 @@
 {
     
     //----------------------------------------
-    // pga gain 1, 2, 4, 8, 16, 32, 64, or 128 based on gain index in register pga CMD_r000_1110_xxdd_xddd_PGA
+    // pga gain 1, 2, 4, 8, 16, 32, 64, or 128 based on gain index in register pga CMD_r000_1110_00ss_0ggg_PGA
     static uint8_t pgaGainTable[8] = {1, 2, 4, 8, 16, 32, 64, 128};
     pgaGain = (sigpath == SIG_PATH_10_PGA) ? pgaGainTable[(uint8_t)gain] : 1;
     
     //----------------------------------------
     // write8 0x0E PGA
-    RegWrite(CMD_r000_1110_xxdd_xddd_PGA, (uint8_t)(0
+    RegWrite(CMD_r000_1110_00ss_0ggg_PGA, (uint8_t)(0
         | (((uint8_t)sigpath & 2) << 4)
         | (((uint8_t)gain    & 7) << 0)
         ));
@@ -1657,78 +1670,6 @@
 }
 
 //----------------------------------------
-// Configure Measurement for voltage input.
-//
-// Example code for typical voltage measurement.
-//
-// SPI register write sequence test AIN0-AGND voltage input using REF2=2.5V
-// write8 0x00 PD = 0x03 (Reset Registers; enter Standby mode)
-// write8 0x00 PD = 0x00 (NOP)
-// write8 0x08 FILTER = 0x34 to select RATE_0100, LINEF_11_SINC4 60SPS (given CONV_TYPE_01_Continuous )
-// write8 0x0B MUX_CTRL0 = 0x0A to select AINP=AIN0 and AINN=GND
-// write8 0x09 CTRL = 0x02 to select reference REF2P/REF2N; or CTRL = 0x1A to select reference REF2P/REF2N with reference input buffers enabled; Data Format = Bipolar 2's Complement
-// write8 0x0E PGA = 0x00 to select input path = Buffers, digital gain = 1V/V
-// write8 0x01 CONV_START = 0x01 to set Conversion Mode = Continuous
-// read24 0x80|0x38 STATUS (%SW 0xB8 0 0 0)
-// read24 0x80|0x30 DATA0 (%SW 0xB0 0 0 0)
-//
-// @param[in] ainp = channel high side, default=AINP_SEL_enum_t::AINP_SEL_0000_AIN0
-// @param[in] ainn = channel low side, default=AINN_SEL_enum_t::AINN_SEL_1010_GND
-//
-// @return 1 on success; 0 on failure
-uint8_t MAX11410::Configure_Voltage(MAX11410_AINP_SEL_enum_t ainp, MAX11410_AINN_SEL_enum_t ainn)
-{
-    
-    //----------------------------------------
-    // warning -- WIP work in progress
-    #warning "Not Tested Yet: MAX11410::Configure_Voltage..."
-    
-    //----------------------------------------
-    // write8 0x00 PD = 0x03 (Reset Registers; enter Standby mode)
-    RegWrite(CMD_r000_0000_xxxx_xxdd_PD, PD_11_Reset);
-    
-    //----------------------------------------
-    // write8 0x00 PD = 0x00 (NOP)
-    RegWrite(CMD_r000_0000_xxxx_xxdd_PD, PD_00_Normal);
-    
-    //----------------------------------------
-    // write8 0x08 FILTER = 0x34 to select RATE_0100, LINEF_11_SINC4 60SPS (given CONV_TYPE_01_Continuous)
-    Configure_FILTER((uint8_t) /* MAX11410::MAX11410_LINEF_enum_t:: */ LINEF_11_SINC4,
-                (uint8_t) /* MAX11410::MAX11410_RATE_enum_t:: */ RATE_0100);
-    
-    //----------------------------------------
-    // write8 0x0B MUX_CTRL0 = 0x0A to select AINP=AIN0 and AINN=GND
-    Configure_MUX_CTRL0((uint8_t)AINP_SEL_0000_AIN0, (uint8_t)AINN_SEL_1010_GND);
-    
-    //----------------------------------------
-    // write8 0x09 CTRL to select reference REF2P/REF2N; Data Format = Bipolar 2's Complement
-    Configure_CTRL(/*extclk*/ 0, /*u_bn*/ 0, /*format*/ 0,
-                /*refbufp_en*/ 0, /*refbufn_en*/ 0,
-                /*ref_sel*/ (uint8_t)REF_SEL_010_REF2P_REF2N);
-    
-    //----------------------------------------
-    // write8 0x0E PGA
-    Configure_PGA((uint8_t) /* MAX11410_SIG_PATH_enum_t:: */ SIG_PATH_00_BUFFERED, 
-                (uint8_t) /* MAX11410_GAIN_enum_t:: */ GAIN_000_1);
-    
-    //----------------------------------------
-    // write8 0x01 CONV_START = 0x01 to set Conversion Mode = Continuous
-    RegWrite(CMD_r000_0001_xddd_xxdd_CONV_START, 0x01);
-    
-    //----------------------------------------
-    // read24 0x80|0x38 STATUS (%SW 0xB8 0 0 0)
-    RegRead(CMD_r011_1000_dddd_dddd_dddd_dddd_dxxx_dddd_STATUS, &status);
-    
-    //----------------------------------------
-    // read24 0x80|0x30 DATA0 (%SW 0xB0 0 0 0)
-    RegRead(CMD_r011_0000_dddd_dddd_dddd_dddd_dddd_dddd_DATA0, &data0);
-    
-    //----------------------------------------
-    // success
-    return 1;
-}
-
-//----------------------------------------
 // Menu item '$' -> AINcode[0], AINcode[1], AINcode[2], AINcode[3], AINcode[4], AINcode[5], AINcode[6], AINcode[7], AINcode[8], AINcode[9], AINcode[10]
 //
 // Measure all ADC channels in sequence.
@@ -1863,6 +1804,8 @@
 //
 // @pre external connection REF1P-REF1N is a reference resistor
 // @pre ref1_v = reference resistance in ohms, default=4999
+// @pre rtd_filter = filter register configuration, 0x34 for LINEF_11_SINC4 RATE_0100 output data rate 60SPS
+// @pre rtd_ctrl = ctrl register configuration, 0x40 for ref0_v, 0x41 for ref1_v, 0x42 for ref2_v
 // @param[in] rtd_iout = channel RTD high side force, default=AINP_SEL_0111_AIN7
 // @param[in] rtd_ainp = channel RTD high side sense, default=AINP_SEL_1000_AIN8
 // @param[in] rtd_ainn = channel RTD low side, default=AINN_SEL_1001_AIN9
@@ -1896,19 +1839,17 @@
     }
     
     //----------------------------------------
-    // write8 0x08 FILTER = 0x34 to select RATE_0100, LINEF_11_SINC4 60SPS (given CONV_TYPE_01_Continuous)
-    Configure_FILTER((uint8_t) /* MAX11410::MAX11410_LINEF_enum_t:: */ LINEF_11_SINC4,
-                (uint8_t) /* MAX11410::MAX11410_RATE_enum_t:: */ RATE_0100);
+    // write8 0x08 FILTER to select output data rate
+    RegWrite(CMD_r000_1000_x0dd_dddd_FILTER, rtd_filter);
     
     //----------------------------------------
     // write8 0x09 CTRL to select reference resistor REF1P/REF1N; Data Format = Unipolar
-    Configure_CTRL(/*extclk*/ 0, /*u_bn*/ 1, /*format*/ 0,
-                /*refbufp_en*/ 0, /*refbufn_en*/ 0,
-                /*ref_sel*/ (uint8_t)REF_SEL_001_REF1P_REF1N);
+    RegWrite(CMD_r000_1001_dddd_dddd_CTRL, rtd_ctrl);
+    ctrl = rtd_ctrl;
     
     //----------------------------------------
-    // write8 0x0A SOURCE = 0x0B to select IDAC_MODE 400uA; AIN9=2.000V, AIN8(PT100)=2.040V, AIN8(PT1000)=2.400V
-    Configure_SOURCE(VBIAS_MODE_00_Active, BRN_MODE_00_disabled, IDAC_MODE_1011_400uA);
+    // write8 0x0A SOURCE to select IDAC_MODE 400uA; AIN9=2.000V, AIN8(PT100)=2.040V, AIN8(PT1000)=2.400V
+    RegWrite(CMD_r000_1010_dddd_dddd_SOURCE, rtd_source);
     
     //----------------------------------------
     // write8 0x0B MUX_CTRL0 = 0x89 to select AINP=AIN8 and AINN=AIN9
@@ -1919,9 +1860,10 @@
     Configure_MUX_CTRL1((uint8_t)IDAC1_SEL_1111_unconnected, (uint8_t)rtd_iout);
     
     //----------------------------------------
-    // write8 0x0E PGA
-    Configure_PGA((uint8_t) /* MAX11410_SIG_PATH_enum_t:: */ SIG_PATH_10_PGA, 
-                (uint8_t) /* MAX11410_GAIN_enum_t:: */ GAIN_001_2);
+    // write8 0x0E PGA and update pgaGain
+    Configure_PGA(
+            ((rtd_pga >> 4) & 2),   // sigpath
+            ( rtd_pga       & 7)); // gain
     
     //----------------------------------------
     // diagnostic GPIO pulse on GP1 during RTD power-up interval rtd_ms