AD7798 ADC driver
AD7798.cpp@0:fb6fe6fa2835, 2016-11-07 (annotated)
- Committer:
- adisuciu
- Date:
- Mon Nov 07 15:45:27 2016 +0000
- Revision:
- 0:fb6fe6fa2835
Initial revision
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
adisuciu | 0:fb6fe6fa2835 | 1 | /***************************************************************************//** |
adisuciu | 0:fb6fe6fa2835 | 2 | * @file AD7798.c |
adisuciu | 0:fb6fe6fa2835 | 3 | * @brief Implementation of AD7798 Driver. |
adisuciu | 0:fb6fe6fa2835 | 4 | * @author |
adisuciu | 0:fb6fe6fa2835 | 5 | ******************************************************************************** |
adisuciu | 0:fb6fe6fa2835 | 6 | * Copyright 2012(c) Analog Devices, Inc. |
adisuciu | 0:fb6fe6fa2835 | 7 | * |
adisuciu | 0:fb6fe6fa2835 | 8 | * All rights reserved. |
adisuciu | 0:fb6fe6fa2835 | 9 | * |
adisuciu | 0:fb6fe6fa2835 | 10 | * Redistribution and use in source and binary forms, with or without |
adisuciu | 0:fb6fe6fa2835 | 11 | * modification, are permitted provided that the following conditions are met: |
adisuciu | 0:fb6fe6fa2835 | 12 | * - Redistributions of source code must retain the above copyright |
adisuciu | 0:fb6fe6fa2835 | 13 | * notice, this list of conditions and the following disclaimer. |
adisuciu | 0:fb6fe6fa2835 | 14 | * - Redistributions in binary form must reproduce the above copyright |
adisuciu | 0:fb6fe6fa2835 | 15 | * notice, this list of conditions and the following disclaimer in |
adisuciu | 0:fb6fe6fa2835 | 16 | * the documentation and/or other materials provided with the |
adisuciu | 0:fb6fe6fa2835 | 17 | * distribution. |
adisuciu | 0:fb6fe6fa2835 | 18 | * - Neither the name of Analog Devices, Inc. nor the names of its |
adisuciu | 0:fb6fe6fa2835 | 19 | * contributors may be used to endorse or promote products derived |
adisuciu | 0:fb6fe6fa2835 | 20 | * from this software without specific prior written permission. |
adisuciu | 0:fb6fe6fa2835 | 21 | * - The use of this software may or may not infringe the patent rights |
adisuciu | 0:fb6fe6fa2835 | 22 | * of one or more patent holders. This license does not release you |
adisuciu | 0:fb6fe6fa2835 | 23 | * from the requirement that you obtain separate licenses from these |
adisuciu | 0:fb6fe6fa2835 | 24 | * patent holders to use this software. |
adisuciu | 0:fb6fe6fa2835 | 25 | * - Use of the software either in source or binary form, must be run |
adisuciu | 0:fb6fe6fa2835 | 26 | * on or directly connected to an Analog Devices Inc. component. |
adisuciu | 0:fb6fe6fa2835 | 27 | * |
adisuciu | 0:fb6fe6fa2835 | 28 | * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR |
adisuciu | 0:fb6fe6fa2835 | 29 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, |
adisuciu | 0:fb6fe6fa2835 | 30 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
adisuciu | 0:fb6fe6fa2835 | 31 | * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, |
adisuciu | 0:fb6fe6fa2835 | 32 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
adisuciu | 0:fb6fe6fa2835 | 33 | * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR |
adisuciu | 0:fb6fe6fa2835 | 34 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
adisuciu | 0:fb6fe6fa2835 | 35 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
adisuciu | 0:fb6fe6fa2835 | 36 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
adisuciu | 0:fb6fe6fa2835 | 37 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
adisuciu | 0:fb6fe6fa2835 | 38 | * |
adisuciu | 0:fb6fe6fa2835 | 39 | ******************************************************************************** |
adisuciu | 0:fb6fe6fa2835 | 40 | * SVN Revision: 577 |
adisuciu | 0:fb6fe6fa2835 | 41 | *******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 42 | |
adisuciu | 0:fb6fe6fa2835 | 43 | /******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 44 | /* Include Files */ |
adisuciu | 0:fb6fe6fa2835 | 45 | /******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 46 | #include "AD7798.h" // AD7798 definitions. |
adisuciu | 0:fb6fe6fa2835 | 47 | #include <stdio.h> |
adisuciu | 0:fb6fe6fa2835 | 48 | |
adisuciu | 0:fb6fe6fa2835 | 49 | |
adisuciu | 0:fb6fe6fa2835 | 50 | /***************************************************************************//** |
adisuciu | 0:fb6fe6fa2835 | 51 | * @brief Initializes the AD7798 and checks if the device is present. |
adisuciu | 0:fb6fe6fa2835 | 52 | * |
adisuciu | 0:fb6fe6fa2835 | 53 | * @param None. |
adisuciu | 0:fb6fe6fa2835 | 54 | * |
adisuciu | 0:fb6fe6fa2835 | 55 | * @return status - Result of the initialization procedure. |
adisuciu | 0:fb6fe6fa2835 | 56 | * Example: 1 - if initialization was successful (ID is 0x0B). |
adisuciu | 0:fb6fe6fa2835 | 57 | * 0 - if initialization was unsuccessful. |
adisuciu | 0:fb6fe6fa2835 | 58 | *******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 59 | AD7798::AD7798( PinName CS, PinName MOSI, PinName MISO, PinName SCK): |
adisuciu | 0:fb6fe6fa2835 | 60 | /*miso(MISO),*/ ad7798(MOSI, MISO, SCK), cs(CS) |
adisuciu | 0:fb6fe6fa2835 | 61 | { |
adisuciu | 0:fb6fe6fa2835 | 62 | cs = true; // cs is active low |
adisuciu | 0:fb6fe6fa2835 | 63 | ad7798.format(8, _SPI_MODE); |
adisuciu | 0:fb6fe6fa2835 | 64 | } |
adisuciu | 0:fb6fe6fa2835 | 65 | uint8_t AD7798::init(void) |
adisuciu | 0:fb6fe6fa2835 | 66 | { |
adisuciu | 0:fb6fe6fa2835 | 67 | unsigned char status = 0x1; |
adisuciu | 0:fb6fe6fa2835 | 68 | |
adisuciu | 0:fb6fe6fa2835 | 69 | if ((get_register_value (AD7798_REG_ID, 1) & 0x0F) != AD7798_ID) { |
adisuciu | 0:fb6fe6fa2835 | 70 | status = 0x0; |
adisuciu | 0:fb6fe6fa2835 | 71 | } |
adisuciu | 0:fb6fe6fa2835 | 72 | |
adisuciu | 0:fb6fe6fa2835 | 73 | return(status); |
adisuciu | 0:fb6fe6fa2835 | 74 | } |
adisuciu | 0:fb6fe6fa2835 | 75 | |
adisuciu | 0:fb6fe6fa2835 | 76 | /***************************************************************************//** |
adisuciu | 0:fb6fe6fa2835 | 77 | * @brief Sends 32 consecutive 1's on SPI in order to reset the part. |
adisuciu | 0:fb6fe6fa2835 | 78 | * |
adisuciu | 0:fb6fe6fa2835 | 79 | * @param None. |
adisuciu | 0:fb6fe6fa2835 | 80 | * |
adisuciu | 0:fb6fe6fa2835 | 81 | * @return None. |
adisuciu | 0:fb6fe6fa2835 | 82 | *******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 83 | void AD7798::frequency(int hz) |
adisuciu | 0:fb6fe6fa2835 | 84 | { |
adisuciu | 0:fb6fe6fa2835 | 85 | ad7798.frequency(hz); |
adisuciu | 0:fb6fe6fa2835 | 86 | } |
adisuciu | 0:fb6fe6fa2835 | 87 | void AD7798::reset(void) |
adisuciu | 0:fb6fe6fa2835 | 88 | { |
adisuciu | 0:fb6fe6fa2835 | 89 | unsigned char dataToSend[4] = {0xFF, 0xFF, 0xFF, 0xFF}; |
adisuciu | 0:fb6fe6fa2835 | 90 | |
adisuciu | 0:fb6fe6fa2835 | 91 | spi_write(dataToSend, 4); |
adisuciu | 0:fb6fe6fa2835 | 92 | |
adisuciu | 0:fb6fe6fa2835 | 93 | wait_ms(500); |
adisuciu | 0:fb6fe6fa2835 | 94 | |
adisuciu | 0:fb6fe6fa2835 | 95 | } |
adisuciu | 0:fb6fe6fa2835 | 96 | /***************************************************************************//** |
adisuciu | 0:fb6fe6fa2835 | 97 | * @brief Reads the value of the selected register |
adisuciu | 0:fb6fe6fa2835 | 98 | * |
adisuciu | 0:fb6fe6fa2835 | 99 | * @param regAddress - The address of the register to read. |
adisuciu | 0:fb6fe6fa2835 | 100 | * @param size - The size of the register to read. |
adisuciu | 0:fb6fe6fa2835 | 101 | * |
adisuciu | 0:fb6fe6fa2835 | 102 | * @return data - The value of the selected register register. |
adisuciu | 0:fb6fe6fa2835 | 103 | *******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 104 | uint16_t AD7798::get_register_value(uint8_t regAddress, uint8_t size, bool toggle_cs) |
adisuciu | 0:fb6fe6fa2835 | 105 | { |
adisuciu | 0:fb6fe6fa2835 | 106 | unsigned char data[size]; |
adisuciu | 0:fb6fe6fa2835 | 107 | uint16_t receivedData = 0x00; |
adisuciu | 0:fb6fe6fa2835 | 108 | unsigned char byte; |
adisuciu | 0:fb6fe6fa2835 | 109 | |
adisuciu | 0:fb6fe6fa2835 | 110 | data[0] = AD7798_COMM_READ | AD7798_COMM_ADDR(regAddress); |
adisuciu | 0:fb6fe6fa2835 | 111 | |
adisuciu | 0:fb6fe6fa2835 | 112 | spi_read(data, size, toggle_cs); |
adisuciu | 0:fb6fe6fa2835 | 113 | |
adisuciu | 0:fb6fe6fa2835 | 114 | receivedData = data[0]; |
adisuciu | 0:fb6fe6fa2835 | 115 | |
adisuciu | 0:fb6fe6fa2835 | 116 | if(size > 1) { |
adisuciu | 0:fb6fe6fa2835 | 117 | |
adisuciu | 0:fb6fe6fa2835 | 118 | for(byte = 1; byte < size; byte++) { |
adisuciu | 0:fb6fe6fa2835 | 119 | receivedData = (receivedData << (byte * 8) | data[byte]); |
adisuciu | 0:fb6fe6fa2835 | 120 | } |
adisuciu | 0:fb6fe6fa2835 | 121 | } |
adisuciu | 0:fb6fe6fa2835 | 122 | return receivedData; |
adisuciu | 0:fb6fe6fa2835 | 123 | } |
adisuciu | 0:fb6fe6fa2835 | 124 | /***************************************************************************//** |
adisuciu | 0:fb6fe6fa2835 | 125 | * @brief Writes the value to the register |
adisuciu | 0:fb6fe6fa2835 | 126 | * |
adisuciu | 0:fb6fe6fa2835 | 127 | * @param - regAddress - The address of the register to write to. |
adisuciu | 0:fb6fe6fa2835 | 128 | * @param - regValue - The value to write to the register. |
adisuciu | 0:fb6fe6fa2835 | 129 | * @param - size - The size of the register to write. |
adisuciu | 0:fb6fe6fa2835 | 130 | * |
adisuciu | 0:fb6fe6fa2835 | 131 | * @return None. |
adisuciu | 0:fb6fe6fa2835 | 132 | *******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 133 | void AD7798::set_register_value(uint8_t regAddress, uint16_t regValue, |
adisuciu | 0:fb6fe6fa2835 | 134 | uint8_t size, bool toggle_cs) |
adisuciu | 0:fb6fe6fa2835 | 135 | { |
adisuciu | 0:fb6fe6fa2835 | 136 | uint8_t data[size + 1]; |
adisuciu | 0:fb6fe6fa2835 | 137 | uint8_t byte; |
adisuciu | 0:fb6fe6fa2835 | 138 | uint16_t mask; |
adisuciu | 0:fb6fe6fa2835 | 139 | |
adisuciu | 0:fb6fe6fa2835 | 140 | data[0] = AD7798_COMM_WRITE | AD7798_COMM_ADDR(regAddress); |
adisuciu | 0:fb6fe6fa2835 | 141 | |
adisuciu | 0:fb6fe6fa2835 | 142 | if(size == 1) { |
adisuciu | 0:fb6fe6fa2835 | 143 | |
adisuciu | 0:fb6fe6fa2835 | 144 | mask = 0x00FF; |
adisuciu | 0:fb6fe6fa2835 | 145 | |
adisuciu | 0:fb6fe6fa2835 | 146 | } else { |
adisuciu | 0:fb6fe6fa2835 | 147 | |
adisuciu | 0:fb6fe6fa2835 | 148 | mask = 0xFF00; |
adisuciu | 0:fb6fe6fa2835 | 149 | } |
adisuciu | 0:fb6fe6fa2835 | 150 | |
adisuciu | 0:fb6fe6fa2835 | 151 | for(byte = 1; byte <= size; byte++) { |
adisuciu | 0:fb6fe6fa2835 | 152 | data[byte] = (uint8_t)((regValue & mask) >> ((size - byte) * 8)); |
adisuciu | 0:fb6fe6fa2835 | 153 | mask = mask >> (byte * 8); |
adisuciu | 0:fb6fe6fa2835 | 154 | } |
adisuciu | 0:fb6fe6fa2835 | 155 | |
adisuciu | 0:fb6fe6fa2835 | 156 | spi_write(data, (1 + size), toggle_cs); |
adisuciu | 0:fb6fe6fa2835 | 157 | |
adisuciu | 0:fb6fe6fa2835 | 158 | |
adisuciu | 0:fb6fe6fa2835 | 159 | } |
adisuciu | 0:fb6fe6fa2835 | 160 | /***************************************************************************//** |
adisuciu | 0:fb6fe6fa2835 | 161 | * @brief Reads /RDY bit of status reg. |
adisuciu | 0:fb6fe6fa2835 | 162 | * |
adisuciu | 0:fb6fe6fa2835 | 163 | * @param None. |
adisuciu | 0:fb6fe6fa2835 | 164 | * |
adisuciu | 0:fb6fe6fa2835 | 165 | * @return rdy - 0 if RDY is 1. |
adisuciu | 0:fb6fe6fa2835 | 166 | * - 1 if RDY is 0. |
adisuciu | 0:fb6fe6fa2835 | 167 | *******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 168 | uint8_t AD7798::ready(void) |
adisuciu | 0:fb6fe6fa2835 | 169 | { |
adisuciu | 0:fb6fe6fa2835 | 170 | |
adisuciu | 0:fb6fe6fa2835 | 171 | while((get_register_value( AD7798_REG_STAT, 1) & 0x80) != 0x80); |
adisuciu | 0:fb6fe6fa2835 | 172 | |
adisuciu | 0:fb6fe6fa2835 | 173 | return(1); |
adisuciu | 0:fb6fe6fa2835 | 174 | } |
adisuciu | 0:fb6fe6fa2835 | 175 | |
adisuciu | 0:fb6fe6fa2835 | 176 | /***************************************************************************//** |
adisuciu | 0:fb6fe6fa2835 | 177 | * @brief Sets the operating mode of AD7798. |
adisuciu | 0:fb6fe6fa2835 | 178 | * |
adisuciu | 0:fb6fe6fa2835 | 179 | * @param mode - Mode of operation. |
adisuciu | 0:fb6fe6fa2835 | 180 | * |
adisuciu | 0:fb6fe6fa2835 | 181 | * @return None. |
adisuciu | 0:fb6fe6fa2835 | 182 | *******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 183 | void AD7798::set_mode(uint8_t mode) |
adisuciu | 0:fb6fe6fa2835 | 184 | { |
adisuciu | 0:fb6fe6fa2835 | 185 | unsigned long command; |
adisuciu | 0:fb6fe6fa2835 | 186 | command = get_register_value(AD7798_REG_MODE, 2); |
adisuciu | 0:fb6fe6fa2835 | 187 | command &= ~AD7798_MODE_SEL(0xFF); |
adisuciu | 0:fb6fe6fa2835 | 188 | command |= AD7798_MODE_SEL(mode); |
adisuciu | 0:fb6fe6fa2835 | 189 | set_register_value( |
adisuciu | 0:fb6fe6fa2835 | 190 | AD7798_REG_MODE, |
adisuciu | 0:fb6fe6fa2835 | 191 | command, |
adisuciu | 0:fb6fe6fa2835 | 192 | 2 |
adisuciu | 0:fb6fe6fa2835 | 193 | ); |
adisuciu | 0:fb6fe6fa2835 | 194 | } |
adisuciu | 0:fb6fe6fa2835 | 195 | /***************************************************************************//** |
adisuciu | 0:fb6fe6fa2835 | 196 | * @brief Selects the channel of AD7798. |
adisuciu | 0:fb6fe6fa2835 | 197 | * |
adisuciu | 0:fb6fe6fa2835 | 198 | * @param channel - ADC channel selection. |
adisuciu | 0:fb6fe6fa2835 | 199 | * |
adisuciu | 0:fb6fe6fa2835 | 200 | * @return None. |
adisuciu | 0:fb6fe6fa2835 | 201 | *******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 202 | void AD7798::set_channel(uint8_t channel) |
adisuciu | 0:fb6fe6fa2835 | 203 | { |
adisuciu | 0:fb6fe6fa2835 | 204 | unsigned long command; |
adisuciu | 0:fb6fe6fa2835 | 205 | command = get_register_value(AD7798_REG_CONF, 2); |
adisuciu | 0:fb6fe6fa2835 | 206 | command &= ~AD7798_CONF_CHAN(0xFF); |
adisuciu | 0:fb6fe6fa2835 | 207 | command |= AD7798_CONF_CHAN(channel); |
adisuciu | 0:fb6fe6fa2835 | 208 | set_register_value( |
adisuciu | 0:fb6fe6fa2835 | 209 | AD7798_REG_CONF, |
adisuciu | 0:fb6fe6fa2835 | 210 | command, |
adisuciu | 0:fb6fe6fa2835 | 211 | 2 |
adisuciu | 0:fb6fe6fa2835 | 212 | ); |
adisuciu | 0:fb6fe6fa2835 | 213 | } |
adisuciu | 0:fb6fe6fa2835 | 214 | |
adisuciu | 0:fb6fe6fa2835 | 215 | /***************************************************************************//** |
adisuciu | 0:fb6fe6fa2835 | 216 | * @brief Sets the gain of the In-Amp. |
adisuciu | 0:fb6fe6fa2835 | 217 | * |
adisuciu | 0:fb6fe6fa2835 | 218 | * @param gain - Gain. |
adisuciu | 0:fb6fe6fa2835 | 219 | * |
adisuciu | 0:fb6fe6fa2835 | 220 | * @return None. |
adisuciu | 0:fb6fe6fa2835 | 221 | *******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 222 | void AD7798::set_gain(uint16_t gain) |
adisuciu | 0:fb6fe6fa2835 | 223 | { |
adisuciu | 0:fb6fe6fa2835 | 224 | uint16_t command; |
adisuciu | 0:fb6fe6fa2835 | 225 | command = get_register_value(AD7798_REG_CONF, 2); |
adisuciu | 0:fb6fe6fa2835 | 226 | command &= ~AD7798_CONF_GAIN(0xFF); |
adisuciu | 0:fb6fe6fa2835 | 227 | command |= AD7798_CONF_GAIN(gain); |
adisuciu | 0:fb6fe6fa2835 | 228 | set_register_value( |
adisuciu | 0:fb6fe6fa2835 | 229 | AD7798_REG_CONF, |
adisuciu | 0:fb6fe6fa2835 | 230 | command, |
adisuciu | 0:fb6fe6fa2835 | 231 | 2 |
adisuciu | 0:fb6fe6fa2835 | 232 | ); |
adisuciu | 0:fb6fe6fa2835 | 233 | } |
adisuciu | 0:fb6fe6fa2835 | 234 | |
adisuciu | 0:fb6fe6fa2835 | 235 | void AD7798::set_filter(uint8_t filter) |
adisuciu | 0:fb6fe6fa2835 | 236 | { |
adisuciu | 0:fb6fe6fa2835 | 237 | unsigned long command; |
adisuciu | 0:fb6fe6fa2835 | 238 | command = get_register_value(AD7798_REG_MODE, 2); |
adisuciu | 0:fb6fe6fa2835 | 239 | command &= ~AD7798_MODE_RATE(0x0F); |
adisuciu | 0:fb6fe6fa2835 | 240 | command |= AD7798_MODE_RATE(filter); |
adisuciu | 0:fb6fe6fa2835 | 241 | set_register_value( |
adisuciu | 0:fb6fe6fa2835 | 242 | AD7798_REG_MODE, |
adisuciu | 0:fb6fe6fa2835 | 243 | command, |
adisuciu | 0:fb6fe6fa2835 | 244 | 2 |
adisuciu | 0:fb6fe6fa2835 | 245 | ); |
adisuciu | 0:fb6fe6fa2835 | 246 | } |
adisuciu | 0:fb6fe6fa2835 | 247 | /***************************************************************************//** |
adisuciu | 0:fb6fe6fa2835 | 248 | * @brief Enables or disables the reference detect function. |
adisuciu | 0:fb6fe6fa2835 | 249 | * |
adisuciu | 0:fb6fe6fa2835 | 250 | * @param state - State of the reference detect function. |
adisuciu | 0:fb6fe6fa2835 | 251 | * Example: 0 - Reference detect disabled. |
adisuciu | 0:fb6fe6fa2835 | 252 | * 1 - Reference detect enabled. |
adisuciu | 0:fb6fe6fa2835 | 253 | * |
adisuciu | 0:fb6fe6fa2835 | 254 | * @return None. |
adisuciu | 0:fb6fe6fa2835 | 255 | *******************************************************************************/ |
adisuciu | 0:fb6fe6fa2835 | 256 | void AD7798::set_reference(uint8_t state) |
adisuciu | 0:fb6fe6fa2835 | 257 | { |
adisuciu | 0:fb6fe6fa2835 | 258 | unsigned long command = 0; |
adisuciu | 0:fb6fe6fa2835 | 259 | command = get_register_value(AD7798_REG_CONF, 2); |
adisuciu | 0:fb6fe6fa2835 | 260 | command &= ~AD7798_CONF_REFDET(1); |
adisuciu | 0:fb6fe6fa2835 | 261 | command |= AD7798_CONF_REFDET(state); |
adisuciu | 0:fb6fe6fa2835 | 262 | set_register_value(AD7798_REG_CONF, |
adisuciu | 0:fb6fe6fa2835 | 263 | command, |
adisuciu | 0:fb6fe6fa2835 | 264 | 2); |
adisuciu | 0:fb6fe6fa2835 | 265 | } |
adisuciu | 0:fb6fe6fa2835 | 266 | |
adisuciu | 0:fb6fe6fa2835 | 267 | void AD7798::set_coding_mode(uint8_t mode) |
adisuciu | 0:fb6fe6fa2835 | 268 | { |
adisuciu | 0:fb6fe6fa2835 | 269 | uint16_t command; |
adisuciu | 0:fb6fe6fa2835 | 270 | |
adisuciu | 0:fb6fe6fa2835 | 271 | command = get_register_value(AD7798_REG_CONF, 2); |
adisuciu | 0:fb6fe6fa2835 | 272 | |
adisuciu | 0:fb6fe6fa2835 | 273 | if(mode == AD7798_BIPOLAR) { |
adisuciu | 0:fb6fe6fa2835 | 274 | |
adisuciu | 0:fb6fe6fa2835 | 275 | command &= ~AD7798_CONF_UNIPOLAR; |
adisuciu | 0:fb6fe6fa2835 | 276 | |
adisuciu | 0:fb6fe6fa2835 | 277 | } else if(mode == AD7798_UNIPOLAR) { |
adisuciu | 0:fb6fe6fa2835 | 278 | |
adisuciu | 0:fb6fe6fa2835 | 279 | command |= AD7798_CONF_UNIPOLAR; |
adisuciu | 0:fb6fe6fa2835 | 280 | } |
adisuciu | 0:fb6fe6fa2835 | 281 | set_register_value( |
adisuciu | 0:fb6fe6fa2835 | 282 | AD7798_REG_CONF, |
adisuciu | 0:fb6fe6fa2835 | 283 | command, |
adisuciu | 0:fb6fe6fa2835 | 284 | 2 |
adisuciu | 0:fb6fe6fa2835 | 285 | ); |
adisuciu | 0:fb6fe6fa2835 | 286 | } |
adisuciu | 0:fb6fe6fa2835 | 287 | |
adisuciu | 0:fb6fe6fa2835 | 288 | void AD7798::set_burnout_current(uint8_t select) |
adisuciu | 0:fb6fe6fa2835 | 289 | { |
adisuciu | 0:fb6fe6fa2835 | 290 | uint16_t command; |
adisuciu | 0:fb6fe6fa2835 | 291 | |
adisuciu | 0:fb6fe6fa2835 | 292 | command = get_register_value(AD7798_REG_CONF, 2); |
adisuciu | 0:fb6fe6fa2835 | 293 | |
adisuciu | 0:fb6fe6fa2835 | 294 | if(select == AD7798_DISABLE) |
adisuciu | 0:fb6fe6fa2835 | 295 | command &= ~AD7798_CONF_BO_EN; |
adisuciu | 0:fb6fe6fa2835 | 296 | else if(select == AD7798_ENABLE) |
adisuciu | 0:fb6fe6fa2835 | 297 | command |= AD7798_CONF_BO_EN; |
adisuciu | 0:fb6fe6fa2835 | 298 | |
adisuciu | 0:fb6fe6fa2835 | 299 | set_register_value( |
adisuciu | 0:fb6fe6fa2835 | 300 | AD7798_REG_CONF, |
adisuciu | 0:fb6fe6fa2835 | 301 | command, |
adisuciu | 0:fb6fe6fa2835 | 302 | 2 |
adisuciu | 0:fb6fe6fa2835 | 303 | ); |
adisuciu | 0:fb6fe6fa2835 | 304 | } |
adisuciu | 0:fb6fe6fa2835 | 305 | |
adisuciu | 0:fb6fe6fa2835 | 306 | uint8_t AD7798::spi_read(uint8_t *data, uint8_t bytes_number, bool toggle_cs) |
adisuciu | 0:fb6fe6fa2835 | 307 | { |
adisuciu | 0:fb6fe6fa2835 | 308 | cs = false & toggle_cs; |
adisuciu | 0:fb6fe6fa2835 | 309 | data[0] = ad7798.write(data[0]); |
adisuciu | 0:fb6fe6fa2835 | 310 | for(uint8_t byte = 1; byte <= bytes_number; byte++) { |
adisuciu | 0:fb6fe6fa2835 | 311 | data[byte - 1] = ad7798.write(data[byte]); |
adisuciu | 0:fb6fe6fa2835 | 312 | } |
adisuciu | 0:fb6fe6fa2835 | 313 | cs = true & toggle_cs; |
adisuciu | 0:fb6fe6fa2835 | 314 | return bytes_number; |
adisuciu | 0:fb6fe6fa2835 | 315 | } |
adisuciu | 0:fb6fe6fa2835 | 316 | uint8_t AD7798::spi_write(uint8_t *data, uint8_t bytes_number, bool toggle_cs) |
adisuciu | 0:fb6fe6fa2835 | 317 | { |
adisuciu | 0:fb6fe6fa2835 | 318 | cs = false & toggle_cs; |
adisuciu | 0:fb6fe6fa2835 | 319 | for(uint8_t byte = 0; byte < bytes_number; byte++) { |
adisuciu | 0:fb6fe6fa2835 | 320 | ad7798.write(data[byte]); |
adisuciu | 0:fb6fe6fa2835 | 321 | } |
adisuciu | 0:fb6fe6fa2835 | 322 | cs = true & toggle_cs; |
adisuciu | 0:fb6fe6fa2835 | 323 | return bytes_number; |
adisuciu | 0:fb6fe6fa2835 | 324 | } |
adisuciu | 0:fb6fe6fa2835 | 325 | |
adisuciu | 0:fb6fe6fa2835 | 326 | void AD7798::read_data(uint8_t adcChannel, uint16_t *adcData) |
adisuciu | 0:fb6fe6fa2835 | 327 | { |
adisuciu | 0:fb6fe6fa2835 | 328 | |
adisuciu | 0:fb6fe6fa2835 | 329 | uint8_t channel; |
adisuciu | 0:fb6fe6fa2835 | 330 | |
adisuciu | 0:fb6fe6fa2835 | 331 | channel = 0x80 | adcChannel; |
adisuciu | 0:fb6fe6fa2835 | 332 | |
adisuciu | 0:fb6fe6fa2835 | 333 | cs = 0; |
adisuciu | 0:fb6fe6fa2835 | 334 | |
adisuciu | 0:fb6fe6fa2835 | 335 | set_register_value(AD7798_REG_MODE, 0x200A, 2);//, false); |
adisuciu | 0:fb6fe6fa2835 | 336 | uint16_t regVal = 0; |
adisuciu | 0:fb6fe6fa2835 | 337 | while( (regVal & channel) != channel) { |
adisuciu | 0:fb6fe6fa2835 | 338 | regVal = get_register_value( AD7798_REG_STAT, 1);//, false); |
adisuciu | 0:fb6fe6fa2835 | 339 | } |
adisuciu | 0:fb6fe6fa2835 | 340 | |
adisuciu | 0:fb6fe6fa2835 | 341 | //timer_sleep(200); |
adisuciu | 0:fb6fe6fa2835 | 342 | wait_ms(200); // ??? |
adisuciu | 0:fb6fe6fa2835 | 343 | |
adisuciu | 0:fb6fe6fa2835 | 344 | *adcData = get_register_value(AD7798_REG_DATA, 2);//, false); |
adisuciu | 0:fb6fe6fa2835 | 345 | |
adisuciu | 0:fb6fe6fa2835 | 346 | cs = 1; |
adisuciu | 0:fb6fe6fa2835 | 347 | |
adisuciu | 0:fb6fe6fa2835 | 348 | |
adisuciu | 0:fb6fe6fa2835 | 349 | |
adisuciu | 0:fb6fe6fa2835 | 350 | } |