AD5668 Digital to Analog Converter

Committer:
jonebuckman
Date:
Thu Apr 06 12:25:45 2017 +0000
Revision:
1:b54ba779d19a
Parent:
0:55d636c5638a
Child:
2:25d6955d0d38
Update doxy and added methods.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jonebuckman 0:55d636c5638a 1 /**
jonebuckman 0:55d636c5638a 2 * @file AD5668.h
jonebuckman 0:55d636c5638a 3 *
jonebuckman 0:55d636c5638a 4 * @author Jon Buckman
jonebuckman 0:55d636c5638a 5 *
jonebuckman 0:55d636c5638a 6 * @section LICENSE
jonebuckman 0:55d636c5638a 7 *
jonebuckman 0:55d636c5638a 8 * Copyright (c) 2017 Jon Buckman
jonebuckman 0:55d636c5638a 9 *
jonebuckman 0:55d636c5638a 10 * This program is free software: you can redistribute it and/or modify
jonebuckman 0:55d636c5638a 11 * it under the terms of the GNU General Public License as published by
jonebuckman 0:55d636c5638a 12 * the Free Software Foundation, either version 3 of the License, or
jonebuckman 0:55d636c5638a 13 * (at your option) any later version.
jonebuckman 0:55d636c5638a 14 *
jonebuckman 0:55d636c5638a 15 * This program is distributed in the hope that it will be useful,
jonebuckman 0:55d636c5638a 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jonebuckman 0:55d636c5638a 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
jonebuckman 0:55d636c5638a 18 * GNU General Public License for more details.
jonebuckman 0:55d636c5638a 19 *
jonebuckman 0:55d636c5638a 20 * You should have received a copy of the GNU General Public License
jonebuckman 0:55d636c5638a 21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
jonebuckman 0:55d636c5638a 22 *
jonebuckman 0:55d636c5638a 23 * The above copyright notice and this permission notice shall be included in
jonebuckman 0:55d636c5638a 24 * all copies or substantial portions of the Software.
jonebuckman 0:55d636c5638a 25 *
jonebuckman 0:55d636c5638a 26 * @section DESCRIPTION
jonebuckman 0:55d636c5638a 27 *
jonebuckman 0:55d636c5638a 28 * AD5668 Digital to Analog Converter from Analog Devices.
jonebuckman 0:55d636c5638a 29 *
jonebuckman 0:55d636c5638a 30 * Datasheet:
jonebuckman 0:55d636c5638a 31 *
jonebuckman 0:55d636c5638a 32 * http://www.analog.com/media/en/technical-documentation/data-sheets/AD5668.pdf
jonebuckman 0:55d636c5638a 33 *
jonebuckman 1:b54ba779d19a 34 * Tie LDAC and CLR pins to VDD if not being used.
jonebuckman 1:b54ba779d19a 35 *
jonebuckman 0:55d636c5638a 36 * Example:
jonebuckman 0:55d636c5638a 37 * @code
jonebuckman 0:55d636c5638a 38 * #include "mbed.h"
jonebuckman 0:55d636c5638a 39 * #include "AD5668.h"
jonebuckman 0:55d636c5638a 40 *
jonebuckman 0:55d636c5638a 41 * Serial pc(USBTX, USBRX); // tx, rx
jonebuckman 0:55d636c5638a 42 *
jonebuckman 0:55d636c5638a 43 * AD5668 dac(D11, D12, D13, D10); // mosi, miso, sck, cs
jonebuckman 0:55d636c5638a 44 *
jonebuckman 0:55d636c5638a 45 * int main() {
jonebuckman 0:55d636c5638a 46 * while (1) {
jonebuckman 0:55d636c5638a 47 * for (int i = 0; i < 65536; i+=10) {
jonebuckman 0:55d636c5638a 48 * dac.AD5668_WRITE_INPUT_N_UPDATE_N(AD5668_ADDR_DAC_A, i);
jonebuckman 0:55d636c5638a 49 * pc.printf("%d,", i);
jonebuckman 0:55d636c5638a 50 * wait(.01);
jonebuckman 0:55d636c5638a 51 * }
jonebuckman 0:55d636c5638a 52 * }
jonebuckman 0:55d636c5638a 53 * }
jonebuckman 0:55d636c5638a 54 * @endcode
jonebuckman 0:55d636c5638a 55 */
jonebuckman 0:55d636c5638a 56
jonebuckman 0:55d636c5638a 57 #ifndef __AD5668_H__
jonebuckman 0:55d636c5638a 58 #define __AD5668_H__
jonebuckman 0:55d636c5638a 59
jonebuckman 0:55d636c5638a 60 /**
jonebuckman 0:55d636c5638a 61 * Includes
jonebuckman 0:55d636c5638a 62 */
jonebuckman 0:55d636c5638a 63 #include "mbed.h"
jonebuckman 0:55d636c5638a 64
jonebuckman 0:55d636c5638a 65 /**
jonebuckman 0:55d636c5638a 66 * Defines
jonebuckman 0:55d636c5638a 67 */
jonebuckman 0:55d636c5638a 68 /* AD5668 Input Register */
jonebuckman 0:55d636c5638a 69 #define AD5668_CMD(x) ((0x0000000F & (unsigned int)(x)) << 24)
jonebuckman 0:55d636c5638a 70 #define AD5668_ADDR(x) ((0x0000000F & (unsigned int)(x)) << 20)
jonebuckman 0:55d636c5638a 71 #define AD5628_DATA_BITS(x) ((0x000FFFFF & (unsigned int)(x)) << 8)
jonebuckman 0:55d636c5638a 72 #define AD5648_DATA_BITS(x) ((0x000FFFFF & (unsigned int)(x)) << 6)
jonebuckman 0:55d636c5638a 73 #define AD5668_DATA_BITS(x) ((0x000FFFFF & (unsigned int)(x)) << 4)
jonebuckman 0:55d636c5638a 74
jonebuckman 0:55d636c5638a 75 /* Command Definitions (AD5668_COMMAND(x) options) */
jonebuckman 0:55d636c5638a 76 #define AD5668_CMD_WRITE_INPUT_N 0 // Write to Input Register n.
jonebuckman 0:55d636c5638a 77 #define AD5668_CMD_UPDATE_DAC_N 1 // Update DAC Register n.
jonebuckman 0:55d636c5638a 78 #define AD5668_CMD_WRITE_INPUT_N_UPDATE_ALL 2 // Write to Input Register n, update all.
jonebuckman 0:55d636c5638a 79 #define AD5668_CMD_WRITE_INPUT_N_UPDATE_N 3 // Write to and update DAC Channel n.
jonebuckman 0:55d636c5638a 80 #define AD5668_CMD_POWERDOWN 4 // Power down/power up DAC.
jonebuckman 0:55d636c5638a 81 #define AD5668_CMD_LOAD_CLEAR_CODE 5 // Load clear code register.
jonebuckman 0:55d636c5638a 82 #define AD5668_CMD_LOAD_LDAC_REG 6 // Load LDAC register.
jonebuckman 0:55d636c5638a 83 #define AD5668_CMD_RESET 7 // Reset (power-on reset)
jonebuckman 0:55d636c5638a 84 #define AD5668_CMD_SET_INT_REF 8 // Set up internal REF register.
jonebuckman 0:55d636c5638a 85
jonebuckman 0:55d636c5638a 86 /* Address Commands (AD5668_ADDRESS(x) options) */
jonebuckman 0:55d636c5638a 87 #define AD5668_ADDR_DAC_A 0x00 //DAC A
jonebuckman 0:55d636c5638a 88 #define AD5668_ADDR_DAC_B 0x01 //DAC B
jonebuckman 0:55d636c5638a 89 #define AD5668_ADDR_DAC_C 0x02 //DAC C
jonebuckman 0:55d636c5638a 90 #define AD5668_ADDR_DAC_D 0x03 //DAC D
jonebuckman 0:55d636c5638a 91 #define AD5668_ADDR_DAC_E 0x04 //DAC E
jonebuckman 0:55d636c5638a 92 #define AD5668_ADDR_DAC_F 0x05 //DAC F
jonebuckman 0:55d636c5638a 93 #define AD5668_ADDR_DAC_G 0x06 //DAC G
jonebuckman 0:55d636c5638a 94 #define AD5668_ADDR_DAC_H 0x07 //DAC H
jonebuckman 0:55d636c5638a 95 #define AD5668_ADDR_DAC_ALL 0x0F //All DACs
jonebuckman 0:55d636c5638a 96
jonebuckman 0:55d636c5638a 97 /* Internal Reference Register */
jonebuckman 0:55d636c5638a 98 #define AD5668_INT_REF_OFF 0
jonebuckman 0:55d636c5638a 99 #define AD5668_INT_REF_ON 1
jonebuckman 0:55d636c5638a 100
jonebuckman 0:55d636c5638a 101 /* Power-Down Modes of Operation */
jonebuckman 0:55d636c5638a 102 #define AD5668_POWER_MODE(x) ((0x03 & (unsigned short) (x)) << 8)
jonebuckman 0:55d636c5638a 103
jonebuckman 0:55d636c5638a 104 #define AD5668_PWRDN_NONE 0 // Normal operation
jonebuckman 0:55d636c5638a 105 #define AD5668_PWRDN_1K 1 // 1 KOhm to GND (Power-down mode)
jonebuckman 0:55d636c5638a 106 #define AD5668_PWRDN_100K 2 // 100 KOhm to GND (Power-down mode)
jonebuckman 0:55d636c5638a 107 #define AD5668_PWRDN_3STATE 3 // Three-state (Power-down mode)
jonebuckman 0:55d636c5638a 108
jonebuckman 0:55d636c5638a 109 /* Clear Code Function */
jonebuckman 0:55d636c5638a 110 #define AD5668_CODE_0X0000 0
jonebuckman 0:55d636c5638a 111 #define AD5668_CODE_0X8000 1
jonebuckman 0:55d636c5638a 112 #define AD5668_CODE_0XFFFF 2
jonebuckman 0:55d636c5638a 113 #define AD5668_CODE_NOP 3
jonebuckman 0:55d636c5638a 114
jonebuckman 0:55d636c5638a 115 /* SPI */
jonebuckman 0:55d636c5638a 116 #define AD5668_SPI_MAX_DATA_RATE 50000000
jonebuckman 0:55d636c5638a 117
jonebuckman 0:55d636c5638a 118 /**
jonebuckman 0:55d636c5638a 119 * AD5668 Digital to Analog Converter from Analog Devices.
jonebuckman 0:55d636c5638a 120 */
jonebuckman 0:55d636c5638a 121 class AD5668 {
jonebuckman 0:55d636c5638a 122
jonebuckman 0:55d636c5638a 123 public:
jonebuckman 0:55d636c5638a 124
jonebuckman 0:55d636c5638a 125 /**
jonebuckman 0:55d636c5638a 126 * Constructor.
jonebuckman 0:55d636c5638a 127 *
jonebuckman 0:55d636c5638a 128 * @param mosi mbed pin to use for MOSI line of SPI interface.
jonebuckman 0:55d636c5638a 129 * @param miso mbed pin to use for MISO line of SPI interface.
jonebuckman 0:55d636c5638a 130 * @param sck mbed pin to use for SCK line of SPI interface.
jonebuckman 0:55d636c5638a 131 * @param csn mbed pin to use for not chip select line of SPI interface.
jonebuckman 0:55d636c5638a 132 */
jonebuckman 0:55d636c5638a 133 AD5668(PinName mosi, PinName miso, PinName sck, PinName csn);
jonebuckman 0:55d636c5638a 134
jonebuckman 0:55d636c5638a 135 /**
jonebuckman 0:55d636c5638a 136 * Set power mode for each channnel.
jonebuckman 0:55d636c5638a 137 *
jonebuckman 1:b54ba779d19a 138 * @param pwrMode power mode of the device.
jonebuckman 1:b54ba779d19a 139 * @param channel the channel or channels that are being configured.
jonebuckman 0:55d636c5638a 140 */
jonebuckman 0:55d636c5638a 141 void AD5668_PowerMode(unsigned char pwrMode, unsigned char channel);
jonebuckman 0:55d636c5638a 142
jonebuckman 0:55d636c5638a 143 /**
jonebuckman 0:55d636c5638a 144 * Reset the device.
jonebuckman 0:55d636c5638a 145 *
jonebuckman 0:55d636c5638a 146 * @param none.
jonebuckman 0:55d636c5638a 147 */
jonebuckman 0:55d636c5638a 148 void AD5668_Reset(void);
jonebuckman 0:55d636c5638a 149
jonebuckman 0:55d636c5638a 150 /**
jonebuckman 0:55d636c5638a 151 * Write a data word to a channel.
jonebuckman 0:55d636c5638a 152 *
jonebuckman 1:b54ba779d19a 153 * @param channel the channel or channels that are being configured.
jonebuckman 1:b54ba779d19a 154 * @param data the DAC data word.
jonebuckman 0:55d636c5638a 155 */
jonebuckman 0:55d636c5638a 156 void AD5668_WRITE_INPUT_N(uint8_t channel, uint16_t data);
jonebuckman 0:55d636c5638a 157
jonebuckman 0:55d636c5638a 158 /**
jonebuckman 0:55d636c5638a 159 * Latch a data word to a channel.
jonebuckman 0:55d636c5638a 160 *
jonebuckman 1:b54ba779d19a 161 * @param channel the channel or channels that are being configured.
jonebuckman 1:b54ba779d19a 162 * @param data the DAC data word.
jonebuckman 0:55d636c5638a 163 */
jonebuckman 0:55d636c5638a 164 void AD5668_UPDATE_DAC_N(uint8_t channel, uint16_t data);
jonebuckman 0:55d636c5638a 165
jonebuckman 0:55d636c5638a 166 /**
jonebuckman 0:55d636c5638a 167 * Write a data word to a channel and latch all channels.
jonebuckman 0:55d636c5638a 168 *
jonebuckman 1:b54ba779d19a 169 * @param channel the channel or channels that are being configured.
jonebuckman 1:b54ba779d19a 170 * @param data the DAC data word.
jonebuckman 0:55d636c5638a 171 */
jonebuckman 0:55d636c5638a 172 void AD5668_WRITE_INPUT_N_UPDATE_ALL(uint8_t channel, uint16_t data);
jonebuckman 0:55d636c5638a 173
jonebuckman 0:55d636c5638a 174 /**
jonebuckman 0:55d636c5638a 175 * Write a data word to a channel and latch the same channel.
jonebuckman 0:55d636c5638a 176 *
jonebuckman 1:b54ba779d19a 177 * @param channel the channel or channels that are being configured.
jonebuckman 1:b54ba779d19a 178 * @param data the DAC data word.
jonebuckman 0:55d636c5638a 179 */
jonebuckman 0:55d636c5638a 180 void AD5668_WRITE_INPUT_N_UPDATE_N(uint8_t channel, uint16_t data);
jonebuckman 0:55d636c5638a 181
jonebuckman 1:b54ba779d19a 182 /**
jonebuckman 1:b54ba779d19a 183 * Set the internal voltage reference on or off.
jonebuckman 1:b54ba779d19a 184 *
jonebuckman 1:b54ba779d19a 185 * @param val set internal voltage reference.
jonebuckman 1:b54ba779d19a 186 */
jonebuckman 1:b54ba779d19a 187 void AD5668_InternalReference(uint8_t val);
jonebuckman 1:b54ba779d19a 188
jonebuckman 1:b54ba779d19a 189 /**
jonebuckman 1:b54ba779d19a 190 * Set the internal voltage reference on or off.
jonebuckman 1:b54ba779d19a 191 *
jonebuckman 1:b54ba779d19a 192 * @param val clear mode of the device.
jonebuckman 1:b54ba779d19a 193 */
jonebuckman 1:b54ba779d19a 194 void AD5668_ClearCode(uint8_t val);
jonebuckman 1:b54ba779d19a 195
jonebuckman 0:55d636c5638a 196 private:
jonebuckman 0:55d636c5638a 197
jonebuckman 0:55d636c5638a 198 /**
jonebuckman 0:55d636c5638a 199 * Writes a 32-bit data-word to the Input Register of the device.
jonebuckman 0:55d636c5638a 200 *
jonebuckman 1:b54ba779d19a 201 * @param registerValue value of the register.
jonebuckman 0:55d636c5638a 202 */
jonebuckman 0:55d636c5638a 203 void AD5668_SetInputRegister(unsigned int registerValue);
jonebuckman 0:55d636c5638a 204
jonebuckman 0:55d636c5638a 205 /**
jonebuckman 0:55d636c5638a 206 * Write array values to the SPI.
jonebuckman 0:55d636c5638a 207 *
jonebuckman 1:b54ba779d19a 208 * @param reg pointer to the array
jonebuckman 0:55d636c5638a 209 */
jonebuckman 0:55d636c5638a 210 void SPI_Write(unsigned char *reg);
jonebuckman 0:55d636c5638a 211
jonebuckman 0:55d636c5638a 212 SPI spi_;
jonebuckman 0:55d636c5638a 213 DigitalOut nCS_;
jonebuckman 0:55d636c5638a 214
jonebuckman 0:55d636c5638a 215 };
jonebuckman 0:55d636c5638a 216
jonebuckman 0:55d636c5638a 217 #endif /* __AD5668_H__ */