AD5668 Digital to Analog Converter
Diff: ad5668.h
- Revision:
- 0:55d636c5638a
- Child:
- 1:b54ba779d19a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ad5668.h Wed Apr 05 22:15:15 2017 +0000 @@ -0,0 +1,210 @@ +/** + * @file AD5668.h + * + * @author Jon Buckman + * + * @section LICENSE + * + * Copyright (c) 2017 Jon Buckman + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * @section DESCRIPTION + * + * AD5668 Digital to Analog Converter from Analog Devices. + * + * Datasheet: + * + * http://www.analog.com/media/en/technical-documentation/data-sheets/AD5668.pdf + * + * Example: + * @code + * #include "mbed.h" + * #include "AD5668.h" + * + * Serial pc(USBTX, USBRX); // tx, rx + * + * AD5668 dac(D11, D12, D13, D10); // mosi, miso, sck, cs + * + * int main() { + * while (1) { + * for (int i = 0; i < 65536; i+=10) { + * dac.AD5668_WRITE_INPUT_N_UPDATE_N(AD5668_ADDR_DAC_A, i); + * pc.printf("%d,", i); + * wait(.01); + * } + * } + * } + * @endcode + */ + +#ifndef __AD5668_H__ +#define __AD5668_H__ + +/** + * Includes + */ +#include "mbed.h" + +/** + * Defines + */ +/* AD5668 Input Register */ +#define AD5668_CMD(x) ((0x0000000F & (unsigned int)(x)) << 24) +#define AD5668_ADDR(x) ((0x0000000F & (unsigned int)(x)) << 20) +#define AD5628_DATA_BITS(x) ((0x000FFFFF & (unsigned int)(x)) << 8) +#define AD5648_DATA_BITS(x) ((0x000FFFFF & (unsigned int)(x)) << 6) +#define AD5668_DATA_BITS(x) ((0x000FFFFF & (unsigned int)(x)) << 4) + +/* Command Definitions (AD5668_COMMAND(x) options) */ +#define AD5668_CMD_WRITE_INPUT_N 0 // Write to Input Register n. +#define AD5668_CMD_UPDATE_DAC_N 1 // Update DAC Register n. +#define AD5668_CMD_WRITE_INPUT_N_UPDATE_ALL 2 // Write to Input Register n, update all. +#define AD5668_CMD_WRITE_INPUT_N_UPDATE_N 3 // Write to and update DAC Channel n. +#define AD5668_CMD_POWERDOWN 4 // Power down/power up DAC. +#define AD5668_CMD_LOAD_CLEAR_CODE 5 // Load clear code register. +#define AD5668_CMD_LOAD_LDAC_REG 6 // Load LDAC register. +#define AD5668_CMD_RESET 7 // Reset (power-on reset) +#define AD5668_CMD_SET_INT_REF 8 // Set up internal REF register. + +/* Address Commands (AD5668_ADDRESS(x) options) */ +#define AD5668_ADDR_DAC_A 0x00 //DAC A +#define AD5668_ADDR_DAC_B 0x01 //DAC B +#define AD5668_ADDR_DAC_C 0x02 //DAC C +#define AD5668_ADDR_DAC_D 0x03 //DAC D +#define AD5668_ADDR_DAC_E 0x04 //DAC E +#define AD5668_ADDR_DAC_F 0x05 //DAC F +#define AD5668_ADDR_DAC_G 0x06 //DAC G +#define AD5668_ADDR_DAC_H 0x07 //DAC H +#define AD5668_ADDR_DAC_ALL 0x0F //All DACs + +/* Internal Reference Register */ +#define AD5668_INT_REF_OFF 0 +#define AD5668_INT_REF_ON 1 + +/* Power-Down Modes of Operation */ +#define AD5668_POWER_MODE(x) ((0x03 & (unsigned short) (x)) << 8) + +#define AD5668_PWRDN_NONE 0 // Normal operation +#define AD5668_PWRDN_1K 1 // 1 KOhm to GND (Power-down mode) +#define AD5668_PWRDN_100K 2 // 100 KOhm to GND (Power-down mode) +#define AD5668_PWRDN_3STATE 3 // Three-state (Power-down mode) + +/* Clear Code Function */ +#define AD5668_CODE_0X0000 0 +#define AD5668_CODE_0X8000 1 +#define AD5668_CODE_0XFFFF 2 +#define AD5668_CODE_NOP 3 + +/* SPI */ +#define AD5668_SPI_MAX_DATA_RATE 50000000 + +/** + * AD5668 Digital to Analog Converter from Analog Devices. + */ +class AD5668 { + +public: + + /** + * Constructor. + * + * @param mosi mbed pin to use for MOSI line of SPI interface. + * @param miso mbed pin to use for MISO line of SPI interface. + * @param sck mbed pin to use for SCK line of SPI interface. + * @param csn mbed pin to use for not chip select line of SPI interface. + */ + AD5668(PinName mosi, PinName miso, PinName sck, PinName csn); + + /** + * Set power mode for each channnel. + * + * @param pwrMode - power mode of the device. + * Example: AD5668_PWRDN_NONE, + * AD5668_PWRDN_1K, + * AD5668_PWRDN_100K, + * AD5668_PWRDN_3STATE + * + * @param channel - The channel or channels that are being configured. + * Example: AD5668_ADDR_DAC_A, + * AD5668_ADDR_DAC_B, + * ... + * AD5668_ADDR_DAC_ALL + */ + void AD5668_PowerMode(unsigned char pwrMode, unsigned char channel); + + /** + * Reset the device. + * + * @param none. + */ + void AD5668_Reset(void); + + /** + * Write a data word to a channel. + * + * @param channel - The channel or channels that are being configured. + * @param data - The DAC data word. + */ + void AD5668_WRITE_INPUT_N(uint8_t channel, uint16_t data); + + /** + * Latch a data word to a channel. + * + * @param channel - The channel or channels that are being configured. + * @param data - The DAC data word. + */ + void AD5668_UPDATE_DAC_N(uint8_t channel, uint16_t data); + + /** + * Write a data word to a channel and latch all channels. + * + * @param channel - The channel or channels that are being configured. + * @param data - The DAC data word. + */ + void AD5668_WRITE_INPUT_N_UPDATE_ALL(uint8_t channel, uint16_t data); + + /** + * Write a data word to a channel and latch the same channel. + * + * @param channel - The channel or channels that are being configured. + * @param data - The DAC data word. + */ + void AD5668_WRITE_INPUT_N_UPDATE_N(uint8_t channel, uint16_t data); + +private: + + /** + * Writes a 32-bit data-word to the Input Register of the device. + * + * @param registerValue - Value of the register. + */ + void AD5668_SetInputRegister(unsigned int registerValue); + + /** + * Write array values to the SPI. + * + * @param pointer to the array + */ + void SPI_Write(unsigned char *reg); + + SPI spi_; + DigitalOut nCS_; + +}; + +#endif /* __AD5668_H__ */ \ No newline at end of file