Maxim Integrated MAX5171 14-bit Force/Sense DAC

Dependents:   MAX5171BOB_Tester MAX5171BOB_14bit_Remote_Sense_SPI_DAC MAX5171BOB_Serial_Tester

MAX5171.h

Committer:
whismanoid
Date:
9 months ago
Revision:
7:564b438a0448
Parent:
6:f661c4a61207

File content as of revision 7:564b438a0448:

// /*******************************************************************************
// * Copyright (C) 2020 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 DeviceBriefDescription = 14-bit Force/Sense DAC
// 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__

// standard include for target platform -- Platform_Include_Boilerplate
#include "mbed.h"
// Platforms:
//   - MAX32625MBED
//      - supports mbed-os-5.11, requires USBDevice library
//      - add https://developer.mbed.org/teams/MaximIntegrated/code/USBDevice/
//      - remove max32630fthr library (if present)
//      - remove MAX32620FTHR library (if present)
//   - MAX32600MBED
//      - remove max32630fthr library (if present)
//      - remove MAX32620FTHR library (if present)
//      - Windows 10 note:  Don't connect HDK until you are ready to load new firmware into the board.
//   - NUCLEO_F446RE
//      - remove USBDevice library
//      - remove max32630fthr library (if present)
//      - remove MAX32620FTHR library (if present)
//   - NUCLEO_F401RE
//      - remove USBDevice library
//      - remove max32630fthr library (if present)
//      - remove MAX32620FTHR library (if present)
//   - MAX32630FTHR
//      - #include "max32630fthr.h"
//      - add http://os.mbed.org/teams/MaximIntegrated/code/max32630fthr/
//      - remove MAX32620FTHR library (if present)
//   - MAX32620FTHR
//      - #include "MAX32620FTHR.h"
//      - remove max32630fthr library (if present)
//      - add https://os.mbed.com/teams/MaximIntegrated/code/MAX32620FTHR/
//      - not tested yet
//   - MAX32625PICO
//      - remove max32630fthr library (if present)
//      - remove MAX32620FTHR library (if present)
//      - not tested yet
//
// end Platform_Include_Boilerplate

