AD7172 library

Committer:
mmdonatti
Date:
Thu Apr 30 21:06:54 2020 +0000
Revision:
0:e258a1597fe1
Child:
1:6d78a35bedd0
AD7172 library first commit, based on analog devices AD717X library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mmdonatti 0:e258a1597fe1 1 //////////////////////////////////////////////////////////////////////////////////
mmdonatti 0:e258a1597fe1 2 // @file AD717X.c
mmdonatti 0:e258a1597fe1 3 // @brief AD717X implementation file.
mmdonatti 0:e258a1597fe1 4 // @devices AD7172-2, AD7172-4, AD7173-8, AD7175-2, AD7175-8, AD7176-2,
mmdonatti 0:e258a1597fe1 5 // AD7177-2
mmdonatti 0:e258a1597fe1 6 // @author
mmdonatti 0:e258a1597fe1 7 //
mmdonatti 0:e258a1597fe1 8 // Mauricio Donatti - mauricio.donatti@lnls.br
mmdonatti 0:e258a1597fe1 9 // Lucas Tanio - lucas.tanio@lnls.br
mmdonatti 0:e258a1597fe1 10 //
mmdonatti 0:e258a1597fe1 11 // LNLS - Brazilian Synchrotron Light Source
mmdonatti 0:e258a1597fe1 12 // GIE - Electronics Instrumentation Group
mmdonatti 0:e258a1597fe1 13 //
mmdonatti 0:e258a1597fe1 14 // 2020, April
mmdonatti 0:e258a1597fe1 15 //
mmdonatti 0:e258a1597fe1 16 // Future Implementation:
mmdonatti 0:e258a1597fe1 17 // -CRC and Checksum Support
mmdonatti 0:e258a1597fe1 18 //
mmdonatti 0:e258a1597fe1 19 //////////////////////////////////////////////////////////////////////////////////
mmdonatti 0:e258a1597fe1 20
mmdonatti 0:e258a1597fe1 21 /*********************************************************************************
mmdonatti 0:e258a1597fe1 22 * Based on Analog Devices AD717X library, focused on performance improvements
mmdonatti 0:e258a1597fe1 23 *
mmdonatti 0:e258a1597fe1 24 * Special thanks to original authors:
mmdonatti 0:e258a1597fe1 25 * acozma (andrei.cozma@analog.com)
mmdonatti 0:e258a1597fe1 26 * dnechita (dan.nechita@analog.com)
mmdonatti 0:e258a1597fe1 27 *
mmdonatti 0:e258a1597fe1 28 * Copyright 2015(c) Analog Devices, Inc.
mmdonatti 0:e258a1597fe1 29 *
mmdonatti 0:e258a1597fe1 30 * All rights reserved.
mmdonatti 0:e258a1597fe1 31 *
mmdonatti 0:e258a1597fe1 32 * Redistribution and use in source and binary forms, with or without modification,
mmdonatti 0:e258a1597fe1 33 * are permitted provided that the following conditions are met:
mmdonatti 0:e258a1597fe1 34 * - Redistributions of source code must retain the above copyright
mmdonatti 0:e258a1597fe1 35 * notice, this list of conditions and the following disclaimer.
mmdonatti 0:e258a1597fe1 36 * - Redistributions in binary form must reproduce the above copyright
mmdonatti 0:e258a1597fe1 37 * notice, this list of conditions and the following disclaimer in
mmdonatti 0:e258a1597fe1 38 * the documentation and/or other materials provided with the
mmdonatti 0:e258a1597fe1 39 * distribution.
mmdonatti 0:e258a1597fe1 40 * - Neither the name of Analog Devices, Inc. nor the names of its
mmdonatti 0:e258a1597fe1 41 * contributors may be used to endorse or promote products derived
mmdonatti 0:e258a1597fe1 42 * from this software without specific prior written permission.
mmdonatti 0:e258a1597fe1 43 * - The use of this software may or may not infringe the patent rights
mmdonatti 0:e258a1597fe1 44 * of one or more patent holders. This license does not release you
mmdonatti 0:e258a1597fe1 45 * from the requirement that you obtain separate licenses from these
mmdonatti 0:e258a1597fe1 46 * patent holders to use this software.
mmdonatti 0:e258a1597fe1 47 * - Use of the software either in source or binary form, must be run
mmdonatti 0:e258a1597fe1 48 * on or directly connected to an Analog Devices Inc. component.
mmdonatti 0:e258a1597fe1 49 *
mmdonatti 0:e258a1597fe1 50 * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED
mmdonatti 0:e258a1597fe1 51 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY
mmdonatti 0:e258a1597fe1 52 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
mmdonatti 0:e258a1597fe1 53 * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
mmdonatti 0:e258a1597fe1 54 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
mmdonatti 0:e258a1597fe1 55 * INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
mmdonatti 0:e258a1597fe1 56 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
mmdonatti 0:e258a1597fe1 57 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
mmdonatti 0:e258a1597fe1 58 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
mmdonatti 0:e258a1597fe1 59 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mmdonatti 0:e258a1597fe1 60 ******************************************************************************/
mmdonatti 0:e258a1597fe1 61
mmdonatti 0:e258a1597fe1 62 #include "ad7172.h"
mmdonatti 0:e258a1597fe1 63
mmdonatti 0:e258a1597fe1 64 #define DEBUG
mmdonatti 0:e258a1597fe1 65
mmdonatti 0:e258a1597fe1 66 /******************************************************************************
mmdonatti 0:e258a1597fe1 67 * @AD7172 class constructor.
mmdonatti 0:e258a1597fe1 68 *
mmdonatti 0:e258a1597fe1 69 * @param spi - The handler of the instance of the driver.
mmdonatti 0:e258a1597fe1 70 * @param slave_select - The Slave Chip Select Id to be passed to the SPI calls.
mmdonatti 0:e258a1597fe1 71 *
mmdonatti 0:e258a1597fe1 72 *******************************************************************************/
mmdonatti 0:e258a1597fe1 73 AD7172::AD7172(SPI& p_spi,PinName slave_select,DigitalIn& p_rdy,PinName sync_pin)
mmdonatti 0:e258a1597fe1 74 : _spi(p_spi), _rdy(p_rdy)
mmdonatti 0:e258a1597fe1 75 {
mmdonatti 0:e258a1597fe1 76
mmdonatti 0:e258a1597fe1 77 _spi.format(8,3); //8 bits ; POL=1 ; PHASE=1
mmdonatti 0:e258a1597fe1 78 _spi.frequency(10000000);
mmdonatti 0:e258a1597fe1 79
mmdonatti 0:e258a1597fe1 80 cs = new DigitalOut(slave_select);
mmdonatti 0:e258a1597fe1 81 sync = new DigitalOut(sync_pin);
mmdonatti 0:e258a1597fe1 82 *sync = 1;
mmdonatti 0:e258a1597fe1 83 *cs=1;
mmdonatti 0:e258a1597fe1 84
mmdonatti 0:e258a1597fe1 85 Reset();
mmdonatti 0:e258a1597fe1 86 }
mmdonatti 0:e258a1597fe1 87
mmdonatti 0:e258a1597fe1 88 /******************************************************************************
mmdonatti 0:e258a1597fe1 89 * @AD717X Enable Device - CS goes low.
mmdonatti 0:e258a1597fe1 90 *
mmdonatti 0:e258a1597fe1 91 *******************************************************************************/
mmdonatti 0:e258a1597fe1 92 void AD7172::enable(){
mmdonatti 0:e258a1597fe1 93 *cs=0;
mmdonatti 0:e258a1597fe1 94 }
mmdonatti 0:e258a1597fe1 95
mmdonatti 0:e258a1597fe1 96 /******************************************************************************
mmdonatti 0:e258a1597fe1 97 * @AD717X Disable Device - CS goes high.
mmdonatti 0:e258a1597fe1 98 *
mmdonatti 0:e258a1597fe1 99 *******************************************************************************/
mmdonatti 0:e258a1597fe1 100 void AD7172::disable(){
mmdonatti 0:e258a1597fe1 101 *cs=1;
mmdonatti 0:e258a1597fe1 102 }
mmdonatti 0:e258a1597fe1 103
mmdonatti 0:e258a1597fe1 104
mmdonatti 0:e258a1597fe1 105 /******************************************************************************
mmdonatti 0:e258a1597fe1 106 * @AD717X Configure Continuous Convertion Mode
mmdonatti 0:e258a1597fe1 107 *
mmdonatti 0:e258a1597fe1 108 *******************************************************************************/
mmdonatti 0:e258a1597fe1 109 void AD7172::config_continuous()
mmdonatti 0:e258a1597fe1 110 {
mmdonatti 0:e258a1597fe1 111 data.data = (0b1<<7)|AD7172_IFMODE_REG_DATA_STAT; //CONTREAD = 1;
mmdonatti 0:e258a1597fe1 112 AD7172_PRINTF("CONTCONV");
mmdonatti 0:e258a1597fe1 113 AD7172_PRINTF("Register: IFMODE\tWrite: 0x%04X",ad7172.data.data);
mmdonatti 0:e258a1597fe1 114 WriteRegister(AD7172_IFMODE_REG,2);
mmdonatti 0:e258a1597fe1 115 enable();
mmdonatti 0:e258a1597fe1 116 }
mmdonatti 0:e258a1597fe1 117
mmdonatti 0:e258a1597fe1 118 /******************************************************************************
mmdonatti 0:e258a1597fe1 119 * @AD717X Configure Single Convertion Mode
mmdonatti 0:e258a1597fe1 120 *
mmdonatti 0:e258a1597fe1 121 *******************************************************************************/
mmdonatti 0:e258a1597fe1 122 void AD7172::config_single()
mmdonatti 0:e258a1597fe1 123 {
mmdonatti 0:e258a1597fe1 124 data.data = AD7172_IFMODE_REG_DATA_STAT; //CONTREAD = 0;
mmdonatti 0:e258a1597fe1 125 AD7172_PRINTF("SINGCONV");
mmdonatti 0:e258a1597fe1 126 AD7172_PRINTF("Register: IFMODE\tWrite: 0x%04X",ad7172.data.data);
mmdonatti 0:e258a1597fe1 127 WriteRegister(AD7172_IFMODE_REG,2);
mmdonatti 0:e258a1597fe1 128 //AGUARDAR SYNC
mmdonatti 0:e258a1597fe1 129 //CONFIGURAR GPIO REGISTER
mmdonatti 0:e258a1597fe1 130 enable();
mmdonatti 0:e258a1597fe1 131 }
mmdonatti 0:e258a1597fe1 132
mmdonatti 0:e258a1597fe1 133 /******************************************************************************
mmdonatti 0:e258a1597fe1 134 * @AD717X Configure Single Convertion Mode
mmdonatti 0:e258a1597fe1 135 *
mmdonatti 0:e258a1597fe1 136 *******************************************************************************/
mmdonatti 0:e258a1597fe1 137 void AD7172::start_single_conv()
mmdonatti 0:e258a1597fe1 138 {
mmdonatti 0:e258a1597fe1 139 *sync = 0;
mmdonatti 0:e258a1597fe1 140 }
mmdonatti 0:e258a1597fe1 141
mmdonatti 0:e258a1597fe1 142 /******************************************************************************
mmdonatti 0:e258a1597fe1 143 * @AD717X Read Device ID - Communication Test.
mmdonatti 0:e258a1597fe1 144 *
mmdonatti 0:e258a1597fe1 145 *******************************************************************************/
mmdonatti 0:e258a1597fe1 146 void AD7172::ReadID()
mmdonatti 0:e258a1597fe1 147 {
mmdonatti 0:e258a1597fe1 148 *cs=0;
mmdonatti 0:e258a1597fe1 149 _spi.write(0x40|AD7172_ID_REG);
mmdonatti 0:e258a1597fe1 150 id.bytes[1] = _spi.write(0x00);
mmdonatti 0:e258a1597fe1 151 id.bytes[0] = _spi.write(0x00);
mmdonatti 0:e258a1597fe1 152 *cs=1;
mmdonatti 0:e258a1597fe1 153 }
mmdonatti 0:e258a1597fe1 154
mmdonatti 0:e258a1597fe1 155 /******************************************************************************
mmdonatti 0:e258a1597fe1 156 * @AD717X Read Device Status.
mmdonatti 0:e258a1597fe1 157 *
mmdonatti 0:e258a1597fe1 158 *******************************************************************************/
mmdonatti 0:e258a1597fe1 159 void AD7172::ReadStatus()
mmdonatti 0:e258a1597fe1 160 {
mmdonatti 0:e258a1597fe1 161 *cs=0;
mmdonatti 0:e258a1597fe1 162 _spi.write(0x40|AD7172_STATUS_REG);
mmdonatti 0:e258a1597fe1 163 status = _spi.write(0x00);
mmdonatti 0:e258a1597fe1 164 sw_ready = (status>>7)^1;
mmdonatti 0:e258a1597fe1 165 *cs=1;
mmdonatti 0:e258a1597fe1 166 }
mmdonatti 0:e258a1597fe1 167
mmdonatti 0:e258a1597fe1 168 /***************************************************************************//**
mmdonatti 0:e258a1597fe1 169 * @brief Reads the value of the specified register.
mmdonatti 0:e258a1597fe1 170 *
mmdonatti 0:e258a1597fe1 171 * @reg - The address of the register to be read. The value will be stored
mmdonatti 0:e258a1597fe1 172 * inside the register structure that holds info about this register.
mmdonatti 0:e258a1597fe1 173 *
mmdonatti 0:e258a1597fe1 174 * @bytes - The number of bytes to be readed
mmdonatti 0:e258a1597fe1 175 *******************************************************************************/
mmdonatti 0:e258a1597fe1 176 void AD7172::ReadRegister(uint8_t reg,uint8_t bytes)
mmdonatti 0:e258a1597fe1 177 {
mmdonatti 0:e258a1597fe1 178 *cs=0;
mmdonatti 0:e258a1597fe1 179 _spi.write(0x40|reg);
mmdonatti 0:e258a1597fe1 180 data.data=0;
mmdonatti 0:e258a1597fe1 181 for(i=bytes-1;i>=0;i--)
mmdonatti 0:e258a1597fe1 182 data.bytes[i] = _spi.write(0x00);
mmdonatti 0:e258a1597fe1 183 *cs=1;
mmdonatti 0:e258a1597fe1 184 }
mmdonatti 0:e258a1597fe1 185
mmdonatti 0:e258a1597fe1 186 /***************************************************************************//**
mmdonatti 0:e258a1597fe1 187 * @brief Reads the value of the specified register.
mmdonatti 0:e258a1597fe1 188 *
mmdonatti 0:e258a1597fe1 189 * @reg - The address of the register to be read. The value will be stored
mmdonatti 0:e258a1597fe1 190 * inside the register structure that holds info about this register.
mmdonatti 0:e258a1597fe1 191 *
mmdonatti 0:e258a1597fe1 192 * @bytes - The number of bytes to be stored (data saved on data variable)
mmdonatti 0:e258a1597fe1 193 *******************************************************************************/
mmdonatti 0:e258a1597fe1 194 void AD7172::WriteRegister(uint8_t reg,uint8_t bytes)
mmdonatti 0:e258a1597fe1 195 {
mmdonatti 0:e258a1597fe1 196 *cs=0;
mmdonatti 0:e258a1597fe1 197 _spi.write(reg);
mmdonatti 0:e258a1597fe1 198 for(i=bytes-1;i>=0;i--)
mmdonatti 0:e258a1597fe1 199 _spi.write(data.bytes[i]);
mmdonatti 0:e258a1597fe1 200 *cs=1;
mmdonatti 0:e258a1597fe1 201 }
mmdonatti 0:e258a1597fe1 202
mmdonatti 0:e258a1597fe1 203 /***************************************************************************//**
mmdonatti 0:e258a1597fe1 204 * @brief Resets the device.
mmdonatti 0:e258a1597fe1 205 *
mmdonatti 0:e258a1597fe1 206 *******************************************************************************/
mmdonatti 0:e258a1597fe1 207 void AD7172::Reset()
mmdonatti 0:e258a1597fe1 208 {
mmdonatti 0:e258a1597fe1 209 *cs=0;
mmdonatti 0:e258a1597fe1 210 for(i=0;i<=7;i++)
mmdonatti 0:e258a1597fe1 211 _spi.write(0xFF);
mmdonatti 0:e258a1597fe1 212 *cs=1;
mmdonatti 0:e258a1597fe1 213
mmdonatti 0:e258a1597fe1 214 }
mmdonatti 0:e258a1597fe1 215
mmdonatti 0:e258a1597fe1 216 /***************************************************************************//**
mmdonatti 0:e258a1597fe1 217 * @brief Waits until a new conversion result is available.
mmdonatti 0:e258a1597fe1 218 *
mmdonatti 0:e258a1597fe1 219 * @param device - The handler of the instance of the driver.
mmdonatti 0:e258a1597fe1 220 *
mmdonatti 0:e258a1597fe1 221 *******************************************************************************/
mmdonatti 0:e258a1597fe1 222 void AD7172::WaitForReady(uint32_t timeout)
mmdonatti 0:e258a1597fe1 223 {
mmdonatti 0:e258a1597fe1 224 while(sw_ready==0 && --timeout)
mmdonatti 0:e258a1597fe1 225 {
mmdonatti 0:e258a1597fe1 226 //Read the value of the Status Register, updating ready variable
mmdonatti 0:e258a1597fe1 227 ReadStatus();
mmdonatti 0:e258a1597fe1 228 }
mmdonatti 0:e258a1597fe1 229 }
mmdonatti 0:e258a1597fe1 230
mmdonatti 0:e258a1597fe1 231 /***************************************************************************//**
mmdonatti 0:e258a1597fe1 232 * @brief Reads the conversion result from the device using data register.
mmdonatti 0:e258a1597fe1 233 *
mmdonatti 0:e258a1597fe1 234 *******************************************************************************/
mmdonatti 0:e258a1597fe1 235 void AD7172::ReadDataRegister()
mmdonatti 0:e258a1597fe1 236 {
mmdonatti 0:e258a1597fe1 237 _spi.write(0x40|AD7172_DATA_REG);
mmdonatti 0:e258a1597fe1 238 data.data=0;
mmdonatti 0:e258a1597fe1 239 for(i=3;i>0;i--)
mmdonatti 0:e258a1597fe1 240 data.bytes[i] = _spi.write(0x00);
mmdonatti 0:e258a1597fe1 241 *sync = 1;
mmdonatti 0:e258a1597fe1 242 }
mmdonatti 0:e258a1597fe1 243
mmdonatti 0:e258a1597fe1 244 /***************************************************************************//**
mmdonatti 0:e258a1597fe1 245 * @brief Reads the conversion result from the device using data register.
mmdonatti 0:e258a1597fe1 246 *
mmdonatti 0:e258a1597fe1 247 *******************************************************************************/
mmdonatti 0:e258a1597fe1 248 void AD7172::ReadDataRegisterStatus()
mmdonatti 0:e258a1597fe1 249 {
mmdonatti 0:e258a1597fe1 250 _spi.write(0x40|AD7172_DATA_REG);
mmdonatti 0:e258a1597fe1 251 data.data=0;
mmdonatti 0:e258a1597fe1 252 for(i=3;i>0;i--)
mmdonatti 0:e258a1597fe1 253 data.bytes[i] = _spi.write(0x00);
mmdonatti 0:e258a1597fe1 254 status = _spi.write(0x00);
mmdonatti 0:e258a1597fe1 255 channel = status&0b11;
mmdonatti 0:e258a1597fe1 256 *sync = 1;
mmdonatti 0:e258a1597fe1 257 }
mmdonatti 0:e258a1597fe1 258
mmdonatti 0:e258a1597fe1 259 /***************************************************************************//**
mmdonatti 0:e258a1597fe1 260 * @brief Reads the conversion result from the device for continuous read mode
mmdonatti 0:e258a1597fe1 261 *
mmdonatti 0:e258a1597fe1 262 *******************************************************************************/
mmdonatti 0:e258a1597fe1 263 void AD7172::ReadDataContinuous()
mmdonatti 0:e258a1597fe1 264 {
mmdonatti 0:e258a1597fe1 265 data.data=0;
mmdonatti 0:e258a1597fe1 266 for(i=3;i>0;i--)
mmdonatti 0:e258a1597fe1 267 data.bytes[i] = _spi.write(0x00);
mmdonatti 0:e258a1597fe1 268 }
mmdonatti 0:e258a1597fe1 269
mmdonatti 0:e258a1597fe1 270 /***************************************************************************//**
mmdonatti 0:e258a1597fe1 271 * @brief Reads the conversion result from the device for continuous read mode if DATA_STAT bit set in IFMODE register
mmdonatti 0:e258a1597fe1 272 *
mmdonatti 0:e258a1597fe1 273 *******************************************************************************/
mmdonatti 0:e258a1597fe1 274 void AD7172::ReadDataContinuousStatus()
mmdonatti 0:e258a1597fe1 275 {
mmdonatti 0:e258a1597fe1 276 data.data=0;
mmdonatti 0:e258a1597fe1 277 for(i=3;i>0;i--)
mmdonatti 0:e258a1597fe1 278 data.bytes[i] = _spi.write(0x00);
mmdonatti 0:e258a1597fe1 279 status = _spi.write(0x00);
mmdonatti 0:e258a1597fe1 280 channel = status&0b11;
mmdonatti 0:e258a1597fe1 281 }