Maxim Integrated MAX5171 14-bit Force/Sense DAC
Dependents: MAX5171BOB_Tester MAX5171BOB_14bit_Remote_Sense_SPI_DAC MAX5171BOB_Serial_Tester
Revision 0:80a9add62408, committed 2019-05-31
- 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 +