/**
 * @brief MAX5171 Low-Power, Serial, 14-Bit, 1-Channel DACs with Force/Sense Voltage Output and SPI Interface
 *
 *
 *
 * Datasheet: https://www.maximintegrated.com/MAX5171
 *
 *
 *
 * @code
 * // example code includes
 * // standard include for target platform -- Platform_Include_Boilerplate
 * #include "mbed.h"
 * // Platforms:
 * //   - MAX32625MBED
 * //      - supports mbed-os-5.11, requires USBDevice library
 * //      - add https://developer.mbed.org/teams/MaximIntegrated/code/USBDevice/
 * //      - remove max32630fthr library (if present)
 * //      - remove MAX32620FTHR library (if present)
 * //   - MAX32600MBED
 * //      - remove max32630fthr library (if present)
 * //      - remove MAX32620FTHR library (if present)
 * //      - Windows 10 note:  Don't connect HDK until you are ready to load new firmware into the board.
 * //   - NUCLEO_F446RE
 * //      - remove USBDevice library
 * //      - remove max32630fthr library (if present)
 * //      - remove MAX32620FTHR library (if present)
 * //   - NUCLEO_F401RE
 * //      - remove USBDevice library
 * //      - remove max32630fthr library (if present)
 * //      - remove MAX32620FTHR library (if present)
 * //   - MAX32630FTHR
 * //      - #include "max32630fthr.h"
 * //      - add http://os.mbed.org/teams/MaximIntegrated/code/max32630fthr/
 * //      - remove MAX32620FTHR library (if present)
 * //   - MAX32620FTHR
 * //      - #include "MAX32620FTHR.h"
 * //      - remove max32630fthr library (if present)
 * //      - add https://os.mbed.com/teams/MaximIntegrated/code/MAX32620FTHR/
 * //      - not tested yet
 * //   - MAX32625PICO
 * //      - remove max32630fthr library (if present)
 * //      - remove MAX32620FTHR library (if present)
 * //      - not tested yet
 * //
 * // end Platform_Include_Boilerplate
 * #include "MAX5171.h"
 *
 * // 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 (GPIO controlled CS)
 * #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
 * #elif defined(TARGET_NUCLEO_F446RE) || defined(TARGET_NUCLEO_F401RE)
 * // TODO1: avoid resource conflict between P5_0, P5_1, P5_2 SPI and DigitalInOut
 * // void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
 * //
 * // TODO1: NUCLEO_F446RE SPI not working; CS and MOSI data looks OK but no SCLK clock pulses.
 * SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK); // mosi, miso, sclk spi1 TARGET_NUCLEO_F446RE: Arduino 10-pin header D11 D12 D13
 * DigitalOut spi_cs(SPI_CS); // TARGET_NUCLEO_F446RE: PB_6 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()
 * {
 *     g_MAX5171_device.Init();
 *
 *     while (1)
 *     {
 *         uint16_t code;
 *         //
 *         // example #1
 *         code = 0x3fff; // 100.0% of full scale REF(2.50V) = 2.50V (FB=1-2:FORCE_BIP/SENSE_BIP: 2.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 5.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #2
 *         code = 0x3998; // 90.0% of full scale REF(2.50V) = 2.25V (FB=1-2:FORCE_BIP/SENSE_BIP: 2.00V) (FB=2-3:FORCE_UNI/SENSE_UNI: 4.50V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #3
 *         code = 0x3332; // 80.0% of full scale REF(2.50V) = 2.00V (FB=1-2:FORCE_BIP/SENSE_BIP: 1.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 4.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #4
 *         code = 0x2ccc; // 70.0% of full scale REF(2.50V) = 1.75V (FB=1-2:FORCE_BIP/SENSE_BIP: 1.00V) (FB=2-3:FORCE_UNI/SENSE_UNI: 3.50V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #5
 *         code = 0x2665; // 60.0% of full scale REF(2.50V) = 1.50V (FB=1-2:FORCE_BIP/SENSE_BIP: 0.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 3.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #6
 *         code = 0x1fff; // 50.0% of full scale REF(2.50V) = 1.25V (FB=1-2:FORCE_BIP/SENSE_BIP: 0.00V) (FB=2-3:FORCE_UNI/SENSE_UNI: 2.50V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #7
 *         code = 0x1999; // 40.0% of full scale REF(2.50V) = 1.00V (FB=1-2:FORCE_BIP/SENSE_BIP: -0.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 2.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #8
 *         code = 0x1332; // 30.0% of full scale REF(2.50V) = 0.75V (FB=1-2:FORCE_BIP/SENSE_BIP: -1.00V) (FB=2-3:FORCE_UNI/SENSE_UNI: 1.50V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #9
 *         code = 0x0ccc; // 20.0% of full scale REF(2.50V) = 0.50V (FB=1-2:FORCE_BIP/SENSE_BIP: -1.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 1.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #10
 *         code = 0x0666; // 10.0% of full scale REF(2.50V) = 0.25V (FB=1-2:FORCE_BIP/SENSE_BIP: -2.00V) (FB=2-3:FORCE_UNI/SENSE_UNI: 0.50V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #11
 *         code = 0x0000; // 0.0% of full scale REF(2.50V) = 0.00V (FB=1-2:FORCE_BIP/SENSE_BIP: -2.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 0.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #12
 *         code = 0x0000; // 0.0% of full scale REF(2.50V) = 0.00V (FB=1-2:FORCE_BIP/SENSE_BIP: -2.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 0.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #13
 *         code = 0x0666; // 10.0% of full scale REF(2.50V) = 0.25V (FB=1-2:FORCE_BIP/SENSE_BIP: -2.00V) (FB=2-3:FORCE_UNI/SENSE_UNI: 0.50V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #14
 *         code = 0x0ccc; // 20.0% of full scale REF(2.50V) = 0.50V (FB=1-2:FORCE_BIP/SENSE_BIP: -1.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 1.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #15
 *         code = 0x1332; // 30.0% of full scale REF(2.50V) = 0.75V (FB=1-2:FORCE_BIP/SENSE_BIP: -1.00V) (FB=2-3:FORCE_UNI/SENSE_UNI: 1.50V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #16
 *         code = 0x1999; // 40.0% of full scale REF(2.50V) = 1.00V (FB=1-2:FORCE_BIP/SENSE_BIP: -0.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 2.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #17
 *         code = 0x1fff; // 50.0% of full scale REF(2.50V) = 1.25V (FB=1-2:FORCE_BIP/SENSE_BIP: 0.00V) (FB=2-3:FORCE_UNI/SENSE_UNI: 2.50V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #18
 *         code = 0x2665; // 60.0% of full scale REF(2.50V) = 1.50V (FB=1-2:FORCE_BIP/SENSE_BIP: 0.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 3.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #19
 *         code = 0x2ccc; // 70.0% of full scale REF(2.50V) = 1.75V (FB=1-2:FORCE_BIP/SENSE_BIP: 1.00V) (FB=2-3:FORCE_UNI/SENSE_UNI: 3.50V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #20
 *         code = 0x3332; // 80.0% of full scale REF(2.50V) = 2.00V (FB=1-2:FORCE_BIP/SENSE_BIP: 1.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 4.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #21
 *         code = 0x3998; // 90.0% of full scale REF(2.50V) = 2.25V (FB=1-2:FORCE_BIP/SENSE_BIP: 2.00V) (FB=2-3:FORCE_UNI/SENSE_UNI: 4.50V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *         //
 *         // example #22
 *         code = 0x3fff; // 100.0% of full scale REF(2.50V) = 2.50V (FB=1-2:FORCE_BIP/SENSE_BIP: 2.50V) (FB=2-3:FORCE_UNI/SENSE_UNI: 5.00V)
 *         g_MAX5171_device.CODE_LOAD(code);
 *         wait_ms(3000); // wait_ms(unsigned long interval_msec)
 *
 *         // wait(3.0);
 *     }
 * }
 * @endcode
 */
