Maxim Integrated MAX5171 14-bit Force/Sense DAC

Dependents:   MAX5171BOB_Tester MAX5171BOB_14bit_Remote_Sense_SPI_DAC MAX5171BOB_Serial_Tester

Files at this revision

API Documentation at this revision

Comitter:
whismanoid
Date:
Fri May 31 21:50:12 2019 +0000
Child:
1:e73245718b2a
Commit message:
MAX5171 initial commit

Changed in this revision

MAX5171.cpp Show annotated file Show diff for this revision Revisions of this file
MAX5171.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MAX5171.cpp	Fri May 31 21:50:12 2019 +0000
@@ -0,0 +1,570 @@
+// /*******************************************************************************
+// * 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 MAX5171.cpp
+// *********************************************************************
+// Device Driver file
+// DO NOT EDIT; except areas designated "CUSTOMIZE". Automatically generated file.
+// generated by XMLSystemOfDevicesToMBED.py
+// System Name = ExampleSystem
+// System Description = Device driver example
+
+#include "MAX5171.h"
+
+// Device Name = MAX5171
+// Device Description = Low-Power, Serial, 14-Bit, 1-Channel DACs with Force/Sense Voltage Output and SPI Interface
+// Device Manufacturer = Maxim Integrated
+// Device PartNumber = MAX5171AEEE+
+// Device RegValue_Width = DataWidth16bit_HL
+//
+// DAC NumChannels = 1
+// DAC ResolutionBits = 14
+//
+// SPI CS = ActiveLow
+// SPI FrameStart = CS
+// SPI CPOL = 0
+// SPI CPHA = 0
+// SPI MOSI and MISO Data are both stable on Rising edge of SCLK
+// SPI SCLK Idle Low
+// SPI SCLKMaxMHz = 10
+// SPI SCLKMinMHz = 0
+//
+// InputPin Name = FB
+// InputPin Description = Feedback Input
+// InputPin Function = Analog
+//
+// InputPin Name = RS
+// InputPin Description = Reset Mode Select (digital input). Connect to VDD to select midscale reset output value. Connect to DGND
+// to select 0 reset output value.
+// InputPin Function = Configuration
+//
+// InputPin Name = PDL#
+// InputPin Description = Power-Down Lockout (digital input). Connect to VDD to allow shutdown. Connect to DGND to disable shutdown.
+// InputPin Function = Configuration
+//
+// InputPin Name = CLR#
+// InputPin Description = Clear DAC (digital input). Clears the DAC to its predetermined output state as set by RS.
+// InputPin Function = Configuration
+//
+// InputPin Name = SHDN
+// InputPin Description = Shutdown (digital input). Pulling SHDN high when PDL = VDD places the chip in shutdown mode with a
+// maximum shutdown current 0f 10uA.
+// InputPin Function = Configuration
+//
+// OutputPin Name = OUT
+// OutputPin Description = Analog Voltage Output. High impedance in shutdown. Output voltage is limited to VDD.
+// OutputPin Function = Analog
+//
+// OutputPin Name = UPO
+// OutputPin Description = User-Programmable Output. State is set by serial input.
+// OutputPin Function = General-Purpose
+//
+// SupplyPin Name = VDD
+// SupplyPin Description = Positive Supply. Bypass to AGND with a 4.7uF capacitor in parallel with a 0.1uF capacitor.
+// SupplyPin VinMax = 4.50
+// SupplyPin VinMin = 5.50
+// SupplyPin Function = Analog
+//
+// SupplyPin Name = REF
+// SupplyPin Description = Reference Input. Maximum VREF is VDD - 1.4V. Connect an external +2.5V reference.
+// SupplyPin VinMax = VDD-1.4
+// SupplyPin VinMin = 0
+// SupplyPin Function = Analog
+//
+// SupplyPin Name = DGND
+// SupplyPin Description = Digital Ground.
+// SupplyPin VinMax = 0
+// SupplyPin VinMin = 0
+// SupplyPin Function = Analog
+//
+// SupplyPin Name = AGND
+// SupplyPin Description = Analog Ground.
+// SupplyPin VinMax = 0
+// SupplyPin VinMin = 0
+// SupplyPin Function = Analog
+//
+
+// CODE GENERATOR: class constructor definition
+MAX5171::MAX5171(SPI &spi, DigitalOut &cs_pin, // SPI interface
+                 // CODE GENERATOR: class constructor definition gpio InputPin pins
+                 // AnalogOut &FB_pin, // Analog Input to MAX5171 device
+                 DigitalOut &RS_pin, // Digital Configuration Input to MAX5171 device
+                 DigitalOut &PDLb_pin, // Digital Configuration Input to MAX5171 device
+                 DigitalOut &CLRb_pin, // Digital Configuration Input to MAX5171 device
+                 DigitalOut &SHDN_pin, // Digital Configuration Input to MAX5171 device
+                 // CODE GENERATOR: class constructor definition gpio OutputPin pins
+                 // AnalogIn &OUT_pin, // Analog Output from MAX5171 device
+                 DigitalIn &UPO_pin, // Digital General-Purpose Output from MAX5171 device
+                 // CODE GENERATOR: class constructor definition ic_variant
+                 MAX5171_ic_t ic_variant)
+    // CODE GENERATOR: class constructor initializer list
+    : m_spi(spi), m_cs_pin(cs_pin), // SPI interface
+    // CODE GENERATOR: class constructor initializer list gpio InputPin pins
+    // m_FB_pin(FB_pin), // Analog Input to MAX5171 device
+    m_RS_pin(RS_pin), // Digital Configuration Input to MAX5171 device
+    m_PDLb_pin(PDLb_pin), // Digital Configuration Input to MAX5171 device
+    m_CLRb_pin(CLRb_pin), // Digital Configuration Input to MAX5171 device
+    m_SHDN_pin(SHDN_pin), // Digital Configuration Input to MAX5171 device
+    // CODE GENERATOR: class constructor initializer list gpio OutputPin pins
+    // m_OUT_pin(OUT_pin), // Analog Output from MAX5171 device
+    m_UPO_pin(UPO_pin), // Digital General-Purpose Output from MAX5171 device
+    // CODE GENERATOR: class constructor initializer list ic_variant
+    m_ic_variant(ic_variant)
+{
+    // CODE GENERATOR: class constructor definition SPI interface initialization
+    //
+    // SPI CS = ActiveLow
+    // SPI FrameStart = CS
+    m_SPI_cs_state = 1;
+    m_cs_pin = m_SPI_cs_state;
+
+    // SPI CPOL = 0
+    // SPI CPHA = 0
+    // SPI MOSI and MISO Data are both stable on Rising edge of SCLK
+    // SPI SCLK Idle Low
+    m_SPI_dataMode = 0; //SPI_MODE0 // CPOL=0,CPHA=0: Rising Edge stable; SCLK idle Low
+    m_spi.format(8,m_SPI_dataMode);         // int bits_must_be_8, int mode=0_3 CPOL=0,CPHA=0
+
+    // SPI SCLKMaxMHz = 10
+    // SPI SCLKMinMHz = 0
+    //#define SPI_SCLK_Hz 48000000 // 48MHz
+    //#define SPI_SCLK_Hz 24000000 // 24MHz
+    //#define SPI_SCLK_Hz 12000000 // 12MHz
+    //#define SPI_SCLK_Hz 4000000 // 4MHz
+    //#define SPI_SCLK_Hz 2000000 // 2MHz
+    //#define SPI_SCLK_Hz 1000000 // 1MHz
+    m_SPI_SCLK_Hz = 10000000; // 10MHz; MAX5171 limit is 10MHz
+    m_spi.frequency(m_SPI_SCLK_Hz);
+
+    // TODO1: CODE GENERATOR: class constructor definition gpio InputPin (Input to device) initialization
+    //
+    m_RS_pin = 1; // output logic high -- initial value in constructor
+    m_PDLb_pin = 1; // output logic high -- initial value in constructor
+    m_CLRb_pin = 1; // output logic high -- initial value in constructor
+    m_SHDN_pin = 1; // output logic high -- initial value in constructor
+}
+
+// CODE GENERATOR: class destructor definition
+MAX5171::~MAX5171()
+{
+    // do nothing
+}
+
+// CODE GENERATOR: spi_frequency setter definition
+// set SPI SCLK frequency
+void MAX5171::spi_frequency(int spi_sclk_Hz)
+{
+    m_SPI_SCLK_Hz = spi_sclk_Hz;
+    m_spi.frequency(m_SPI_SCLK_Hz);
+}
+
+// CODE GENERATOR: omit global g_MAX5171_device
+// CODE GENERATOR: extern function declarations
+// CODE GENERATOR: extern function requirement MAX5171::SPIoutputCS
+// Assert SPI Chip Select
+// SPI chip-select for MAX5171
+//
+void MAX5171::SPIoutputCS(int isLogicHigh)
+{
+    // CODE GENERATOR: extern function definition for function SPIoutputCS
+    // CODE GENERATOR: extern function definition for standard SPI interface function SPIoutputCS(int isLogicHigh)
+    m_SPI_cs_state = isLogicHigh;
+    m_cs_pin = m_SPI_cs_state;
+}
+
+// CODE GENERATOR: extern function requirement MAX5171::SPIwrite16bits
+// SPI write 16 bits
+// SPI interface to MAX5171 shift 16 bits mosiData into MAX5171 DIN
+//
+void MAX5171::SPIwrite16bits(int16_t mosiData16)
+{
+    // CODE GENERATOR: extern function definition for function SPIwrite16bits
+    // TODO1: CODE GENERATOR: extern function definition for standard SPI interface function SPIwrite16bits(int16_t mosiData16)
+    size_t byteCount = 2;
+    static char mosiData[2];
+    static char misoData[2];
+    mosiData[0] = (char)((mosiData16 >> 8) & 0xFF); // MSByte
+    mosiData[1] = (char)((mosiData16 >> 0) & 0xFF); // LSByte
+    //
+    // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts()
+    //~ noInterrupts();
+    //
+    //~ digitalWrite(Scope_Trigger_Pin, LOW); // diagnostic Scope_Trigger_Pin
+    //
+    unsigned int numBytesTransferred = m_spi.write(mosiData, byteCount, misoData, byteCount);
+    //~ m_spi.transfer(mosiData8_FF0000);
+    //~ m_spi.transfer(mosiData16_00FF00);
+    //~ m_spi.transfer(mosiData16_0000FF);
+    //
+    //~ digitalWrite(Scope_Trigger_Pin, HIGH); // diagnostic Scope_Trigger_Pin
+    //
+    // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts()
+    //~ interrupts();
+    //
+    // VERIFY: SPIwrite24bits print diagnostic information
+    //cmdLine.serial().printf(" MOSI->"));
+    //cmdLine.serial().printf(" 0x"));
+    //Serial.print( (mosiData8_FF0000 & 0xFF), HEX);
+    //cmdLine.serial().printf(" 0x"));
+    //Serial.print( (mosiData16_00FF00 & 0xFF), HEX);
+    //cmdLine.serial().printf(" 0x"));
+    //Serial.print( (mosiData16_0000FF & 0xFF), HEX);
+    // hex dump mosiData[0..byteCount-1]
+#if 0 // HAS_MICROUSBSERIAL
+    cmdLine_microUSBserial.serial().printf("\r\nSPI");
+    if (byteCount > 7) {
+        cmdLine_microUSBserial.serial().printf(" byteCount:%d", byteCount);
+    }
+    cmdLine_microUSBserial.serial().printf(" MOSI->");
+    for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++)
+    {
+        cmdLine_microUSBserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]);
+    }
+    // hex dump misoData[0..byteCount-1]
+    cmdLine_microUSBserial.serial().printf("  MISO<-");
+    for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++)
+    {
+        cmdLine_microUSBserial.serial().printf(" 0x%2.2X", misoData[byteIndex]);
+    }
+    cmdLine_microUSBserial.serial().printf(" ");
+#endif
+#if 0 // HAS_DAPLINK_SERIAL
+    cmdLine_DAPLINKserial.serial().printf("\r\nSPI");
+    if (byteCount > 7) {
+        cmdLine_DAPLINKserial.serial().printf(" byteCount:%d", byteCount);
+    }
+    cmdLine_DAPLINKserial.serial().printf(" MOSI->");
+    for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++)
+    {
+        cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]);
+    }
+    // hex dump misoData[0..byteCount-1]
+    cmdLine_DAPLINKserial.serial().printf("  MISO<-");
+    for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++)
+    {
+        cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", misoData[byteIndex]);
+    }
+    cmdLine_DAPLINKserial.serial().printf(" ");
+#endif
+    // VERIFY: DIAGNOSTIC: print MAX5715 device register write
+    // TODO: MAX5715_print_register_verbose(mosiData8_FF0000, mosiData16_00FFFF);
+    // TODO: print_verbose_SPI_diagnostic(mosiData16_FF00, mosiData16_00FF, misoData16_FF00, misoData16_00FF);
+    //
+    // int misoData16 = (misoData16_FF00 << 8) | misoData16_00FF;
+    // return misoData16;
+}
+
+// CODE GENERATOR: class member function definitions
+//----------------------------------------
+// Initialize device
+// @return 1 on success; 0 on failure
+uint8_t MAX5171::Init(void)
+{
+    
+    //----------------------------------------
+    // success
+    return 1;
+}
+
+//----------------------------------------
+// Return the DAC register value corresponding to physical voltage.
+// Does not perform any offset or gain correction.
+//
+// @pre VRef = Voltage of REF input, in Volts
+// @param[in] voltage = physical voltage in Volts
+// @return raw 14-bit MAX5171 code (right justified).
+uint16_t MAX5171::DACCodeOfVoltage(double voltageV)
+{
+    
+    //----------------------------------------
+    // Linear map min and max endpoints
+    const double MaxScaleVoltage = VRef; // voltage of maximum code 0x3fff
+    const double MinScaleVoltage = 0.0; // voltage of minimum code 0x000
+    const uint16_t FULL_SCALE_CODE_14BIT = 0x3fff;
+    const uint16_t MaxCode = FULL_SCALE_CODE_14BIT;
+    const uint16_t MinCode = 0x000;
+    double codeFraction = (voltageV - MinScaleVoltage) / (MaxScaleVoltage - MinScaleVoltage);
+    double dacRegValueIdeal = ((codeFraction * (double)(MaxCode - MinCode + 1)) + MinCode + 0.5);
+    uint16_t dacRegValue = (uint16_t)dacRegValueIdeal;
+    if (dacRegValueIdeal > MaxCode)
+    {
+        dacRegValue = MaxCode;
+    } else if (dacRegValueIdeal < MinCode)
+    {
+        dacRegValue = MinCode;
+    }
+    return dacRegValue;
+}
+
+//----------------------------------------
+// Return the physical voltage corresponding to DAC register.
+// Does not perform any offset or gain correction.
+//
+// @pre VRef = Voltage of REF input, in Volts
+// @param[in] value_u14: raw 14-bit MAX5171 code (right justified).
+// @return physical voltage corresponding to MAX5171 code.
+double MAX5171::VoltageOfCode(uint16_t value_u14)
+{
+    
+    //----------------------------------------
+    // Linear map min and max endpoints
+    double MaxScaleVoltage = VRef; // voltage of maximum code 0x3fff
+    double MinScaleVoltage = 0.0; // voltage of minimum code 0x000
+    const uint16_t FULL_SCALE_CODE_14BIT = 0x3fff;
+    const uint16_t MaxCode = FULL_SCALE_CODE_14BIT;
+    const uint16_t MinCode = 0x000;
+    double codeFraction = ((double)value_u14 - MinCode) / (MaxCode - MinCode + 1);
+    return MinScaleVoltage + ((MaxScaleVoltage - MinScaleVoltage) * codeFraction);
+}
+
+//----------------------------------------
+// CMD_00dd_dddd_dddd_dddd_CODE
+//
+// Load input register; DAC registers are unchanged.
+// @return 1 on success; 0 on failure
+uint8_t MAX5171::CODE(uint16_t dacCodeLsbs)
+{
+    
+    //----------------------------------------
+    // Define command code
+    uint16_t mosiData16 = CMD_00dd_dddd_dddd_dddd_CODE
+        | ((0x3FFF & dacCodeLsbs) << 0); // left-align dddd_dddd_dddd
+    
+    //----------------------------------------
+    // SPI write 16-bit mosiData16
+    SPIoutputCS(0);
+    SPIwrite16bits(mosiData16);
+    SPIoutputCS(1);
+    
+    //----------------------------------------
+    // shadow of write-only register CMD_00dd_dddd_dddd_dddd_CODE
+    DACCode = dacCodeLsbs;
+    
+    //----------------------------------------
+    // success
+    return 1;
+}
+
+//----------------------------------------
+// CMD_01dd_dddd_dddd_dddd_CODE_LOAD
+//
+// Load input register; DAC registers are updated (start up DAC with new data).
+// @return 1 on success; 0 on failure
+uint8_t MAX5171::CODE_LOAD(uint16_t dacCodeLsbs)
+{
+    
+    //----------------------------------------
+    // Define command code
+    uint16_t mosiData16 = CMD_01dd_dddd_dddd_dddd_CODE_LOAD
+        | ((0x3FFF & dacCodeLsbs) << 0); // left-align dddd_dddd_dddd
+    
+    //----------------------------------------
+    // SPI write 16-bit mosiData16
+    SPIoutputCS(0);
+    SPIwrite16bits(mosiData16);
+    SPIoutputCS(1);
+    
+    //----------------------------------------
+    // shadow of write-only register CMD_00dd_dddd_dddd_dddd_CODE
+    DACCode = dacCodeLsbs;
+    
+    //----------------------------------------
+    // success
+    return 1;
+}
+
+//----------------------------------------
+// CMD_10xx_xxxx_xxxx_xxxx_LOAD
+//
+// Update DAC register from input register (start up DAC with data previously
+// stored in the input registers).
+// @return 1 on success; 0 on failure
+uint8_t MAX5171::LOAD(void)
+{
+    
+    //----------------------------------------
+    // Define command code
+    uint16_t mosiData16 = CMD_10xx_xxxx_xxxx_xxxx_LOAD;
+    
+    //----------------------------------------
+    // SPI write 16-bit mosiData16
+    SPIoutputCS(0);
+    SPIwrite16bits(mosiData16);
+    SPIoutputCS(1);
+    
+    //----------------------------------------
+    // success
+    return 1;
+}
+
+//----------------------------------------
+// CMD_1100_xxxx_xxxx_xxxx_NOP
+//
+// No operation (NOP).
+// @return 1 on success; 0 on failure
+uint8_t MAX5171::NOP(void)
+{
+    
+    //----------------------------------------
+    // Define command code
+    uint16_t mosiData16 = CMD_1100_xxxx_xxxx_xxxx_NOP;
+    
+    //----------------------------------------
+    // SPI write 16-bit mosiData16
+    SPIoutputCS(0);
+    SPIwrite16bits(mosiData16);
+    SPIoutputCS(1);
+    
+    //----------------------------------------
+    // success
+    return 1;
+}
+
+//----------------------------------------
+// CMD_1101_xxxx_xxxx_xxxx_SHUTDOWN
+//
+// Shut down DAC (provided PDL# = 1).
+// @return 1 on success; 0 on failure
+uint8_t MAX5171::SHUTDOWN(void)
+{
+    
+    //----------------------------------------
+    // Define command code
+    uint16_t mosiData16 = CMD_1101_xxxx_xxxx_xxxx_SHUTDOWN;
+    
+    //----------------------------------------
+    // SPI write 16-bit mosiData16
+    SPIoutputCS(0);
+    SPIwrite16bits(mosiData16);
+    SPIoutputCS(1);
+    
+    //----------------------------------------
+    // success
+    return 1;
+}
+
+//----------------------------------------
+// CMD_1110_0xxx_xxxx_xxxx_UPO_LOW
+//
+// UPO goes low (default).
+// @return 1 on success; 0 on failure
+uint8_t MAX5171::UPO_LOW(void)
+{
+    
+    //----------------------------------------
+    // Define command code
+    uint16_t mosiData16 = CMD_1110_0xxx_xxxx_xxxx_UPO_LOW;
+    
+    //----------------------------------------
+    // SPI write 16-bit mosiData16
+    SPIoutputCS(0);
+    SPIwrite16bits(mosiData16);
+    SPIoutputCS(1);
+    
+    //----------------------------------------
+    // success
+    return 1;
+}
+
+//----------------------------------------
+// CMD_1110_1xxx_xxxx_xxxx_UPO_HIGH
+//
+// UPO goes high.
+// @return 1 on success; 0 on failure
+uint8_t MAX5171::UPO_HIGH(void)
+{
+    
+    //----------------------------------------
+    // Define command code
+    uint16_t mosiData16 = CMD_1110_1xxx_xxxx_xxxx_UPO_HIGH;
+    
+    //----------------------------------------
+    // SPI write 16-bit mosiData16
+    SPIoutputCS(0);
+    SPIwrite16bits(mosiData16);
+    SPIoutputCS(1);
+    
+    //----------------------------------------
+    // success
+    return 1;
+}
+
+//----------------------------------------
+// CMD_1111_0xxx_xxxx_xxxx_MODE1_DOUT_SCLK_RISING_EDGE
+//
+// Mode 1, DOUT clocked out on SCLK’s rising edge.
+// @return 1 on success; 0 on failure
+uint8_t MAX5171::MODE1_DOUT_SCLK_RISING_EDGE(void)
+{
+    
+    //----------------------------------------
+    // Define command code
+    uint16_t mosiData16 = CMD_1111_0xxx_xxxx_xxxx_MODE1_DOUT_SCLK_RISING_EDGE;
+    
+    //----------------------------------------
+    // SPI write 16-bit mosiData16
+    SPIoutputCS(0);
+    SPIwrite16bits(mosiData16);
+    SPIoutputCS(1);
+    
+    //----------------------------------------
+    // success
+    return 1;
+}
+
+//----------------------------------------
+// CMD_1111_1xxx_xxxx_xxxx_MODE0_DOUT_SCLK_FALLING_EDGE
+//
+// Mode 0, DOUT clocked out on SCLK’s falling edge (default).
+// @return 1 on success; 0 on failure
+uint8_t MAX5171::MODE0_DOUT_SCLK_FALLING_EDGE(void)
+{
+    
+    //----------------------------------------
+    // Define command code
+    uint16_t mosiData16 = CMD_1111_1xxx_xxxx_xxxx_MODE0_DOUT_SCLK_FALLING_EDGE;
+    
+    //----------------------------------------
+    // SPI write 16-bit mosiData16
+    SPIoutputCS(0);
+    SPIwrite16bits(mosiData16);
+    SPIoutputCS(1);
+    
+    //----------------------------------------
+    // success
+    return 1;
+}
+
+
+// End of file
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MAX5171.h	Fri May 31 21:50:12 2019 +0000
@@ -0,0 +1,453 @@
+// /*******************************************************************************
+// * 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 MAX5171.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 = MAX5171
+// Device Description = Low-Power, Serial, 14-Bit, 1-Channel DACs with Force/Sense Voltage Output and SPI Interface
+// Device Manufacturer = Maxim Integrated
+// Device PartNumber = MAX5171AEEE+
+// Device RegValue_Width = DataWidth16bit_HL
+//
+// DAC NumChannels = 1
+// DAC ResolutionBits = 14
+//
+// SPI CS = ActiveLow
+// SPI FrameStart = CS
+// SPI CPOL = 0
+// SPI CPHA = 0
+// SPI MOSI and MISO Data are both stable on Rising edge of SCLK
+// SPI SCLK Idle Low
+// SPI SCLKMaxMHz = 10
+// SPI SCLKMinMHz = 0
+//
+
+
+// Prevent multiple declaration
+#ifndef __MAX5171_H__
+#define __MAX5171_H__
+
+#include "mbed.h"
+
+// CODE GENERATOR: conditional defines
+// CODE GENERATOR: class declaration and docstrings
+/**
+ * @brief MAX5171 Low-Power, Serial, 14-Bit, 1-Channel DACs with Force/Sense Voltage Output and SPI Interface
+ *
+ * //---------- CODE GENERATOR: testMainCppCodeList
+ * @code
+ * // CODE GENERATOR: example code includes
+ * // example code includes
+ * #include "mbed.h"
+ * //#include "max32625.h"
+ * #include "MAX5171.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
+ * // AnalogOut FB_pin(Px_x_PortName_To_Be_Determined); // Analog Input to MAX5171 device
+ * DigitalOut RS_pin(D9); // Digital Configuration Input to MAX5171 device
+ * DigitalOut PDLb_pin(D8); // Digital Configuration Input to MAX5171 device
+ * DigitalOut CLRb_pin(D7); // Digital Configuration Input to MAX5171 device
+ * DigitalOut SHDN_pin(D6); // Digital Configuration Input to MAX5171 device
+ * // AnalogIn OUT_pin(A0); // Analog Output from MAX5171 device
+ * DigitalIn UPO_pin(D5); // Digital General-Purpose Output from MAX5171 device
+ * // example code declare device instance
+ * MAX5171 g_MAX5171_device(spi, spi_cs, RS_pin, PDLb_pin, CLRb_pin, SHDN_pin, UPO_pin, MAX5171::MAX5171_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");
+ *
+ *         //MAX5171 dac(spi, spi_cs, MAX5171::MAX5171_IC);
+ *         //dac.Init();
+ *
+ *         // CODE GENERATOR: example code: member function Init
+ *         g_MAX5171_device.Init();
+ *
+ *         // CODE GENERATOR: example code: has no member function REF
+ *         // CODE GENERATOR: example code: member function CODE_LOAD
+ *         //
+ *         uint16_t code = 0xccc;
+ *         g_MAX5171_device.CODE_LOAD(code);
+ *         //
+ *         code = 0x800;
+ *         g_MAX5171_device.CODE_LOAD(code);
+ *         //
+ *         code = 0x666;
+ *         g_MAX5171_device.CODE_LOAD(code);
+ *         //
+ *         code = 0xFFF;
+ *         g_MAX5171_device.CODE_LOAD(code);
+ *
+ *         // CODE GENERATOR: example code: has no member function CODEallLOADall
+ *         // CODE GENERATOR: example code: has no member function CODEnLOADn
+ *         // CODE GENERATOR: example code: has no member function ScanManual
+ *         // CODE GENERATOR: example code: has no member function ReadAINcode
+ *         wait(3.0);
+ *     }
+ * }
+ * @endcode
+ * //---------- CODE GENERATOR: end testMainCppCodeList
+ */
+class MAX5171 {
+public:
+// CODE GENERATOR: TypedefEnum EnumItem declarations
+// CODE GENERATOR: TypedefEnum MAX5171_CMD_enum_t
+    //----------------------------------------
+    /// Command Codes (first byte)
+    ///
+    /// Naming convention is CMD_bitstream_FUNCTION_NAME
+    /// - dd_dddd_dddd_dddd = data field
+    /// - xxxx = don't care
+    typedef enum MAX5171_CMD_enum_t {
+        CMD_00dd_dddd_dddd_dddd_CODE = 0x0000, //!< 16'b0000000000000000
+        CMD_01dd_dddd_dddd_dddd_CODE_LOAD = 0x4000, //!< 16'b0100000000000000
+        CMD_10xx_xxxx_xxxx_xxxx_LOAD = 0x8000, //!< 16'b1000000000000000
+        CMD_1100_xxxx_xxxx_xxxx_NOP = 0xc000, //!< 16'b1100000000000000
+        CMD_1101_xxxx_xxxx_xxxx_SHUTDOWN = 0xd000, //!< 16'b1101000000000000
+        CMD_1110_0xxx_xxxx_xxxx_UPO_LOW = 0xe000, //!< 16'b1110000000000000
+        CMD_1110_1xxx_xxxx_xxxx_UPO_HIGH = 0xe800, //!< 16'b1110100000000000
+        CMD_1111_0xxx_xxxx_xxxx_MODE1_DOUT_SCLK_RISING_EDGE = 0xf000, //!< 16'b1111000000000000
+        CMD_1111_1xxx_xxxx_xxxx_MODE0_DOUT_SCLK_FALLING_EDGE = 0xf800, //!< 16'b1111100000000000
+    } MAX5171_CMD_enum_t;
+
+// TODO1: CODE GENERATOR: ic_variant -- IC's supported with this driver
+    /**
+     * @brief IC's supported with this driver
+     * @details MAX5171
+     */
+    typedef enum
+    {
+        MAX5171_IC = 0,
+        //MAX5171_IC = 1
+    } MAX5171_ic_t;
+
+// TODO1: CODE GENERATOR: class constructor declaration
+    /**********************************************************//**
+    * @brief Constructor for MAX5171 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] RS_pin - pointer to a DigitalOut pin object
+    *     @param[in] PDLb_pin - pointer to a DigitalOut pin object
+    *     @param[in] CLRb_pin - pointer to a DigitalOut pin object
+    *     @param[in] SHDN_pin - pointer to a DigitalOut pin object
+    *     CODE GENERATOR: class constructor docstrings gpio OutputPin pins
+    *     @param[in] UPO_pin - pointer to a DigitalIn pin object
+    *     @param[in] ic_variant - which type of MAX5171 is used
+    *
+    * On Exit:
+    *
+    * @return None
+    **************************************************************/
+    MAX5171(SPI &spi, DigitalOut &cs_pin, // SPI interface
+            // CODE GENERATOR: class constructor declaration gpio InputPin pins
+            // AnalogOut &FB_pin, // Analog Input to MAX5171 device
+            DigitalOut &RS_pin, // Digital Configuration Input to MAX5171 device
+            DigitalOut &PDLb_pin, // Digital Configuration Input to MAX5171 device
+            DigitalOut &CLRb_pin, // Digital Configuration Input to MAX5171 device
+            DigitalOut &SHDN_pin, // Digital Configuration Input to MAX5171 device
+            // CODE GENERATOR: class constructor declaration gpio OutputPin pins
+            // AnalogIn &OUT_pin, // Analog Output from MAX5171 device
+            DigitalIn &UPO_pin, // Digital General-Purpose Output from MAX5171 device
+            MAX5171_ic_t ic_variant);
+
+// CODE GENERATOR: class destructor declaration
+    /************************************************************
+     * @brief Default destructor for MAX5171 Class.
+     *
+     * @details Destroys SPI object if owner
+     *
+     * On Entry:
+     *
+     * On Exit:
+     *
+     * @return None
+     **************************************************************/
+    ~MAX5171();
+
+    // CODE GENERATOR: spi_frequency setter declaration
+    // set SPI SCLK frequency
+    void spi_frequency(int spi_sclk_Hz);
+
+//----------------------------------------
+// CODE GENERATOR: omit typedef enum MAX5171_device_t, class members instead of global device object
+public:
+
+    /// reference voltage, in Volts
+    double VRef;
+
+    /// shadow of write-only dacCodeLsbs field CMD_00dd_dddd_dddd_dddd_CODE or CMD_01dd_dddd_dddd_dddd_CODE_LOAD
+    int16_t DACCode;
+
+// CODE GENERATOR: omit global g_MAX5171_device
+
+// CODE GENERATOR: extern function declarations
+// CODE GENERATOR: extern function declaration SPIoutputCS
+//----------------------------------------
+// Assert SPI Chip Select
+// SPI chip-select for MAX5171
+//
+    void SPIoutputCS(int isLogicHigh);
+
+// CODE GENERATOR: extern function declaration SPIwrite16bits
+//----------------------------------------
+// SPI write 16 bits
+// SPI interface to MAX5171 shift 16 bits mosiData into MAX5171 DIN
+//
+    void SPIwrite16bits(int16_t mosiData16);
+
+// 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 = FB
+// InputPin Description = Feedback Input
+// InputPin Function = Analog
+//
+// InputPin Name = RS
+// InputPin Description = Reset Mode Select (digital input). Connect to VDD to select midscale reset output value. Connect to DGND
+// to select 0 reset output value.
+// InputPin Function = Configuration
+    DigitalOut &m_RS_pin;
+//
+// InputPin Name = PDL#
+// InputPin Description = Power-Down Lockout (digital input). Connect to VDD to allow shutdown. Connect to DGND to disable shutdown.
+// InputPin Function = Configuration
+    DigitalOut &m_PDLb_pin;
+//
+// InputPin Name = CLR#
+// InputPin Description = Clear DAC (digital input). Clears the DAC to its predetermined output state as set by RS.
+// InputPin Function = Configuration
+    DigitalOut &m_CLRb_pin;
+//
+// InputPin Name = SHDN
+// InputPin Description = Shutdown (digital input). Pulling SHDN high when PDL = VDD places the chip in shutdown mode with a
+// maximum shutdown current 0f 10uA.
+// InputPin Function = Configuration
+    DigitalOut &m_SHDN_pin;
+//
+// CODE GENERATOR: class member data for gpio OutputPin pins
+// OutputPin Name = OUT
+// OutputPin Description = Analog Voltage Output. High impedance in shutdown. Output voltage is limited to VDD.
+// OutputPin Function = Analog
+    // AnalogIn &m_OUT_pin;
+//
+// OutputPin Name = UPO
+// OutputPin Description = User-Programmable Output. State is set by serial input.
+// OutputPin Function = General-Purpose
+    DigitalIn &m_UPO_pin;
+//
+
+    // Identifies which IC variant is being used
+    MAX5171_ic_t m_ic_variant;
+
+public:
+
+// CODE GENERATOR: class member function declarations
+    //----------------------------------------
+    /// Initialize device
+    /// @return 1 on success; 0 on failure
+    uint8_t Init(void);
+
+    //----------------------------------------
+    /// Return the DAC register value corresponding to physical voltage.
+    /// Does not perform any offset or gain correction.
+    ///
+    /// @pre g_MAX5171_device.VRef = Voltage of REF input, in Volts
+    /// @param[in] voltage = physical voltage in Volts
+    /// @return raw 14-bit MAX5171 code (right justified).
+    uint16_t DACCodeOfVoltage(double voltageV);
+
+    //----------------------------------------
+    /// Return the physical voltage corresponding to DAC register.
+    /// Does not perform any offset or gain correction.
+    ///
+    /// @pre g_MAX5171_device.VRef = Voltage of REF input, in Volts
+    /// @param[in] value_u14: raw 14-bit MAX5171 code (right justified).
+    /// @return physical voltage corresponding to MAX5171 code.
+    double VoltageOfCode(uint16_t value_u14);
+
+    //----------------------------------------
+    /// CMD_00dd_dddd_dddd_dddd_CODE
+    ///
+    /// Load input register; DAC registers are unchanged.
+    /// @return 1 on success; 0 on failure
+    uint8_t CODE(uint16_t dacCodeLsbs);
+
+    //----------------------------------------
+    /// CMD_01dd_dddd_dddd_dddd_CODE_LOAD
+    ///
+    /// Load input register; DAC registers are updated (start up DAC with new data).
+    /// @return 1 on success; 0 on failure
+    uint8_t CODE_LOAD(uint16_t dacCodeLsbs);
+
+    //----------------------------------------
+    /// CMD_10xx_xxxx_xxxx_xxxx_LOAD
+    ///
+    /// Update DAC register from input register (start up DAC with data previously
+    /// stored in the input registers).
+    /// @return 1 on success; 0 on failure
+    uint8_t LOAD(void);
+
+    //----------------------------------------
+    /// CMD_1100_xxxx_xxxx_xxxx_NOP
+    ///
+    /// No operation (NOP).
+    /// @return 1 on success; 0 on failure
+    uint8_t NOP(void);
+
+    //----------------------------------------
+    /// CMD_1101_xxxx_xxxx_xxxx_SHUTDOWN
+    ///
+    /// Shut down DAC (provided PDL# = 1).
+    /// @return 1 on success; 0 on failure
+    uint8_t SHUTDOWN(void);
+
+    //----------------------------------------
+    /// CMD_1110_0xxx_xxxx_xxxx_UPO_LOW
+    ///
+    /// UPO goes low (default).
+    /// @return 1 on success; 0 on failure
+    uint8_t UPO_LOW(void);
+
+    //----------------------------------------
+    /// CMD_1110_1xxx_xxxx_xxxx_UPO_HIGH
+    ///
+    /// UPO goes high.
+    /// @return 1 on success; 0 on failure
+    uint8_t UPO_HIGH(void);
+
+    //----------------------------------------
+    /// CMD_1111_0xxx_xxxx_xxxx_MODE1_DOUT_SCLK_RISING_EDGE
+    ///
+    /// Mode 1, DOUT clocked out on SCLK’s rising edge.
+    /// @return 1 on success; 0 on failure
+    uint8_t MODE1_DOUT_SCLK_RISING_EDGE(void);
+
+    //----------------------------------------
+    /// CMD_1111_1xxx_xxxx_xxxx_MODE0_DOUT_SCLK_FALLING_EDGE
+    ///
+    /// Mode 0, DOUT clocked out on SCLK’s falling edge (default).
+    /// @return 1 on success; 0 on failure
+    uint8_t MODE0_DOUT_SCLK_FALLING_EDGE(void);
+
+}; // end of class MAX5171
+
+#endif // __MAX5171_H__
+
+// End of file
+