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.cpp
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
jonebuckman 0:55d636c5638a 35 /**
jonebuckman 0:55d636c5638a 36 * Includes
jonebuckman 0:55d636c5638a 37 */
jonebuckman 0:55d636c5638a 38 #include "ad5668.h"
jonebuckman 0:55d636c5638a 39
jonebuckman 0:55d636c5638a 40 /**
jonebuckman 0:55d636c5638a 41 * Defines
jonebuckman 0:55d636c5638a 42 */
jonebuckman 0:55d636c5638a 43
jonebuckman 0:55d636c5638a 44
jonebuckman 0:55d636c5638a 45 /**
jonebuckman 0:55d636c5638a 46 * Methods
jonebuckman 0:55d636c5638a 47 */
jonebuckman 0:55d636c5638a 48 AD5668::AD5668(PinName mosi,
jonebuckman 0:55d636c5638a 49 PinName miso,
jonebuckman 0:55d636c5638a 50 PinName sck,
jonebuckman 0:55d636c5638a 51 PinName csn) : spi_(mosi, miso, sck), nCS_(csn) {
jonebuckman 0:55d636c5638a 52
jonebuckman 0:55d636c5638a 53 nCS_ = 1;
jonebuckman 0:55d636c5638a 54
jonebuckman 0:55d636c5638a 55 spi_.frequency(AD5668_SPI_MAX_DATA_RATE/5); // 2Mbit, 1/5th the maximum transfer rate for the SPI bus
jonebuckman 0:55d636c5638a 56 spi_.format(8,1); // 8-bit, ClockPhase = 0, ClockPolarity = 1
jonebuckman 0:55d636c5638a 57
jonebuckman 0:55d636c5638a 58 /* Behaves as a power-on reset. */
jonebuckman 0:55d636c5638a 59 AD5668_Reset();
jonebuckman 0:55d636c5638a 60 /* Turns on the on-board reference. */
jonebuckman 0:55d636c5638a 61 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_SET_INT_REF)| AD5668_INT_REF_ON);
jonebuckman 0:55d636c5638a 62 /* Clear code is set to 0x0000. */
jonebuckman 0:55d636c5638a 63 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_LOAD_CLEAR_CODE)| AD5668_CODE_0X0000);
jonebuckman 0:55d636c5638a 64 }
jonebuckman 0:55d636c5638a 65
jonebuckman 0:55d636c5638a 66 /***************************************************************************//**
jonebuckman 0:55d636c5638a 67 * @brief Sets the device in a specific power mode.
jonebuckman 0:55d636c5638a 68 *
jonebuckman 0:55d636c5638a 69 * @param pwrMode - power mode of the device.
jonebuckman 0:55d636c5638a 70 * Example: AD5668_PWRDN_NONE
jonebuckman 0:55d636c5638a 71 * AD5668_PWRDN_1K
jonebuckman 0:55d636c5638a 72 * AD5668_PWRDN_100K
jonebuckman 0:55d636c5638a 73 * AD5668_PWRDN_3STATE
jonebuckman 0:55d636c5638a 74 *
jonebuckman 0:55d636c5638a 75 * @param channel - The channel or channels that are being configured.
jonebuckman 0:55d636c5638a 76 * Example: AD5668_ADDR_DAC_A
jonebuckman 0:55d636c5638a 77 * AD5668_ADDR_DAC_B
jonebuckman 0:55d636c5638a 78 * ...
jonebuckman 0:55d636c5638a 79 * AD5668_ADDR_DAC_ALL
jonebuckman 0:55d636c5638a 80 *
jonebuckman 0:55d636c5638a 81 * @return none.
jonebuckman 0:55d636c5638a 82 *******************************************************************************/
jonebuckman 0:55d636c5638a 83 void AD5668::AD5668_PowerMode(unsigned char pwrMode, unsigned char channel)
jonebuckman 0:55d636c5638a 84 {
jonebuckman 0:55d636c5638a 85 unsigned char selectedChannel = 0;
jonebuckman 0:55d636c5638a 86
jonebuckman 0:55d636c5638a 87 if(channel == AD5668_ADDR_DAC_ALL)
jonebuckman 0:55d636c5638a 88 {
jonebuckman 0:55d636c5638a 89 selectedChannel = 0xFF;
jonebuckman 0:55d636c5638a 90 }
jonebuckman 0:55d636c5638a 91 else
jonebuckman 0:55d636c5638a 92 {
jonebuckman 0:55d636c5638a 93 selectedChannel = (1 << channel);
jonebuckman 0:55d636c5638a 94 }
jonebuckman 0:55d636c5638a 95 /* Selects a power mode for the selected channel. */
jonebuckman 0:55d636c5638a 96 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_POWERDOWN) |
jonebuckman 0:55d636c5638a 97 AD5668_POWER_MODE(pwrMode) |
jonebuckman 0:55d636c5638a 98 selectedChannel);
jonebuckman 0:55d636c5638a 99 }
jonebuckman 0:55d636c5638a 100
jonebuckman 0:55d636c5638a 101 /***************************************************************************//**
jonebuckman 0:55d636c5638a 102 * @brief Resets the device.
jonebuckman 0:55d636c5638a 103 *
jonebuckman 0:55d636c5638a 104 * @return none.
jonebuckman 0:55d636c5638a 105 *******************************************************************************/
jonebuckman 0:55d636c5638a 106 void AD5668::AD5668_Reset(void)
jonebuckman 0:55d636c5638a 107 {
jonebuckman 0:55d636c5638a 108 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_RESET));
jonebuckman 0:55d636c5638a 109 }
jonebuckman 0:55d636c5638a 110
jonebuckman 0:55d636c5638a 111 void AD5668::AD5668_WRITE_INPUT_N(uint8_t channel, uint16_t data)
jonebuckman 0:55d636c5638a 112 {
jonebuckman 0:55d636c5638a 113 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_WRITE_INPUT_N) | AD5668_ADDR(channel) | AD5668_DATA_BITS(data));
jonebuckman 0:55d636c5638a 114 }
jonebuckman 0:55d636c5638a 115
jonebuckman 0:55d636c5638a 116 void AD5668::AD5668_UPDATE_DAC_N(uint8_t channel, uint16_t data)
jonebuckman 0:55d636c5638a 117 {
jonebuckman 0:55d636c5638a 118 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_UPDATE_DAC_N) | AD5668_ADDR(channel) | AD5668_DATA_BITS(data));
jonebuckman 0:55d636c5638a 119 }
jonebuckman 0:55d636c5638a 120
jonebuckman 0:55d636c5638a 121 void AD5668::AD5668_WRITE_INPUT_N_UPDATE_ALL(uint8_t channel, uint16_t data)
jonebuckman 0:55d636c5638a 122 {
jonebuckman 0:55d636c5638a 123 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_WRITE_INPUT_N_UPDATE_ALL) | AD5668_ADDR(channel) | AD5668_DATA_BITS(data));
jonebuckman 0:55d636c5638a 124 }
jonebuckman 0:55d636c5638a 125
jonebuckman 0:55d636c5638a 126 void AD5668::AD5668_WRITE_INPUT_N_UPDATE_N(uint8_t channel, uint16_t data)
jonebuckman 0:55d636c5638a 127 {
jonebuckman 0:55d636c5638a 128 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_WRITE_INPUT_N_UPDATE_N) | AD5668_ADDR(channel) | AD5668_DATA_BITS(data));
jonebuckman 0:55d636c5638a 129 }
jonebuckman 0:55d636c5638a 130
jonebuckman 0:55d636c5638a 131 /***************************************************************************//**
jonebuckman 0:55d636c5638a 132 * @brief Writes a 32-bit data-word to the Input Register of the device.
jonebuckman 0:55d636c5638a 133 *
jonebuckman 0:55d636c5638a 134 * @param registerValue - Value of the register.
jonebuckman 0:55d636c5638a 135 *
jonebuckman 0:55d636c5638a 136 * @return none.
jonebuckman 0:55d636c5638a 137 *******************************************************************************/
jonebuckman 0:55d636c5638a 138 void AD5668::AD5668_SetInputRegister(unsigned int registerValue)
jonebuckman 0:55d636c5638a 139 {
jonebuckman 0:55d636c5638a 140 unsigned char registerWord[4] = {0, 0, 0, 0};
jonebuckman 0:55d636c5638a 141 registerWord[0] = (unsigned char)((registerValue & 0xFF000000) >> 24);
jonebuckman 0:55d636c5638a 142 registerWord[1] = (unsigned char)((registerValue & 0x00FF0000) >> 16);
jonebuckman 0:55d636c5638a 143 registerWord[2] = (unsigned char)((registerValue & 0x0000FF00) >> 8);
jonebuckman 0:55d636c5638a 144 registerWord[3] = (unsigned char)((registerValue & 0x000000FF) >> 0);
jonebuckman 0:55d636c5638a 145 SPI_Write(registerWord);
jonebuckman 0:55d636c5638a 146 }
jonebuckman 0:55d636c5638a 147
jonebuckman 0:55d636c5638a 148 void AD5668::SPI_Write(unsigned char *reg)
jonebuckman 0:55d636c5638a 149 {
jonebuckman 0:55d636c5638a 150 nCS_=0;
jonebuckman 0:55d636c5638a 151 for (int i = 0; i < 4; i++) {
jonebuckman 0:55d636c5638a 152 spi_.write(reg[i]);
jonebuckman 0:55d636c5638a 153 }
jonebuckman 0:55d636c5638a 154 nCS_=1;
jonebuckman 0:55d636c5638a 155 }