class MAX5171 {
public:
    //----------------------------------------
    /// 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, //!< 0b0000000000000000
        CMD_01dd_dddd_dddd_dddd_CODE_LOAD = 0x4000, //!< 0b0100000000000000
        CMD_10xx_xxxx_xxxx_xxxx_LOAD = 0x8000, //!< 0b1000000000000000
        CMD_1100_xxxx_xxxx_xxxx_NOP = 0xc000, //!< 0b1100000000000000
        CMD_1101_xxxx_xxxx_xxxx_SHUTDOWN = 0xd000, //!< 0b1101000000000000
        CMD_1110_0xxx_xxxx_xxxx_UPO_LOW = 0xe000, //!< 0b1110000000000000
        CMD_1110_1xxx_xxxx_xxxx_UPO_HIGH = 0xe800, //!< 0b1110100000000000
        CMD_1111_0xxx_xxxx_xxxx_MODE1_DOUT_SCLK_RISING_EDGE = 0xf000, //!< 0b1111000000000000
        CMD_1111_1xxx_xxxx_xxxx_MODE0_DOUT_SCLK_FALLING_EDGE = 0xf800, //!< 0b1111100000000000
    } MAX5171_CMD_enum_t;

    /**
     * @brief IC's supported with this driver
     * @details MAX5171
     */
    typedef enum
    {
        MAX5171_IC = 0,
        //MAX5171_IC = 1
    } MAX5171_ic_t;

    /**********************************************************//**
    * @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
    *     @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
    *     @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
            // 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
            // AnalogIn &OUT_pin, // Analog Output from MAX5171 device
            DigitalIn &UPO_pin, // Digital General-Purpose Output from MAX5171 device
            MAX5171_ic_t ic_variant);

    /************************************************************
     * @brief Default destructor for MAX5171 Class.
     *
     * @details Destroys SPI object if owner
     *
     * On Entry:
     *
     * On Exit:
     *
     * @return None
     **************************************************************/
    ~MAX5171();

    /// Function pointer void f(size_t byteCount, uint8_t mosiData[], uint8_t misoData[])
    Callback<void(size_t, uint8_t*, uint8_t*)> onSPIprint; //!< optional @ref onSPIprint SPI diagnostic function

    /// set SPI SCLK frequency
    void spi_frequency(int spi_sclk_Hz);

    /// get SPI SCLK frequency
    int get_spi_frequency() const { return m_SPI_SCLK_Hz; }

    /// get SPI mode
    int get_spi_dataMode() const { return m_SPI_dataMode; }

