Maxim Integrated MAX5171 14-bit Force/Sense DAC

Dependents:   MAX5171BOB_Tester MAX5171BOB_14bit_Remote_Sense_SPI_DAC MAX5171BOB_Serial_Tester

Committer:
whismanoid
Date:
Fri May 31 21:50:12 2019 +0000
Revision:
0:80a9add62408
Child:
1:e73245718b2a
MAX5171 initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
whismanoid 0:80a9add62408 1 // /*******************************************************************************
whismanoid 0:80a9add62408 2 // * Copyright (C) 2019 Maxim Integrated Products, Inc., All Rights Reserved.
whismanoid 0:80a9add62408 3 // *
whismanoid 0:80a9add62408 4 // * Permission is hereby granted, free of charge, to any person obtaining a
whismanoid 0:80a9add62408 5 // * copy of this software and associated documentation files (the "Software"),
whismanoid 0:80a9add62408 6 // * to deal in the Software without restriction, including without limitation
whismanoid 0:80a9add62408 7 // * the rights to use, copy, modify, merge, publish, distribute, sublicense,
whismanoid 0:80a9add62408 8 // * and/or sell copies of the Software, and to permit persons to whom the
whismanoid 0:80a9add62408 9 // * Software is furnished to do so, subject to the following conditions:
whismanoid 0:80a9add62408 10 // *
whismanoid 0:80a9add62408 11 // * The above copyright notice and this permission notice shall be included
whismanoid 0:80a9add62408 12 // * in all copies or substantial portions of the Software.
whismanoid 0:80a9add62408 13 // *
whismanoid 0:80a9add62408 14 // * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
whismanoid 0:80a9add62408 15 // * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
whismanoid 0:80a9add62408 16 // * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
whismanoid 0:80a9add62408 17 // * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
whismanoid 0:80a9add62408 18 // * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
whismanoid 0:80a9add62408 19 // * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
whismanoid 0:80a9add62408 20 // * OTHER DEALINGS IN THE SOFTWARE.
whismanoid 0:80a9add62408 21 // *
whismanoid 0:80a9add62408 22 // * Except as contained in this notice, the name of Maxim Integrated
whismanoid 0:80a9add62408 23 // * Products, Inc. shall not be used except as stated in the Maxim Integrated
whismanoid 0:80a9add62408 24 // * Products, Inc. Branding Policy.
whismanoid 0:80a9add62408 25 // *
whismanoid 0:80a9add62408 26 // * The mere transfer of this software does not imply any licenses
whismanoid 0:80a9add62408 27 // * of trade secrets, proprietary technology, copyrights, patents,
whismanoid 0:80a9add62408 28 // * trademarks, maskwork rights, or any other form of intellectual
whismanoid 0:80a9add62408 29 // * property whatsoever. Maxim Integrated Products, Inc. retains all
whismanoid 0:80a9add62408 30 // * ownership rights.
whismanoid 0:80a9add62408 31 // *******************************************************************************
whismanoid 0:80a9add62408 32 // */
whismanoid 0:80a9add62408 33 // *********************************************************************
whismanoid 0:80a9add62408 34 // @file MAX5171.cpp
whismanoid 0:80a9add62408 35 // *********************************************************************
whismanoid 0:80a9add62408 36 // Device Driver file
whismanoid 0:80a9add62408 37 // DO NOT EDIT; except areas designated "CUSTOMIZE". Automatically generated file.
whismanoid 0:80a9add62408 38 // generated by XMLSystemOfDevicesToMBED.py
whismanoid 0:80a9add62408 39 // System Name = ExampleSystem
whismanoid 0:80a9add62408 40 // System Description = Device driver example
whismanoid 0:80a9add62408 41
whismanoid 0:80a9add62408 42 #include "MAX5171.h"
whismanoid 0:80a9add62408 43
whismanoid 0:80a9add62408 44 // Device Name = MAX5171
whismanoid 0:80a9add62408 45 // Device Description = Low-Power, Serial, 14-Bit, 1-Channel DACs with Force/Sense Voltage Output and SPI Interface
whismanoid 0:80a9add62408 46 // Device Manufacturer = Maxim Integrated
whismanoid 0:80a9add62408 47 // Device PartNumber = MAX5171AEEE+
whismanoid 0:80a9add62408 48 // Device RegValue_Width = DataWidth16bit_HL
whismanoid 0:80a9add62408 49 //
whismanoid 0:80a9add62408 50 // DAC NumChannels = 1
whismanoid 0:80a9add62408 51 // DAC ResolutionBits = 14
whismanoid 0:80a9add62408 52 //
whismanoid 0:80a9add62408 53 // SPI CS = ActiveLow
whismanoid 0:80a9add62408 54 // SPI FrameStart = CS
whismanoid 0:80a9add62408 55 // SPI CPOL = 0
whismanoid 0:80a9add62408 56 // SPI CPHA = 0
whismanoid 0:80a9add62408 57 // SPI MOSI and MISO Data are both stable on Rising edge of SCLK
whismanoid 0:80a9add62408 58 // SPI SCLK Idle Low
whismanoid 0:80a9add62408 59 // SPI SCLKMaxMHz = 10
whismanoid 0:80a9add62408 60 // SPI SCLKMinMHz = 0
whismanoid 0:80a9add62408 61 //
whismanoid 0:80a9add62408 62 // InputPin Name = FB
whismanoid 0:80a9add62408 63 // InputPin Description = Feedback Input
whismanoid 0:80a9add62408 64 // InputPin Function = Analog
whismanoid 0:80a9add62408 65 //
whismanoid 0:80a9add62408 66 // InputPin Name = RS
whismanoid 0:80a9add62408 67 // InputPin Description = Reset Mode Select (digital input). Connect to VDD to select midscale reset output value. Connect to DGND
whismanoid 0:80a9add62408 68 // to select 0 reset output value.
whismanoid 0:80a9add62408 69 // InputPin Function = Configuration
whismanoid 0:80a9add62408 70 //
whismanoid 0:80a9add62408 71 // InputPin Name = PDL#
whismanoid 0:80a9add62408 72 // InputPin Description = Power-Down Lockout (digital input). Connect to VDD to allow shutdown. Connect to DGND to disable shutdown.
whismanoid 0:80a9add62408 73 // InputPin Function = Configuration
whismanoid 0:80a9add62408 74 //
whismanoid 0:80a9add62408 75 // InputPin Name = CLR#
whismanoid 0:80a9add62408 76 // InputPin Description = Clear DAC (digital input). Clears the DAC to its predetermined output state as set by RS.
whismanoid 0:80a9add62408 77 // InputPin Function = Configuration
whismanoid 0:80a9add62408 78 //
whismanoid 0:80a9add62408 79 // InputPin Name = SHDN
whismanoid 0:80a9add62408 80 // InputPin Description = Shutdown (digital input). Pulling SHDN high when PDL = VDD places the chip in shutdown mode with a
whismanoid 0:80a9add62408 81 // maximum shutdown current 0f 10uA.
whismanoid 0:80a9add62408 82 // InputPin Function = Configuration
whismanoid 0:80a9add62408 83 //
whismanoid 0:80a9add62408 84 // OutputPin Name = OUT
whismanoid 0:80a9add62408 85 // OutputPin Description = Analog Voltage Output. High impedance in shutdown. Output voltage is limited to VDD.
whismanoid 0:80a9add62408 86 // OutputPin Function = Analog
whismanoid 0:80a9add62408 87 //
whismanoid 0:80a9add62408 88 // OutputPin Name = UPO
whismanoid 0:80a9add62408 89 // OutputPin Description = User-Programmable Output. State is set by serial input.
whismanoid 0:80a9add62408 90 // OutputPin Function = General-Purpose
whismanoid 0:80a9add62408 91 //
whismanoid 0:80a9add62408 92 // SupplyPin Name = VDD
whismanoid 0:80a9add62408 93 // SupplyPin Description = Positive Supply. Bypass to AGND with a 4.7uF capacitor in parallel with a 0.1uF capacitor.
whismanoid 0:80a9add62408 94 // SupplyPin VinMax = 4.50
whismanoid 0:80a9add62408 95 // SupplyPin VinMin = 5.50
whismanoid 0:80a9add62408 96 // SupplyPin Function = Analog
whismanoid 0:80a9add62408 97 //
whismanoid 0:80a9add62408 98 // SupplyPin Name = REF
whismanoid 0:80a9add62408 99 // SupplyPin Description = Reference Input. Maximum VREF is VDD - 1.4V. Connect an external +2.5V reference.
whismanoid 0:80a9add62408 100 // SupplyPin VinMax = VDD-1.4
whismanoid 0:80a9add62408 101 // SupplyPin VinMin = 0
whismanoid 0:80a9add62408 102 // SupplyPin Function = Analog
whismanoid 0:80a9add62408 103 //
whismanoid 0:80a9add62408 104 // SupplyPin Name = DGND
whismanoid 0:80a9add62408 105 // SupplyPin Description = Digital Ground.
whismanoid 0:80a9add62408 106 // SupplyPin VinMax = 0
whismanoid 0:80a9add62408 107 // SupplyPin VinMin = 0
whismanoid 0:80a9add62408 108 // SupplyPin Function = Analog
whismanoid 0:80a9add62408 109 //
whismanoid 0:80a9add62408 110 // SupplyPin Name = AGND
whismanoid 0:80a9add62408 111 // SupplyPin Description = Analog Ground.
whismanoid 0:80a9add62408 112 // SupplyPin VinMax = 0
whismanoid 0:80a9add62408 113 // SupplyPin VinMin = 0
whismanoid 0:80a9add62408 114 // SupplyPin Function = Analog
whismanoid 0:80a9add62408 115 //
whismanoid 0:80a9add62408 116
whismanoid 0:80a9add62408 117 // CODE GENERATOR: class constructor definition
whismanoid 0:80a9add62408 118 MAX5171::MAX5171(SPI &spi, DigitalOut &cs_pin, // SPI interface
whismanoid 0:80a9add62408 119 // CODE GENERATOR: class constructor definition gpio InputPin pins
whismanoid 0:80a9add62408 120 // AnalogOut &FB_pin, // Analog Input to MAX5171 device
whismanoid 0:80a9add62408 121 DigitalOut &RS_pin, // Digital Configuration Input to MAX5171 device
whismanoid 0:80a9add62408 122 DigitalOut &PDLb_pin, // Digital Configuration Input to MAX5171 device
whismanoid 0:80a9add62408 123 DigitalOut &CLRb_pin, // Digital Configuration Input to MAX5171 device
whismanoid 0:80a9add62408 124 DigitalOut &SHDN_pin, // Digital Configuration Input to MAX5171 device
whismanoid 0:80a9add62408 125 // CODE GENERATOR: class constructor definition gpio OutputPin pins
whismanoid 0:80a9add62408 126 // AnalogIn &OUT_pin, // Analog Output from MAX5171 device
whismanoid 0:80a9add62408 127 DigitalIn &UPO_pin, // Digital General-Purpose Output from MAX5171 device
whismanoid 0:80a9add62408 128 // CODE GENERATOR: class constructor definition ic_variant
whismanoid 0:80a9add62408 129 MAX5171_ic_t ic_variant)
whismanoid 0:80a9add62408 130 // CODE GENERATOR: class constructor initializer list
whismanoid 0:80a9add62408 131 : m_spi(spi), m_cs_pin(cs_pin), // SPI interface
whismanoid 0:80a9add62408 132 // CODE GENERATOR: class constructor initializer list gpio InputPin pins
whismanoid 0:80a9add62408 133 // m_FB_pin(FB_pin), // Analog Input to MAX5171 device
whismanoid 0:80a9add62408 134 m_RS_pin(RS_pin), // Digital Configuration Input to MAX5171 device
whismanoid 0:80a9add62408 135 m_PDLb_pin(PDLb_pin), // Digital Configuration Input to MAX5171 device
whismanoid 0:80a9add62408 136 m_CLRb_pin(CLRb_pin), // Digital Configuration Input to MAX5171 device
whismanoid 0:80a9add62408 137 m_SHDN_pin(SHDN_pin), // Digital Configuration Input to MAX5171 device
whismanoid 0:80a9add62408 138 // CODE GENERATOR: class constructor initializer list gpio OutputPin pins
whismanoid 0:80a9add62408 139 // m_OUT_pin(OUT_pin), // Analog Output from MAX5171 device
whismanoid 0:80a9add62408 140 m_UPO_pin(UPO_pin), // Digital General-Purpose Output from MAX5171 device
whismanoid 0:80a9add62408 141 // CODE GENERATOR: class constructor initializer list ic_variant
whismanoid 0:80a9add62408 142 m_ic_variant(ic_variant)
whismanoid 0:80a9add62408 143 {
whismanoid 0:80a9add62408 144 // CODE GENERATOR: class constructor definition SPI interface initialization
whismanoid 0:80a9add62408 145 //
whismanoid 0:80a9add62408 146 // SPI CS = ActiveLow
whismanoid 0:80a9add62408 147 // SPI FrameStart = CS
whismanoid 0:80a9add62408 148 m_SPI_cs_state = 1;
whismanoid 0:80a9add62408 149 m_cs_pin = m_SPI_cs_state;
whismanoid 0:80a9add62408 150
whismanoid 0:80a9add62408 151 // SPI CPOL = 0
whismanoid 0:80a9add62408 152 // SPI CPHA = 0
whismanoid 0:80a9add62408 153 // SPI MOSI and MISO Data are both stable on Rising edge of SCLK
whismanoid 0:80a9add62408 154 // SPI SCLK Idle Low
whismanoid 0:80a9add62408 155 m_SPI_dataMode = 0; //SPI_MODE0 // CPOL=0,CPHA=0: Rising Edge stable; SCLK idle Low
whismanoid 0:80a9add62408 156 m_spi.format(8,m_SPI_dataMode); // int bits_must_be_8, int mode=0_3 CPOL=0,CPHA=0
whismanoid 0:80a9add62408 157
whismanoid 0:80a9add62408 158 // SPI SCLKMaxMHz = 10
whismanoid 0:80a9add62408 159 // SPI SCLKMinMHz = 0
whismanoid 0:80a9add62408 160 //#define SPI_SCLK_Hz 48000000 // 48MHz
whismanoid 0:80a9add62408 161 //#define SPI_SCLK_Hz 24000000 // 24MHz
whismanoid 0:80a9add62408 162 //#define SPI_SCLK_Hz 12000000 // 12MHz
whismanoid 0:80a9add62408 163 //#define SPI_SCLK_Hz 4000000 // 4MHz
whismanoid 0:80a9add62408 164 //#define SPI_SCLK_Hz 2000000 // 2MHz
whismanoid 0:80a9add62408 165 //#define SPI_SCLK_Hz 1000000 // 1MHz
whismanoid 0:80a9add62408 166 m_SPI_SCLK_Hz = 10000000; // 10MHz; MAX5171 limit is 10MHz
whismanoid 0:80a9add62408 167 m_spi.frequency(m_SPI_SCLK_Hz);
whismanoid 0:80a9add62408 168
whismanoid 0:80a9add62408 169 // TODO1: CODE GENERATOR: class constructor definition gpio InputPin (Input to device) initialization
whismanoid 0:80a9add62408 170 //
whismanoid 0:80a9add62408 171 m_RS_pin = 1; // output logic high -- initial value in constructor
whismanoid 0:80a9add62408 172 m_PDLb_pin = 1; // output logic high -- initial value in constructor
whismanoid 0:80a9add62408 173 m_CLRb_pin = 1; // output logic high -- initial value in constructor
whismanoid 0:80a9add62408 174 m_SHDN_pin = 1; // output logic high -- initial value in constructor
whismanoid 0:80a9add62408 175 }
whismanoid 0:80a9add62408 176
whismanoid 0:80a9add62408 177 // CODE GENERATOR: class destructor definition
whismanoid 0:80a9add62408 178 MAX5171::~MAX5171()
whismanoid 0:80a9add62408 179 {
whismanoid 0:80a9add62408 180 // do nothing
whismanoid 0:80a9add62408 181 }
whismanoid 0:80a9add62408 182
whismanoid 0:80a9add62408 183 // CODE GENERATOR: spi_frequency setter definition
whismanoid 0:80a9add62408 184 // set SPI SCLK frequency
whismanoid 0:80a9add62408 185 void MAX5171::spi_frequency(int spi_sclk_Hz)
whismanoid 0:80a9add62408 186 {
whismanoid 0:80a9add62408 187 m_SPI_SCLK_Hz = spi_sclk_Hz;
whismanoid 0:80a9add62408 188 m_spi.frequency(m_SPI_SCLK_Hz);
whismanoid 0:80a9add62408 189 }
whismanoid 0:80a9add62408 190
whismanoid 0:80a9add62408 191 // CODE GENERATOR: omit global g_MAX5171_device
whismanoid 0:80a9add62408 192 // CODE GENERATOR: extern function declarations
whismanoid 0:80a9add62408 193 // CODE GENERATOR: extern function requirement MAX5171::SPIoutputCS
whismanoid 0:80a9add62408 194 // Assert SPI Chip Select
whismanoid 0:80a9add62408 195 // SPI chip-select for MAX5171
whismanoid 0:80a9add62408 196 //
whismanoid 0:80a9add62408 197 void MAX5171::SPIoutputCS(int isLogicHigh)
whismanoid 0:80a9add62408 198 {
whismanoid 0:80a9add62408 199 // CODE GENERATOR: extern function definition for function SPIoutputCS
whismanoid 0:80a9add62408 200 // CODE GENERATOR: extern function definition for standard SPI interface function SPIoutputCS(int isLogicHigh)
whismanoid 0:80a9add62408 201 m_SPI_cs_state = isLogicHigh;
whismanoid 0:80a9add62408 202 m_cs_pin = m_SPI_cs_state;
whismanoid 0:80a9add62408 203 }
whismanoid 0:80a9add62408 204
whismanoid 0:80a9add62408 205 // CODE GENERATOR: extern function requirement MAX5171::SPIwrite16bits
whismanoid 0:80a9add62408 206 // SPI write 16 bits
whismanoid 0:80a9add62408 207 // SPI interface to MAX5171 shift 16 bits mosiData into MAX5171 DIN
whismanoid 0:80a9add62408 208 //
whismanoid 0:80a9add62408 209 void MAX5171::SPIwrite16bits(int16_t mosiData16)
whismanoid 0:80a9add62408 210 {
whismanoid 0:80a9add62408 211 // CODE GENERATOR: extern function definition for function SPIwrite16bits
whismanoid 0:80a9add62408 212 // TODO1: CODE GENERATOR: extern function definition for standard SPI interface function SPIwrite16bits(int16_t mosiData16)
whismanoid 0:80a9add62408 213 size_t byteCount = 2;
whismanoid 0:80a9add62408 214 static char mosiData[2];
whismanoid 0:80a9add62408 215 static char misoData[2];
whismanoid 0:80a9add62408 216 mosiData[0] = (char)((mosiData16 >> 8) & 0xFF); // MSByte
whismanoid 0:80a9add62408 217 mosiData[1] = (char)((mosiData16 >> 0) & 0xFF); // LSByte
whismanoid 0:80a9add62408 218 //
whismanoid 0:80a9add62408 219 // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts()
whismanoid 0:80a9add62408 220 //~ noInterrupts();
whismanoid 0:80a9add62408 221 //
whismanoid 0:80a9add62408 222 //~ digitalWrite(Scope_Trigger_Pin, LOW); // diagnostic Scope_Trigger_Pin
whismanoid 0:80a9add62408 223 //
whismanoid 0:80a9add62408 224 unsigned int numBytesTransferred = m_spi.write(mosiData, byteCount, misoData, byteCount);
whismanoid 0:80a9add62408 225 //~ m_spi.transfer(mosiData8_FF0000);
whismanoid 0:80a9add62408 226 //~ m_spi.transfer(mosiData16_00FF00);
whismanoid 0:80a9add62408 227 //~ m_spi.transfer(mosiData16_0000FF);
whismanoid 0:80a9add62408 228 //
whismanoid 0:80a9add62408 229 //~ digitalWrite(Scope_Trigger_Pin, HIGH); // diagnostic Scope_Trigger_Pin
whismanoid 0:80a9add62408 230 //
whismanoid 0:80a9add62408 231 // Arduino: begin critical section: noInterrupts() masks all interrupt sources; end critical section with interrupts()
whismanoid 0:80a9add62408 232 //~ interrupts();
whismanoid 0:80a9add62408 233 //
whismanoid 0:80a9add62408 234 // VERIFY: SPIwrite24bits print diagnostic information
whismanoid 0:80a9add62408 235 //cmdLine.serial().printf(" MOSI->"));
whismanoid 0:80a9add62408 236 //cmdLine.serial().printf(" 0x"));
whismanoid 0:80a9add62408 237 //Serial.print( (mosiData8_FF0000 & 0xFF), HEX);
whismanoid 0:80a9add62408 238 //cmdLine.serial().printf(" 0x"));
whismanoid 0:80a9add62408 239 //Serial.print( (mosiData16_00FF00 & 0xFF), HEX);
whismanoid 0:80a9add62408 240 //cmdLine.serial().printf(" 0x"));
whismanoid 0:80a9add62408 241 //Serial.print( (mosiData16_0000FF & 0xFF), HEX);
whismanoid 0:80a9add62408 242 // hex dump mosiData[0..byteCount-1]
whismanoid 0:80a9add62408 243 #if 0 // HAS_MICROUSBSERIAL
whismanoid 0:80a9add62408 244 cmdLine_microUSBserial.serial().printf("\r\nSPI");
whismanoid 0:80a9add62408 245 if (byteCount > 7) {
whismanoid 0:80a9add62408 246 cmdLine_microUSBserial.serial().printf(" byteCount:%d", byteCount);
whismanoid 0:80a9add62408 247 }
whismanoid 0:80a9add62408 248 cmdLine_microUSBserial.serial().printf(" MOSI->");
whismanoid 0:80a9add62408 249 for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++)
whismanoid 0:80a9add62408 250 {
whismanoid 0:80a9add62408 251 cmdLine_microUSBserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]);
whismanoid 0:80a9add62408 252 }
whismanoid 0:80a9add62408 253 // hex dump misoData[0..byteCount-1]
whismanoid 0:80a9add62408 254 cmdLine_microUSBserial.serial().printf(" MISO<-");
whismanoid 0:80a9add62408 255 for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++)
whismanoid 0:80a9add62408 256 {
whismanoid 0:80a9add62408 257 cmdLine_microUSBserial.serial().printf(" 0x%2.2X", misoData[byteIndex]);
whismanoid 0:80a9add62408 258 }
whismanoid 0:80a9add62408 259 cmdLine_microUSBserial.serial().printf(" ");
whismanoid 0:80a9add62408 260 #endif
whismanoid 0:80a9add62408 261 #if 0 // HAS_DAPLINK_SERIAL
whismanoid 0:80a9add62408 262 cmdLine_DAPLINKserial.serial().printf("\r\nSPI");
whismanoid 0:80a9add62408 263 if (byteCount > 7) {
whismanoid 0:80a9add62408 264 cmdLine_DAPLINKserial.serial().printf(" byteCount:%d", byteCount);
whismanoid 0:80a9add62408 265 }
whismanoid 0:80a9add62408 266 cmdLine_DAPLINKserial.serial().printf(" MOSI->");
whismanoid 0:80a9add62408 267 for (unsigned int byteIndex = 0; byteIndex < byteCount; byteIndex++)
whismanoid 0:80a9add62408 268 {
whismanoid 0:80a9add62408 269 cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", mosiData[byteIndex]);
whismanoid 0:80a9add62408 270 }
whismanoid 0:80a9add62408 271 // hex dump misoData[0..byteCount-1]
whismanoid 0:80a9add62408 272 cmdLine_DAPLINKserial.serial().printf(" MISO<-");
whismanoid 0:80a9add62408 273 for (unsigned int byteIndex = 0; byteIndex < numBytesTransferred; byteIndex++)
whismanoid 0:80a9add62408 274 {
whismanoid 0:80a9add62408 275 cmdLine_DAPLINKserial.serial().printf(" 0x%2.2X", misoData[byteIndex]);
whismanoid 0:80a9add62408 276 }
whismanoid 0:80a9add62408 277 cmdLine_DAPLINKserial.serial().printf(" ");
whismanoid 0:80a9add62408 278 #endif
whismanoid 0:80a9add62408 279 // VERIFY: DIAGNOSTIC: print MAX5715 device register write
whismanoid 0:80a9add62408 280 // TODO: MAX5715_print_register_verbose(mosiData8_FF0000, mosiData16_00FFFF);
whismanoid 0:80a9add62408 281 // TODO: print_verbose_SPI_diagnostic(mosiData16_FF00, mosiData16_00FF, misoData16_FF00, misoData16_00FF);
whismanoid 0:80a9add62408 282 //
whismanoid 0:80a9add62408 283 // int misoData16 = (misoData16_FF00 << 8) | misoData16_00FF;
whismanoid 0:80a9add62408 284 // return misoData16;
whismanoid 0:80a9add62408 285 }
whismanoid 0:80a9add62408 286
whismanoid 0:80a9add62408 287 // CODE GENERATOR: class member function definitions
whismanoid 0:80a9add62408 288 //----------------------------------------
whismanoid 0:80a9add62408 289 // Initialize device
whismanoid 0:80a9add62408 290 // @return 1 on success; 0 on failure
whismanoid 0:80a9add62408 291 uint8_t MAX5171::Init(void)
whismanoid 0:80a9add62408 292 {
whismanoid 0:80a9add62408 293
whismanoid 0:80a9add62408 294 //----------------------------------------
whismanoid 0:80a9add62408 295 // success
whismanoid 0:80a9add62408 296 return 1;
whismanoid 0:80a9add62408 297 }
whismanoid 0:80a9add62408 298
whismanoid 0:80a9add62408 299 //----------------------------------------
whismanoid 0:80a9add62408 300 // Return the DAC register value corresponding to physical voltage.
whismanoid 0:80a9add62408 301 // Does not perform any offset or gain correction.
whismanoid 0:80a9add62408 302 //
whismanoid 0:80a9add62408 303 // @pre VRef = Voltage of REF input, in Volts
whismanoid 0:80a9add62408 304 // @param[in] voltage = physical voltage in Volts
whismanoid 0:80a9add62408 305 // @return raw 14-bit MAX5171 code (right justified).
whismanoid 0:80a9add62408 306 uint16_t MAX5171::DACCodeOfVoltage(double voltageV)
whismanoid 0:80a9add62408 307 {
whismanoid 0:80a9add62408 308
whismanoid 0:80a9add62408 309 //----------------------------------------
whismanoid 0:80a9add62408 310 // Linear map min and max endpoints
whismanoid 0:80a9add62408 311 const double MaxScaleVoltage = VRef; // voltage of maximum code 0x3fff
whismanoid 0:80a9add62408 312 const double MinScaleVoltage = 0.0; // voltage of minimum code 0x000
whismanoid 0:80a9add62408 313 const uint16_t FULL_SCALE_CODE_14BIT = 0x3fff;
whismanoid 0:80a9add62408 314 const uint16_t MaxCode = FULL_SCALE_CODE_14BIT;
whismanoid 0:80a9add62408 315 const uint16_t MinCode = 0x000;
whismanoid 0:80a9add62408 316 double codeFraction = (voltageV - MinScaleVoltage) / (MaxScaleVoltage - MinScaleVoltage);
whismanoid 0:80a9add62408 317 double dacRegValueIdeal = ((codeFraction * (double)(MaxCode - MinCode + 1)) + MinCode + 0.5);
whismanoid 0:80a9add62408 318 uint16_t dacRegValue = (uint16_t)dacRegValueIdeal;
whismanoid 0:80a9add62408 319 if (dacRegValueIdeal > MaxCode)
whismanoid 0:80a9add62408 320 {
whismanoid 0:80a9add62408 321 dacRegValue = MaxCode;
whismanoid 0:80a9add62408 322 } else if (dacRegValueIdeal < MinCode)
whismanoid 0:80a9add62408 323 {
whismanoid 0:80a9add62408 324 dacRegValue = MinCode;
whismanoid 0:80a9add62408 325 }
whismanoid 0:80a9add62408 326 return dacRegValue;
whismanoid 0:80a9add62408 327 }
whismanoid 0:80a9add62408 328
whismanoid 0:80a9add62408 329 //----------------------------------------
whismanoid 0:80a9add62408 330 // Return the physical voltage corresponding to DAC register.
whismanoid 0:80a9add62408 331 // Does not perform any offset or gain correction.
whismanoid 0:80a9add62408 332 //
whismanoid 0:80a9add62408 333 // @pre VRef = Voltage of REF input, in Volts
whismanoid 0:80a9add62408 334 // @param[in] value_u14: raw 14-bit MAX5171 code (right justified).
whismanoid 0:80a9add62408 335 // @return physical voltage corresponding to MAX5171 code.
whismanoid 0:80a9add62408 336 double MAX5171::VoltageOfCode(uint16_t value_u14)
whismanoid 0:80a9add62408 337 {
whismanoid 0:80a9add62408 338
whismanoid 0:80a9add62408 339 //----------------------------------------
whismanoid 0:80a9add62408 340 // Linear map min and max endpoints
whismanoid 0:80a9add62408 341 double MaxScaleVoltage = VRef; // voltage of maximum code 0x3fff
whismanoid 0:80a9add62408 342 double MinScaleVoltage = 0.0; // voltage of minimum code 0x000
whismanoid 0:80a9add62408 343 const uint16_t FULL_SCALE_CODE_14BIT = 0x3fff;
whismanoid 0:80a9add62408 344 const uint16_t MaxCode = FULL_SCALE_CODE_14BIT;
whismanoid 0:80a9add62408 345 const uint16_t MinCode = 0x000;
whismanoid 0:80a9add62408 346 double codeFraction = ((double)value_u14 - MinCode) / (MaxCode - MinCode + 1);
whismanoid 0:80a9add62408 347 return MinScaleVoltage + ((MaxScaleVoltage - MinScaleVoltage) * codeFraction);
whismanoid 0:80a9add62408 348 }
whismanoid 0:80a9add62408 349
whismanoid 0:80a9add62408 350 //----------------------------------------
whismanoid 0:80a9add62408 351 // CMD_00dd_dddd_dddd_dddd_CODE
whismanoid 0:80a9add62408 352 //
whismanoid 0:80a9add62408 353 // Load input register; DAC registers are unchanged.
whismanoid 0:80a9add62408 354 // @return 1 on success; 0 on failure
whismanoid 0:80a9add62408 355 uint8_t MAX5171::CODE(uint16_t dacCodeLsbs)
whismanoid 0:80a9add62408 356 {
whismanoid 0:80a9add62408 357
whismanoid 0:80a9add62408 358 //----------------------------------------
whismanoid 0:80a9add62408 359 // Define command code
whismanoid 0:80a9add62408 360 uint16_t mosiData16 = CMD_00dd_dddd_dddd_dddd_CODE
whismanoid 0:80a9add62408 361 | ((0x3FFF & dacCodeLsbs) << 0); // left-align dddd_dddd_dddd
whismanoid 0:80a9add62408 362
whismanoid 0:80a9add62408 363 //----------------------------------------
whismanoid 0:80a9add62408 364 // SPI write 16-bit mosiData16
whismanoid 0:80a9add62408 365 SPIoutputCS(0);
whismanoid 0:80a9add62408 366 SPIwrite16bits(mosiData16);
whismanoid 0:80a9add62408 367 SPIoutputCS(1);
whismanoid 0:80a9add62408 368
whismanoid 0:80a9add62408 369 //----------------------------------------
whismanoid 0:80a9add62408 370 // shadow of write-only register CMD_00dd_dddd_dddd_dddd_CODE
whismanoid 0:80a9add62408 371 DACCode = dacCodeLsbs;
whismanoid 0:80a9add62408 372
whismanoid 0:80a9add62408 373 //----------------------------------------
whismanoid 0:80a9add62408 374 // success
whismanoid 0:80a9add62408 375 return 1;
whismanoid 0:80a9add62408 376 }
whismanoid 0:80a9add62408 377
whismanoid 0:80a9add62408 378 //----------------------------------------
whismanoid 0:80a9add62408 379 // CMD_01dd_dddd_dddd_dddd_CODE_LOAD
whismanoid 0:80a9add62408 380 //
whismanoid 0:80a9add62408 381 // Load input register; DAC registers are updated (start up DAC with new data).
whismanoid 0:80a9add62408 382 // @return 1 on success; 0 on failure
whismanoid 0:80a9add62408 383 uint8_t MAX5171::CODE_LOAD(uint16_t dacCodeLsbs)
whismanoid 0:80a9add62408 384 {
whismanoid 0:80a9add62408 385
whismanoid 0:80a9add62408 386 //----------------------------------------
whismanoid 0:80a9add62408 387 // Define command code
whismanoid 0:80a9add62408 388 uint16_t mosiData16 = CMD_01dd_dddd_dddd_dddd_CODE_LOAD
whismanoid 0:80a9add62408 389 | ((0x3FFF & dacCodeLsbs) << 0); // left-align dddd_dddd_dddd
whismanoid 0:80a9add62408 390
whismanoid 0:80a9add62408 391 //----------------------------------------
whismanoid 0:80a9add62408 392 // SPI write 16-bit mosiData16
whismanoid 0:80a9add62408 393 SPIoutputCS(0);
whismanoid 0:80a9add62408 394 SPIwrite16bits(mosiData16);
whismanoid 0:80a9add62408 395 SPIoutputCS(1);
whismanoid 0:80a9add62408 396
whismanoid 0:80a9add62408 397 //----------------------------------------
whismanoid 0:80a9add62408 398 // shadow of write-only register CMD_00dd_dddd_dddd_dddd_CODE
whismanoid 0:80a9add62408 399 DACCode = dacCodeLsbs;
whismanoid 0:80a9add62408 400
whismanoid 0:80a9add62408 401 //----------------------------------------
whismanoid 0:80a9add62408 402 // success
whismanoid 0:80a9add62408 403 return 1;
whismanoid 0:80a9add62408 404 }
whismanoid 0:80a9add62408 405
whismanoid 0:80a9add62408 406 //----------------------------------------
whismanoid 0:80a9add62408 407 // CMD_10xx_xxxx_xxxx_xxxx_LOAD
whismanoid 0:80a9add62408 408 //
whismanoid 0:80a9add62408 409 // Update DAC register from input register (start up DAC with data previously
whismanoid 0:80a9add62408 410 // stored in the input registers).
whismanoid 0:80a9add62408 411 // @return 1 on success; 0 on failure
whismanoid 0:80a9add62408 412 uint8_t MAX5171::LOAD(void)
whismanoid 0:80a9add62408 413 {
whismanoid 0:80a9add62408 414
whismanoid 0:80a9add62408 415 //----------------------------------------
whismanoid 0:80a9add62408 416 // Define command code
whismanoid 0:80a9add62408 417 uint16_t mosiData16 = CMD_10xx_xxxx_xxxx_xxxx_LOAD;
whismanoid 0:80a9add62408 418
whismanoid 0:80a9add62408 419 //----------------------------------------
whismanoid 0:80a9add62408 420 // SPI write 16-bit mosiData16
whismanoid 0:80a9add62408 421 SPIoutputCS(0);
whismanoid 0:80a9add62408 422 SPIwrite16bits(mosiData16);
whismanoid 0:80a9add62408 423 SPIoutputCS(1);
whismanoid 0:80a9add62408 424
whismanoid 0:80a9add62408 425 //----------------------------------------
whismanoid 0:80a9add62408 426 // success
whismanoid 0:80a9add62408 427 return 1;
whismanoid 0:80a9add62408 428 }
whismanoid 0:80a9add62408 429
whismanoid 0:80a9add62408 430 //----------------------------------------
whismanoid 0:80a9add62408 431 // CMD_1100_xxxx_xxxx_xxxx_NOP
whismanoid 0:80a9add62408 432 //
whismanoid 0:80a9add62408 433 // No operation (NOP).
whismanoid 0:80a9add62408 434 // @return 1 on success; 0 on failure
whismanoid 0:80a9add62408 435 uint8_t MAX5171::NOP(void)
whismanoid 0:80a9add62408 436 {
whismanoid 0:80a9add62408 437
whismanoid 0:80a9add62408 438 //----------------------------------------
whismanoid 0:80a9add62408 439 // Define command code
whismanoid 0:80a9add62408 440 uint16_t mosiData16 = CMD_1100_xxxx_xxxx_xxxx_NOP;
whismanoid 0:80a9add62408 441
whismanoid 0:80a9add62408 442 //----------------------------------------
whismanoid 0:80a9add62408 443 // SPI write 16-bit mosiData16
whismanoid 0:80a9add62408 444 SPIoutputCS(0);
whismanoid 0:80a9add62408 445 SPIwrite16bits(mosiData16);
whismanoid 0:80a9add62408 446 SPIoutputCS(1);
whismanoid 0:80a9add62408 447
whismanoid 0:80a9add62408 448 //----------------------------------------
whismanoid 0:80a9add62408 449 // success
whismanoid 0:80a9add62408 450 return 1;
whismanoid 0:80a9add62408 451 }
whismanoid 0:80a9add62408 452
whismanoid 0:80a9add62408 453 //----------------------------------------
whismanoid 0:80a9add62408 454 // CMD_1101_xxxx_xxxx_xxxx_SHUTDOWN
whismanoid 0:80a9add62408 455 //
whismanoid 0:80a9add62408 456 // Shut down DAC (provided PDL# = 1).
whismanoid 0:80a9add62408 457 // @return 1 on success; 0 on failure
whismanoid 0:80a9add62408 458 uint8_t MAX5171::SHUTDOWN(void)
whismanoid 0:80a9add62408 459 {
whismanoid 0:80a9add62408 460
whismanoid 0:80a9add62408 461 //----------------------------------------
whismanoid 0:80a9add62408 462 // Define command code
whismanoid 0:80a9add62408 463 uint16_t mosiData16 = CMD_1101_xxxx_xxxx_xxxx_SHUTDOWN;
whismanoid 0:80a9add62408 464
whismanoid 0:80a9add62408 465 //----------------------------------------
whismanoid 0:80a9add62408 466 // SPI write 16-bit mosiData16
whismanoid 0:80a9add62408 467 SPIoutputCS(0);
whismanoid 0:80a9add62408 468 SPIwrite16bits(mosiData16);
whismanoid 0:80a9add62408 469 SPIoutputCS(1);
whismanoid 0:80a9add62408 470
whismanoid 0:80a9add62408 471 //----------------------------------------
whismanoid 0:80a9add62408 472 // success
whismanoid 0:80a9add62408 473 return 1;
whismanoid 0:80a9add62408 474 }
whismanoid 0:80a9add62408 475
whismanoid 0:80a9add62408 476 //----------------------------------------
whismanoid 0:80a9add62408 477 // CMD_1110_0xxx_xxxx_xxxx_UPO_LOW
whismanoid 0:80a9add62408 478 //
whismanoid 0:80a9add62408 479 // UPO goes low (default).
whismanoid 0:80a9add62408 480 // @return 1 on success; 0 on failure
whismanoid 0:80a9add62408 481 uint8_t MAX5171::UPO_LOW(void)
whismanoid 0:80a9add62408 482 {
whismanoid 0:80a9add62408 483
whismanoid 0:80a9add62408 484 //----------------------------------------
whismanoid 0:80a9add62408 485 // Define command code
whismanoid 0:80a9add62408 486 uint16_t mosiData16 = CMD_1110_0xxx_xxxx_xxxx_UPO_LOW;
whismanoid 0:80a9add62408 487
whismanoid 0:80a9add62408 488 //----------------------------------------
whismanoid 0:80a9add62408 489 // SPI write 16-bit mosiData16
whismanoid 0:80a9add62408 490 SPIoutputCS(0);
whismanoid 0:80a9add62408 491 SPIwrite16bits(mosiData16);
whismanoid 0:80a9add62408 492 SPIoutputCS(1);
whismanoid 0:80a9add62408 493
whismanoid 0:80a9add62408 494 //----------------------------------------
whismanoid 0:80a9add62408 495 // success
whismanoid 0:80a9add62408 496 return 1;
whismanoid 0:80a9add62408 497 }
whismanoid 0:80a9add62408 498
whismanoid 0:80a9add62408 499 //----------------------------------------
whismanoid 0:80a9add62408 500 // CMD_1110_1xxx_xxxx_xxxx_UPO_HIGH
whismanoid 0:80a9add62408 501 //
whismanoid 0:80a9add62408 502 // UPO goes high.
whismanoid 0:80a9add62408 503 // @return 1 on success; 0 on failure
whismanoid 0:80a9add62408 504 uint8_t MAX5171::UPO_HIGH(void)
whismanoid 0:80a9add62408 505 {
whismanoid 0:80a9add62408 506
whismanoid 0:80a9add62408 507 //----------------------------------------
whismanoid 0:80a9add62408 508 // Define command code
whismanoid 0:80a9add62408 509 uint16_t mosiData16 = CMD_1110_1xxx_xxxx_xxxx_UPO_HIGH;
whismanoid 0:80a9add62408 510
whismanoid 0:80a9add62408 511 //----------------------------------------
whismanoid 0:80a9add62408 512 // SPI write 16-bit mosiData16
whismanoid 0:80a9add62408 513 SPIoutputCS(0);
whismanoid 0:80a9add62408 514 SPIwrite16bits(mosiData16);
whismanoid 0:80a9add62408 515 SPIoutputCS(1);
whismanoid 0:80a9add62408 516
whismanoid 0:80a9add62408 517 //----------------------------------------
whismanoid 0:80a9add62408 518 // success
whismanoid 0:80a9add62408 519 return 1;
whismanoid 0:80a9add62408 520 }
whismanoid 0:80a9add62408 521
whismanoid 0:80a9add62408 522 //----------------------------------------
whismanoid 0:80a9add62408 523 // CMD_1111_0xxx_xxxx_xxxx_MODE1_DOUT_SCLK_RISING_EDGE
whismanoid 0:80a9add62408 524 //
whismanoid 0:80a9add62408 525 // Mode 1, DOUT clocked out on SCLK’s rising edge.
whismanoid 0:80a9add62408 526 // @return 1 on success; 0 on failure
whismanoid 0:80a9add62408 527 uint8_t MAX5171::MODE1_DOUT_SCLK_RISING_EDGE(void)
whismanoid 0:80a9add62408 528 {
whismanoid 0:80a9add62408 529
whismanoid 0:80a9add62408 530 //----------------------------------------
whismanoid 0:80a9add62408 531 // Define command code
whismanoid 0:80a9add62408 532 uint16_t mosiData16 = CMD_1111_0xxx_xxxx_xxxx_MODE1_DOUT_SCLK_RISING_EDGE;
whismanoid 0:80a9add62408 533
whismanoid 0:80a9add62408 534 //----------------------------------------
whismanoid 0:80a9add62408 535 // SPI write 16-bit mosiData16
whismanoid 0:80a9add62408 536 SPIoutputCS(0);
whismanoid 0:80a9add62408 537 SPIwrite16bits(mosiData16);
whismanoid 0:80a9add62408 538 SPIoutputCS(1);
whismanoid 0:80a9add62408 539
whismanoid 0:80a9add62408 540 //----------------------------------------
whismanoid 0:80a9add62408 541 // success
whismanoid 0:80a9add62408 542 return 1;
whismanoid 0:80a9add62408 543 }
whismanoid 0:80a9add62408 544
whismanoid 0:80a9add62408 545 //----------------------------------------
whismanoid 0:80a9add62408 546 // CMD_1111_1xxx_xxxx_xxxx_MODE0_DOUT_SCLK_FALLING_EDGE
whismanoid 0:80a9add62408 547 //
whismanoid 0:80a9add62408 548 // Mode 0, DOUT clocked out on SCLK’s falling edge (default).
whismanoid 0:80a9add62408 549 // @return 1 on success; 0 on failure
whismanoid 0:80a9add62408 550 uint8_t MAX5171::MODE0_DOUT_SCLK_FALLING_EDGE(void)
whismanoid 0:80a9add62408 551 {
whismanoid 0:80a9add62408 552
whismanoid 0:80a9add62408 553 //----------------------------------------
whismanoid 0:80a9add62408 554 // Define command code
whismanoid 0:80a9add62408 555 uint16_t mosiData16 = CMD_1111_1xxx_xxxx_xxxx_MODE0_DOUT_SCLK_FALLING_EDGE;
whismanoid 0:80a9add62408 556
whismanoid 0:80a9add62408 557 //----------------------------------------
whismanoid 0:80a9add62408 558 // SPI write 16-bit mosiData16
whismanoid 0:80a9add62408 559 SPIoutputCS(0);
whismanoid 0:80a9add62408 560 SPIwrite16bits(mosiData16);
whismanoid 0:80a9add62408 561 SPIoutputCS(1);
whismanoid 0:80a9add62408 562
whismanoid 0:80a9add62408 563 //----------------------------------------
whismanoid 0:80a9add62408 564 // success
whismanoid 0:80a9add62408 565 return 1;
whismanoid 0:80a9add62408 566 }
whismanoid 0:80a9add62408 567
whismanoid 0:80a9add62408 568
whismanoid 0:80a9add62408 569 // End of file
whismanoid 0:80a9add62408 570