AD5668 Digital to Analog Converter

Committer:
jonebuckman
Date:
Thu Apr 06 13:34:43 2017 +0000
Revision:
2:25d6955d0d38
Parent:
1:b54ba779d19a
Update doxy.

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 void AD5668::AD5668_PowerMode(unsigned char pwrMode, unsigned char channel)
jonebuckman 0:55d636c5638a 67 {
jonebuckman 0:55d636c5638a 68 unsigned char selectedChannel = 0;
jonebuckman 0:55d636c5638a 69
jonebuckman 0:55d636c5638a 70 if(channel == AD5668_ADDR_DAC_ALL)
jonebuckman 0:55d636c5638a 71 {
jonebuckman 0:55d636c5638a 72 selectedChannel = 0xFF;
jonebuckman 0:55d636c5638a 73 }
jonebuckman 0:55d636c5638a 74 else
jonebuckman 0:55d636c5638a 75 {
jonebuckman 0:55d636c5638a 76 selectedChannel = (1 << channel);
jonebuckman 0:55d636c5638a 77 }
jonebuckman 0:55d636c5638a 78 /* Selects a power mode for the selected channel. */
jonebuckman 0:55d636c5638a 79 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_POWERDOWN) |
jonebuckman 0:55d636c5638a 80 AD5668_POWER_MODE(pwrMode) |
jonebuckman 0:55d636c5638a 81 selectedChannel);
jonebuckman 0:55d636c5638a 82 }
jonebuckman 0:55d636c5638a 83
jonebuckman 0:55d636c5638a 84 void AD5668::AD5668_Reset(void)
jonebuckman 0:55d636c5638a 85 {
jonebuckman 0:55d636c5638a 86 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_RESET));
jonebuckman 0:55d636c5638a 87 }
jonebuckman 0:55d636c5638a 88
jonebuckman 2:25d6955d0d38 89 void AD5668::AD5668_WriteInput(uint8_t channel, uint16_t data)
jonebuckman 0:55d636c5638a 90 {
jonebuckman 0:55d636c5638a 91 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_WRITE_INPUT_N) | AD5668_ADDR(channel) | AD5668_DATA_BITS(data));
jonebuckman 0:55d636c5638a 92 }
jonebuckman 0:55d636c5638a 93
jonebuckman 2:25d6955d0d38 94 void AD5668::AD5668_UpdateDAC(uint8_t channel, uint16_t data)
jonebuckman 0:55d636c5638a 95 {
jonebuckman 0:55d636c5638a 96 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_UPDATE_DAC_N) | AD5668_ADDR(channel) | AD5668_DATA_BITS(data));
jonebuckman 0:55d636c5638a 97 }
jonebuckman 0:55d636c5638a 98
jonebuckman 2:25d6955d0d38 99 void AD5668::AD5668_WriteInputUpdateAll(uint8_t channel, uint16_t data)
jonebuckman 0:55d636c5638a 100 {
jonebuckman 0:55d636c5638a 101 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_WRITE_INPUT_N_UPDATE_ALL) | AD5668_ADDR(channel) | AD5668_DATA_BITS(data));
jonebuckman 0:55d636c5638a 102 }
jonebuckman 0:55d636c5638a 103
jonebuckman 2:25d6955d0d38 104 void AD5668::AD5668_WriteInputUpdate(uint8_t channel, uint16_t data)
jonebuckman 0:55d636c5638a 105 {
jonebuckman 0:55d636c5638a 106 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_WRITE_INPUT_N_UPDATE_N) | AD5668_ADDR(channel) | AD5668_DATA_BITS(data));
jonebuckman 0:55d636c5638a 107 }
jonebuckman 1:b54ba779d19a 108
jonebuckman 1:b54ba779d19a 109 void AD5668::AD5668_InternalReference(uint8_t val)
jonebuckman 1:b54ba779d19a 110 {
jonebuckman 1:b54ba779d19a 111 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_SET_INT_REF) | val);
jonebuckman 1:b54ba779d19a 112 }
jonebuckman 1:b54ba779d19a 113
jonebuckman 1:b54ba779d19a 114 void AD5668::AD5668_ClearCode(uint8_t val)
jonebuckman 1:b54ba779d19a 115 {
jonebuckman 1:b54ba779d19a 116 AD5668_SetInputRegister(AD5668_CMD(AD5668_CMD_LOAD_CLEAR_CODE) | val);
jonebuckman 1:b54ba779d19a 117 }
jonebuckman 1:b54ba779d19a 118
jonebuckman 0:55d636c5638a 119 void AD5668::AD5668_SetInputRegister(unsigned int registerValue)
jonebuckman 0:55d636c5638a 120 {
jonebuckman 0:55d636c5638a 121 unsigned char registerWord[4] = {0, 0, 0, 0};
jonebuckman 0:55d636c5638a 122 registerWord[0] = (unsigned char)((registerValue & 0xFF000000) >> 24);
jonebuckman 0:55d636c5638a 123 registerWord[1] = (unsigned char)((registerValue & 0x00FF0000) >> 16);
jonebuckman 0:55d636c5638a 124 registerWord[2] = (unsigned char)((registerValue & 0x0000FF00) >> 8);
jonebuckman 0:55d636c5638a 125 registerWord[3] = (unsigned char)((registerValue & 0x000000FF) >> 0);
jonebuckman 0:55d636c5638a 126 SPI_Write(registerWord);
jonebuckman 0:55d636c5638a 127 }
jonebuckman 0:55d636c5638a 128
jonebuckman 0:55d636c5638a 129 void AD5668::SPI_Write(unsigned char *reg)
jonebuckman 0:55d636c5638a 130 {
jonebuckman 0:55d636c5638a 131 nCS_=0;
jonebuckman 0:55d636c5638a 132 for (int i = 0; i < 4; i++) {
jonebuckman 0:55d636c5638a 133 spi_.write(reg[i]);
jonebuckman 0:55d636c5638a 134 }
jonebuckman 0:55d636c5638a 135 nCS_=1;
jonebuckman 0:55d636c5638a 136 }