AD5668 Digital to Analog Converter

Committer:
jonebuckman
Date:
Wed Apr 05 22:15:15 2017 +0000
Revision:
0:55d636c5638a
Child:
1:b54ba779d19a
Original version.

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 0:55d636c5638a 34 * Example:
jonebuckman 0:55d636c5638a 35 * @code
jonebuckman 0:55d636c5638a 36 * #include "mbed.h"
jonebuckman 0:55d636c5638a 37 * #include "AD5668.h"
jonebuckman 0:55d636c5638a 38 *
jonebuckman 0:55d636c5638a 39 * Serial pc(USBTX, USBRX); // tx, rx
jonebuckman 0:55d636c5638a 40 *
jonebuckman 0:55d636c5638a 41 * AD5668 dac(D11, D12, D13, D10); // mosi, miso, sck, cs
jonebuckman 0:55d636c5638a 42 *
jonebuckman 0:55d636c5638a 43 * int main() {
jonebuckman 0:55d636c5638a 44 * while (1) {
jonebuckman 0:55d636c5638a 45 * for (int i = 0; i < 65536; i+=10) {
jonebuckman 0:55d636c5638a 46 * dac.AD5668_WRITE_INPUT_N_UPDATE_N(AD5668_ADDR_DAC_A, i);
jonebuckman 0:55d636c5638a 47 * pc.printf("%d,", i);
jonebuckman 0:55d636c5638a 48 * wait(.01);
jonebuckman 0:55d636c5638a 49 * }
jonebuckman 0:55d636c5638a 50 * }
jonebuckman 0:55d636c5638a 51 * }
jonebuckman 0:55d636c5638a 52 * @endcode
jonebuckman 0:55d636c5638a 53 */
jonebuckman 0:55d636c5638a 54
jonebuckman 0:55d636c5638a 55 #ifndef __AD5668_H__
jonebuckman 0:55d636c5638a 56 #define __AD5668_H__
jonebuckman 0:55d636c5638a 57
jonebuckman 0:55d636c5638a 58 /**
jonebuckman 0:55d636c5638a 59 * Includes
jonebuckman 0:55d636c5638a 60 */
jonebuckman 0:55d636c5638a 61 #include "mbed.h"
jonebuckman 0:55d636c5638a 62
jonebuckman 0:55d636c5638a 63 /**
jonebuckman 0:55d636c5638a 64 * Defines
jonebuckman 0:55d636c5638a 65 */
jonebuckman 0:55d636c5638a 66 /* AD5668 Input Register */
jonebuckman 0:55d636c5638a 67 #define AD5668_CMD(x) ((0x0000000F & (unsigned int)(x)) << 24)
jonebuckman 0:55d636c5638a 68 #define AD5668_ADDR(x) ((0x0000000F & (unsigned int)(x)) << 20)
jonebuckman 0:55d636c5638a 69 #define AD5628_DATA_BITS(x) ((0x000FFFFF & (unsigned int)(x)) << 8)
jonebuckman 0:55d636c5638a 70 #define AD5648_DATA_BITS(x) ((0x000FFFFF & (unsigned int)(x)) << 6)
jonebuckman 0:55d636c5638a 71 #define AD5668_DATA_BITS(x) ((0x000FFFFF & (unsigned int)(x)) << 4)
jonebuckman 0:55d636c5638a 72
jonebuckman 0:55d636c5638a 73 /* Command Definitions (AD5668_COMMAND(x) options) */
jonebuckman 0:55d636c5638a 74 #define AD5668_CMD_WRITE_INPUT_N 0 // Write to Input Register n.
jonebuckman 0:55d636c5638a 75 #define AD5668_CMD_UPDATE_DAC_N 1 // Update DAC Register n.
jonebuckman 0:55d636c5638a 76 #define AD5668_CMD_WRITE_INPUT_N_UPDATE_ALL 2 // Write to Input Register n, update all.
jonebuckman 0:55d636c5638a 77 #define AD5668_CMD_WRITE_INPUT_N_UPDATE_N 3 // Write to and update DAC Channel n.
jonebuckman 0:55d636c5638a 78 #define AD5668_CMD_POWERDOWN 4 // Power down/power up DAC.
jonebuckman 0:55d636c5638a 79 #define AD5668_CMD_LOAD_CLEAR_CODE 5 // Load clear code register.
jonebuckman 0:55d636c5638a 80 #define AD5668_CMD_LOAD_LDAC_REG 6 // Load LDAC register.
jonebuckman 0:55d636c5638a 81 #define AD5668_CMD_RESET 7 // Reset (power-on reset)
jonebuckman 0:55d636c5638a 82 #define AD5668_CMD_SET_INT_REF 8 // Set up internal REF register.
jonebuckman 0:55d636c5638a 83
jonebuckman 0:55d636c5638a 84 /* Address Commands (AD5668_ADDRESS(x) options) */
jonebuckman 0:55d636c5638a 85 #define AD5668_ADDR_DAC_A 0x00 //DAC A
jonebuckman 0:55d636c5638a 86 #define AD5668_ADDR_DAC_B 0x01 //DAC B
jonebuckman 0:55d636c5638a 87 #define AD5668_ADDR_DAC_C 0x02 //DAC C
jonebuckman 0:55d636c5638a 88 #define AD5668_ADDR_DAC_D 0x03 //DAC D
jonebuckman 0:55d636c5638a 89 #define AD5668_ADDR_DAC_E 0x04 //DAC E
jonebuckman 0:55d636c5638a 90 #define AD5668_ADDR_DAC_F 0x05 //DAC F
jonebuckman 0:55d636c5638a 91 #define AD5668_ADDR_DAC_G 0x06 //DAC G
jonebuckman 0:55d636c5638a 92 #define AD5668_ADDR_DAC_H 0x07 //DAC H
jonebuckman 0:55d636c5638a 93 #define AD5668_ADDR_DAC_ALL 0x0F //All DACs
jonebuckman 0:55d636c5638a 94
jonebuckman 0:55d636c5638a 95 /* Internal Reference Register */
jonebuckman 0:55d636c5638a 96 #define AD5668_INT_REF_OFF 0
jonebuckman 0:55d636c5638a 97 #define AD5668_INT_REF_ON 1
jonebuckman 0:55d636c5638a 98
jonebuckman 0:55d636c5638a 99 /* Power-Down Modes of Operation */
jonebuckman 0:55d636c5638a 100 #define AD5668_POWER_MODE(x) ((0x03 & (unsigned short) (x)) << 8)
jonebuckman 0:55d636c5638a 101
jonebuckman 0:55d636c5638a 102 #define AD5668_PWRDN_NONE 0 // Normal operation
jonebuckman 0:55d636c5638a 103 #define AD5668_PWRDN_1K 1 // 1 KOhm to GND (Power-down mode)
jonebuckman 0:55d636c5638a 104 #define AD5668_PWRDN_100K 2 // 100 KOhm to GND (Power-down mode)
jonebuckman 0:55d636c5638a 105 #define AD5668_PWRDN_3STATE 3 // Three-state (Power-down mode)
jonebuckman 0:55d636c5638a 106
jonebuckman 0:55d636c5638a 107 /* Clear Code Function */
jonebuckman 0:55d636c5638a 108 #define AD5668_CODE_0X0000 0
jonebuckman 0:55d636c5638a 109 #define AD5668_CODE_0X8000 1
jonebuckman 0:55d636c5638a 110 #define AD5668_CODE_0XFFFF 2
jonebuckman 0:55d636c5638a 111 #define AD5668_CODE_NOP 3
jonebuckman 0:55d636c5638a 112
jonebuckman 0:55d636c5638a 113 /* SPI */
jonebuckman 0:55d636c5638a 114 #define AD5668_SPI_MAX_DATA_RATE 50000000
jonebuckman 0:55d636c5638a 115
jonebuckman 0:55d636c5638a 116 /**
jonebuckman 0:55d636c5638a 117 * AD5668 Digital to Analog Converter from Analog Devices.
jonebuckman 0:55d636c5638a 118 */
jonebuckman 0:55d636c5638a 119 class AD5668 {
jonebuckman 0:55d636c5638a 120
jonebuckman 0:55d636c5638a 121 public:
jonebuckman 0:55d636c5638a 122
jonebuckman 0:55d636c5638a 123 /**
jonebuckman 0:55d636c5638a 124 * Constructor.
jonebuckman 0:55d636c5638a 125 *
jonebuckman 0:55d636c5638a 126 * @param mosi mbed pin to use for MOSI line of SPI interface.
jonebuckman 0:55d636c5638a 127 * @param miso mbed pin to use for MISO line of SPI interface.
jonebuckman 0:55d636c5638a 128 * @param sck mbed pin to use for SCK line of SPI interface.
jonebuckman 0:55d636c5638a 129 * @param csn mbed pin to use for not chip select line of SPI interface.
jonebuckman 0:55d636c5638a 130 */
jonebuckman 0:55d636c5638a 131 AD5668(PinName mosi, PinName miso, PinName sck, PinName csn);
jonebuckman 0:55d636c5638a 132
jonebuckman 0:55d636c5638a 133 /**
jonebuckman 0:55d636c5638a 134 * Set power mode for each channnel.
jonebuckman 0:55d636c5638a 135 *
jonebuckman 0:55d636c5638a 136 * @param pwrMode - power mode of the device.
jonebuckman 0:55d636c5638a 137 * Example: AD5668_PWRDN_NONE,
jonebuckman 0:55d636c5638a 138 * AD5668_PWRDN_1K,
jonebuckman 0:55d636c5638a 139 * AD5668_PWRDN_100K,
jonebuckman 0:55d636c5638a 140 * AD5668_PWRDN_3STATE
jonebuckman 0:55d636c5638a 141 *
jonebuckman 0:55d636c5638a 142 * @param channel - The channel or channels that are being configured.
jonebuckman 0:55d636c5638a 143 * Example: AD5668_ADDR_DAC_A,
jonebuckman 0:55d636c5638a 144 * AD5668_ADDR_DAC_B,
jonebuckman 0:55d636c5638a 145 * ...
jonebuckman 0:55d636c5638a 146 * AD5668_ADDR_DAC_ALL
jonebuckman 0:55d636c5638a 147 */
jonebuckman 0:55d636c5638a 148 void AD5668_PowerMode(unsigned char pwrMode, unsigned char channel);
jonebuckman 0:55d636c5638a 149
jonebuckman 0:55d636c5638a 150 /**
jonebuckman 0:55d636c5638a 151 * Reset the device.
jonebuckman 0:55d636c5638a 152 *
jonebuckman 0:55d636c5638a 153 * @param none.
jonebuckman 0:55d636c5638a 154 */
jonebuckman 0:55d636c5638a 155 void AD5668_Reset(void);
jonebuckman 0:55d636c5638a 156
jonebuckman 0:55d636c5638a 157 /**
jonebuckman 0:55d636c5638a 158 * Write a data word to a channel.
jonebuckman 0:55d636c5638a 159 *
jonebuckman 0:55d636c5638a 160 * @param channel - The channel or channels that are being configured.
jonebuckman 0:55d636c5638a 161 * @param data - The DAC data word.
jonebuckman 0:55d636c5638a 162 */
jonebuckman 0:55d636c5638a 163 void AD5668_WRITE_INPUT_N(uint8_t channel, uint16_t data);
jonebuckman 0:55d636c5638a 164
jonebuckman 0:55d636c5638a 165 /**
jonebuckman 0:55d636c5638a 166 * Latch a data word to a channel.
jonebuckman 0:55d636c5638a 167 *
jonebuckman 0:55d636c5638a 168 * @param channel - The channel or channels that are being configured.
jonebuckman 0:55d636c5638a 169 * @param data - The DAC data word.
jonebuckman 0:55d636c5638a 170 */
jonebuckman 0:55d636c5638a 171 void AD5668_UPDATE_DAC_N(uint8_t channel, uint16_t data);
jonebuckman 0:55d636c5638a 172
jonebuckman 0:55d636c5638a 173 /**
jonebuckman 0:55d636c5638a 174 * Write a data word to a channel and latch all channels.
jonebuckman 0:55d636c5638a 175 *
jonebuckman 0:55d636c5638a 176 * @param channel - The channel or channels that are being configured.
jonebuckman 0:55d636c5638a 177 * @param data - The DAC data word.
jonebuckman 0:55d636c5638a 178 */
jonebuckman 0:55d636c5638a 179 void AD5668_WRITE_INPUT_N_UPDATE_ALL(uint8_t channel, uint16_t data);
jonebuckman 0:55d636c5638a 180
jonebuckman 0:55d636c5638a 181 /**
jonebuckman 0:55d636c5638a 182 * Write a data word to a channel and latch the same channel.
jonebuckman 0:55d636c5638a 183 *
jonebuckman 0:55d636c5638a 184 * @param channel - The channel or channels that are being configured.
jonebuckman 0:55d636c5638a 185 * @param data - The DAC data word.
jonebuckman 0:55d636c5638a 186 */
jonebuckman 0:55d636c5638a 187 void AD5668_WRITE_INPUT_N_UPDATE_N(uint8_t channel, uint16_t data);
jonebuckman 0:55d636c5638a 188
jonebuckman 0:55d636c5638a 189 private:
jonebuckman 0:55d636c5638a 190
jonebuckman 0:55d636c5638a 191 /**
jonebuckman 0:55d636c5638a 192 * Writes a 32-bit data-word to the Input Register of the device.
jonebuckman 0:55d636c5638a 193 *
jonebuckman 0:55d636c5638a 194 * @param registerValue - Value of the register.
jonebuckman 0:55d636c5638a 195 */
jonebuckman 0:55d636c5638a 196 void AD5668_SetInputRegister(unsigned int registerValue);
jonebuckman 0:55d636c5638a 197
jonebuckman 0:55d636c5638a 198 /**
jonebuckman 0:55d636c5638a 199 * Write array values to the SPI.
jonebuckman 0:55d636c5638a 200 *
jonebuckman 0:55d636c5638a 201 * @param pointer to the array
jonebuckman 0:55d636c5638a 202 */
jonebuckman 0:55d636c5638a 203 void SPI_Write(unsigned char *reg);
jonebuckman 0:55d636c5638a 204
jonebuckman 0:55d636c5638a 205 SPI spi_;
jonebuckman 0:55d636c5638a 206 DigitalOut nCS_;
jonebuckman 0:55d636c5638a 207
jonebuckman 0:55d636c5638a 208 };
jonebuckman 0:55d636c5638a 209
jonebuckman 0:55d636c5638a 210 #endif /* __AD5668_H__ */