Maxim Integrated MAX5171 14-bit Force/Sense DAC

Dependents:   MAX5171BOB_Tester MAX5171BOB_14bit_Remote_Sense_SPI_DAC MAX5171BOB_Serial_Tester

Committer:
whismanoid
Date:
Wed Oct 30 15:43:40 2019 -0700
Revision:
4:1984eef51fe3
Parent:
3:79839617d532
Child:
5:e8c0dfaeb53b
update docs, remove diagnostic comments, fix utf8 encoding

Who changed what in which revision?

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