//----------------------------------------
public:

    /// reference voltage, in Volts
    double VRef;

    /// shadow of dacCodeLsbs; write-only dacCodeLsbs field CMD_00dd_dddd_dddd_dddd_CODE or CMD_01dd_dddd_dddd_dddd_CODE_LOAD
    int16_t DACCode;


//----------------------------------------
// Assert SPI Chip Select
// SPI chip-select for MAX5171
//
    void SPIoutputCS(int isLogicHigh);

//----------------------------------------
// SPI write 16 bits
// SPI interface to MAX5171 shift 16 bits mosiData into MAX5171 DIN
//
    void SPIwrite16bits(int16_t mosiData16);

private:
    // 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;

// 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;
//
// 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:

    //----------------------------------------
    /// Menu item '!'
    /// Initialize device
    ///
    /// TODO1: #170 MAX5171 Self Test for Test Fixture Firmware
    /// @future test group ____ // Verify function ____ (enabled by default)
    /// @future test
    ///     tinyTester.settle_time_msec = 250;
    ///
    /// @test group DACCodeOfVoltage // Verify function DACCodeOfVoltage (enabled by default)
    /// @test group DACCodeOfVoltage tinyTester.blink_time_msec = 20 // quickly speed through the software verification
    /// @test group DACCodeOfVoltage tinyTester.print("VRef = 2.500  MAX5171 14-bit LSB = 0.00015V")
    /// @test group DACCodeOfVoltage VRef = 2.500
    /// @test group DACCodeOfVoltage tinyTester.err_threshold = 0.00015259720441921504 // 14-bit LSB (2.500/16383)
    ///     //
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(2.499847412109375) expect 0x3FFF
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(2.49969482421875) expect 0x3FFE
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(2.499542236328125) expect 0x3FFD
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(2.4993896484375) expect 0x3FFC
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(1.250152587890625) expect 0x2001
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(1.25) expect 0x2000
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(1.249847412109375) expect 0x1FFF
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(1.24969482421875) expect 0x1FFE
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(0.000457763671875) expect 0x0003
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(0.00030517578125) expect 0x0002
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(0.000152587890625) expect 0x0001
    /// @test group DACCodeOfVoltage DACCodeOfVoltage(0.00000) expect 0x0000
    /// @test group DACCodeOfVoltage tinyTester.blink_time_msec = 75 // default 75 resume hardware self test
    ///     //
    /// @test group VoltageOfCode // Verify function VoltageOfCode (enabled by default)
    /// @test group VoltageOfCode tinyTester.blink_time_msec = 20 // quickly speed through the software verification
    /// @test group VoltageOfCode tinyTester.print("VRef = 2.500  MAX5171 14-bit LSB = 0.00015V")
    /// @test group VoltageOfCode VRef = 2.500
    /// @test group VoltageOfCode tinyTester.err_threshold = 0.00015259720441921504 // 14-bit LSB (2.500/16383)
    /// @test group VoltageOfCode VoltageOfCode(0x3FFF) expect 2.499847412109375
    /// @test group VoltageOfCode VoltageOfCode(0x3FFE) expect 2.49969482421875
    /// @test group VoltageOfCode VoltageOfCode(0x3FFD) expect 2.499542236328125
    /// @test group VoltageOfCode VoltageOfCode(0x3FFC) expect 2.4993896484375
    /// @test group VoltageOfCode VoltageOfCode(0x2001) expect 1.250152587890625
    /// @test group VoltageOfCode VoltageOfCode(0x2000) expect 1.25
    /// @test group VoltageOfCode VoltageOfCode(0x1FFF) expect 1.249847412109375
    /// @test group VoltageOfCode VoltageOfCode(0x1FFE) expect 1.24969482421875
    /// @test group VoltageOfCode VoltageOfCode(0x0003) expect 0.000457763671875
    /// @test group VoltageOfCode VoltageOfCode(0x0002) expect 0.00030517578125
    /// @test group VoltageOfCode VoltageOfCode(0x0001) expect 0.000152587890625
    /// @test group VoltageOfCode VoltageOfCode(0x0000) expect 0.00000
    /// @test group VoltageOfCode tinyTester.blink_time_msec = 75 // default 75 resume hardware self test
    ///     //
    ///     // Device Testing: DAC commands, verify using on-board ADC inputs
    ///     //
    /// @test group CODE_LOAD // Verify function CODE_LOAD (enabled by default)
    /// @test group CODE_LOAD tinyTester.blink_time_msec = 75 // default 75 resume hardware self test
    /// @test group CODE_LOAD tinyTester.settle_time_msec = 500
    ///     tinyTester.blink_time_msec = 75;
    ///     cmdLine.serial().printf("
    ///       MAX5171.Init()");
    ///     g_MAX5171_device.Init();
    /// @test Init()
    /// @test VRef expect 2.500 // Nominal Full-Scale Voltage Reference
    ///     //
    ///     tinyTester.err_threshold = 0.030; // 30mV
    /// @test group CODE_LOAD tinyTester.err_threshold = 0.050
    ///     uint16_t code = 0x3FFF;
    ///     //~ double voltageV = 0.5;
    ///     //
    ///     cmdLine.serial().printf("
    ///       MAX5171.CODE_LOAD code=%d", code);
    ///     g_MAX5171_device.CODE_LOAD(code);
    /// @test group CODE_LOAD tinyTester.print("100.0% of full scale REF(2.50V) = 2.50V Jumper FB=1-2")
    /// @test group CODE_LOAD CODE_LOAD(0x3FFF) // 100.0% of full scale REF(2.50V) = 2.50V
    ///     // tinyTester.Wait_Output_Settling replaces wait_ms
    ///     tinyTester.Wait_Output_Settling();
    /// @test group CODE_LOAD tinyTester.Wait_Output_Settling()
    ///     // tinyTester.AnalogIn0_Read_Expect_voltageV replaces SelfTest_AnalogInput_Expect_ch_V
    ///     tinyTester.AnalogIn0_Read_Expect_voltageV(2.500);
    /// @test group CODE_LOAD tinyTester.AnalogIn0_Read_Expect_voltageV(2.500)
    ///     //
    ///     code = 0x0000;
    ///     cmdLine.serial().printf("
    ///       MAX5171.CODE_LOAD code=%d", code);
    ///     g_MAX5171_device.CODE_LOAD(code);
    /// @test group CODE_LOAD tinyTester.print("0.0% of full scale REF(2.50V) = 0.000V")
    /// @test group CODE_LOAD CODE_LOAD(0x0000) // 0.0% of full scale REF(2.50V) = 0.000V
    ///     // tinyTester.Wait_Output_Settling replaces wait_ms
    ///     tinyTester.Wait_Output_Settling();
    /// @test group CODE_LOAD tinyTester.Wait_Output_Settling()
    ///     // tinyTester.AnalogIn0_Read_Expect_voltageV replaces SelfTest_AnalogInput_Expect_ch_V
    ///     tinyTester.AnalogIn0_Read_Expect_voltageV(0.0000);
    /// @test group CODE_LOAD tinyTester.AnalogIn0_Read_Expect_voltageV(0.0000)
    ///     //
    ///     code = 0x1FFF;
    ///     cmdLine.serial().printf("
    ///       MAX5171.CODE_LOAD code=%d", code);
    ///     g_MAX5171_device.CODE_LOAD(code);
    /// @test group CODE_LOAD tinyTester.print("50.0% of full scale REF(2.50V) = 1.25V")
    /// @test group CODE_LOAD CODE_LOAD(0x1FFF) // 50.0% of full scale REF(2.50V) = 1.25V
    ///     // tinyTester.Wait_Output_Settling replaces wait_ms
    ///     tinyTester.Wait_Output_Settling();
    /// @test group CODE_LOAD tinyTester.Wait_Output_Settling()
    ///     // tinyTester.AnalogIn0_Read_Expect_voltageV replaces SelfTest_AnalogInput_Expect_ch_V
    ///     tinyTester.AnalogIn0_Read_Expect_voltageV(1.2500);
    /// @test group CODE_LOAD tinyTester.AnalogIn0_Read_Expect_voltageV(1.2500)
    ///     //
    ///     // test UPO User Programmable Output, verify using digital input D2
    ///     //
    /// @test group UPO // Verify User Programmable Output functions UPO_HIGH and UPO_LOW (enabled by default)
    /// @test group UPO tinyTester.blink_time_msec = 75 // default 75 resume hardware self test
    /// @test group UPO tinyTester.settle_time_msec = 500 // default 250
    ///     cmdLine.serial().printf("
    ///       MAX5171.UPO_HIGH");
    ///     g_MAX5171_device.UPO_HIGH();
    /// @test group UPO UPO_HIGH()
    ///     tinyTester.Wait_Output_Settling();
    /// @test group UPO tinyTester.Wait_Output_Settling()
    ///     // tinyTester.DigitalIn_Read_Expect_WarnOnly replaces SelfTest_Expect_Input_UPO_pin
    ///     tinyTester.DigitalIn_Read_Expect_WarnOnly(UPO_pin, "UPO", 1, "UPO_pin is high after MAX5171 UPO_HIGH command");
    /// @test group CODE_LOAD tinyTester.DigitalIn_Read_Expect_WarnOnly(UPO_pin, "UPO", 1, "UPO_pin is high after MAX5171 UPO_HIGH command")
    ///     //
    ///     cmdLine.serial().printf("
    ///       MAX5171.UPO_LOW");
    ///     g_MAX5171_device.UPO_LOW();
    /// @test group UPO UPO_LOW()
    ///     tinyTester.Wait_Output_Settling();
    /// @test group UPO tinyTester.Wait_Output_Settling()
    ///     // tinyTester.DigitalIn_Read_Expect_WarnOnly replaces SelfTest_Expect_Input_UPO_pin
    ///     tinyTester.DigitalIn_Read_Expect_WarnOnly(UPO_pin, "UPO", 0, "UPO_pin is low after MAX5171 UPO_LOW command");
    /// @test group CODE_LOAD tinyTester.DigitalIn_Read_Expect_WarnOnly(UPO_pin, "UPO", 0, "UPO_pin is low after MAX5171 UPO_LOW command")
    ///     //
    ///     cmdLine.serial().printf("
    ///       MAX5171.UPO_HIGH");
    ///     g_MAX5171_device.UPO_HIGH();
    /// @test group UPO UPO_HIGH()
    ///     tinyTester.Wait_Output_Settling();
    /// @test group UPO tinyTester.Wait_Output_Settling()
    ///     // tinyTester.DigitalIn_Read_Expect_WarnOnly replaces SelfTest_Expect_Input_UPO_pin
    ///     tinyTester.DigitalIn_Read_Expect_WarnOnly(UPO_pin, "UPO", 1, "UPO_pin is high after MAX5171 UPO_HIGH command");
    /// @test group CODE_LOAD tinyTester.DigitalIn_Read_Expect_WarnOnly(UPO_pin, "UPO", 1, "UPO_pin is high after MAX5171 UPO_HIGH command")
    ///     //
    ///
    ///
    void 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