A collection of Analog Devices drivers for the mbed platform

For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all

Committer:
Adrian Suciu
Date:
Mon Nov 07 16:27:12 2016 +0200
Revision:
33:c3ec596a29c2
Added CN0391, CN0396 and CN0397 shields

Who changed what in which revision?

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