AD5668 Digital to Analog Converter
ad5668.cpp@0:55d636c5638a, 2017-04-05 (annotated)
- 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?
User | Revision | Line number | New 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 | } |