ADISense1000 Version 2.1 code base

Fork of AdiSense1000_V21 by Sean Wilson

Committer:
danodonovan
Date:
Mon Jan 22 17:40:50 2018 +0000
Revision:
24:5a2272a25ff1
Child:
25:c5bff546082f
Updating example to adisense1000 v1.0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
danodonovan 24:5a2272a25ff1 1 /*!
danodonovan 24:5a2272a25ff1 2 ******************************************************************************
danodonovan 24:5a2272a25ff1 3 * @file: adi_sense_1000.c
danodonovan 24:5a2272a25ff1 4 * @brief: ADI Sense API implementation for ADI Sense 1000
danodonovan 24:5a2272a25ff1 5 *-----------------------------------------------------------------------------
danodonovan 24:5a2272a25ff1 6 */
danodonovan 24:5a2272a25ff1 7
danodonovan 24:5a2272a25ff1 8 /******************************************************************************
danodonovan 24:5a2272a25ff1 9 Copyright 2017 (c) Analog Devices, Inc.
danodonovan 24:5a2272a25ff1 10
danodonovan 24:5a2272a25ff1 11 All rights reserved.
danodonovan 24:5a2272a25ff1 12
danodonovan 24:5a2272a25ff1 13 Redistribution and use in source and binary forms, with or without
danodonovan 24:5a2272a25ff1 14 modification, are permitted provided that the following conditions are met:
danodonovan 24:5a2272a25ff1 15 - Redistributions of source code must retain the above copyright
danodonovan 24:5a2272a25ff1 16 notice, this list of conditions and the following disclaimer.
danodonovan 24:5a2272a25ff1 17 - Redistributions in binary form must reproduce the above copyright
danodonovan 24:5a2272a25ff1 18 notice, this list of conditions and the following disclaimer in
danodonovan 24:5a2272a25ff1 19 the documentation and/or other materials provided with the
danodonovan 24:5a2272a25ff1 20 distribution.
danodonovan 24:5a2272a25ff1 21 - Neither the name of Analog Devices, Inc. nor the names of its
danodonovan 24:5a2272a25ff1 22 contributors may be used to endorse or promote products derived
danodonovan 24:5a2272a25ff1 23 from this software without specific prior written permission.
danodonovan 24:5a2272a25ff1 24 - The use of this software may or may not infringe the patent rights
danodonovan 24:5a2272a25ff1 25 of one or more patent holders. This license does not release you
danodonovan 24:5a2272a25ff1 26 from the requirement that you obtain separate licenses from these
danodonovan 24:5a2272a25ff1 27 patent holders to use this software.
danodonovan 24:5a2272a25ff1 28 - Use of the software either in source or binary form, must be run
danodonovan 24:5a2272a25ff1 29 on or directly connected to an Analog Devices Inc. component.
danodonovan 24:5a2272a25ff1 30
danodonovan 24:5a2272a25ff1 31 THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
danodonovan 24:5a2272a25ff1 32 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
danodonovan 24:5a2272a25ff1 33 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
danodonovan 24:5a2272a25ff1 34 IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
danodonovan 24:5a2272a25ff1 35 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
danodonovan 24:5a2272a25ff1 36 LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
danodonovan 24:5a2272a25ff1 37 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
danodonovan 24:5a2272a25ff1 38 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
danodonovan 24:5a2272a25ff1 39 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
danodonovan 24:5a2272a25ff1 40 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
danodonovan 24:5a2272a25ff1 41 *
danodonovan 24:5a2272a25ff1 42 *****************************************************************************/
danodonovan 24:5a2272a25ff1 43 #include <float.h>
danodonovan 24:5a2272a25ff1 44 #include <math.h>
danodonovan 24:5a2272a25ff1 45 #include <string.h>
danodonovan 24:5a2272a25ff1 46
danodonovan 24:5a2272a25ff1 47 #include "inc/adi_sense_platform.h"
danodonovan 24:5a2272a25ff1 48 #include "inc/adi_sense_api.h"
danodonovan 24:5a2272a25ff1 49 #include "inc/adi_sense_1000/adi_sense_1000_api.h"
danodonovan 24:5a2272a25ff1 50
danodonovan 24:5a2272a25ff1 51 #include "adi_sense_1000/ADISENSE1000_REGISTERS_typedefs.h"
danodonovan 24:5a2272a25ff1 52 #include "adi_sense_1000/ADISENSE1000_REGISTERS.h"
danodonovan 24:5a2272a25ff1 53 #include "adi_sense_1000/adi_sense_1000_lut_data.h"
danodonovan 24:5a2272a25ff1 54 #include "adi_sense_1000/adi_sense_1000_calibration.h"
danodonovan 24:5a2272a25ff1 55
danodonovan 24:5a2272a25ff1 56 #include "crc16.h"
danodonovan 24:5a2272a25ff1 57
danodonovan 24:5a2272a25ff1 58 /*
danodonovan 24:5a2272a25ff1 59 * The host is expected to transfer a 16-bit command, followed by data bytes, in 2
danodonovan 24:5a2272a25ff1 60 * separate transfers delineated by the CS signal and a short delay in between.
danodonovan 24:5a2272a25ff1 61 *
danodonovan 24:5a2272a25ff1 62 * The 16-bit command contains a right-justified 11-bit register address (offset),
danodonovan 24:5a2272a25ff1 63 * and the remaining upper 5 bits are reserved as command bits assigned as follows:
danodonovan 24:5a2272a25ff1 64 * [15:11] 10000b = write command, 01000b = read command, anything else is invalid
danodonovan 24:5a2272a25ff1 65 * [10:0] register address (0-2047)
danodonovan 24:5a2272a25ff1 66 */
danodonovan 24:5a2272a25ff1 67
danodonovan 24:5a2272a25ff1 68 /* Register address space is limited to 2048 bytes (11 bit address) */
danodonovan 24:5a2272a25ff1 69 #define REG_COMMAND_MASK 0xF800
danodonovan 24:5a2272a25ff1 70 #define REG_ADDRESS_MASK 0x07FF
danodonovan 24:5a2272a25ff1 71
danodonovan 24:5a2272a25ff1 72 /*
danodonovan 24:5a2272a25ff1 73 * The following commands are currently supported, anything else is treated
danodonovan 24:5a2272a25ff1 74 * as an error
danodonovan 24:5a2272a25ff1 75 */
danodonovan 24:5a2272a25ff1 76 #define REG_WRITE_COMMAND 0x8000
danodonovan 24:5a2272a25ff1 77 #define REG_READ_COMMAND 0x4000
danodonovan 24:5a2272a25ff1 78
danodonovan 24:5a2272a25ff1 79 /*
danodonovan 24:5a2272a25ff1 80 * The following bytes are sent back to the host when a command is recieved,
danodonovan 24:5a2272a25ff1 81 * to be used by the host to verify that we were ready to receive the command.
danodonovan 24:5a2272a25ff1 82 */
danodonovan 24:5a2272a25ff1 83 #define REG_COMMAND_RESP_0 0xF0
danodonovan 24:5a2272a25ff1 84 #define REG_COMMAND_RESP_1 0xE1
danodonovan 24:5a2272a25ff1 85
danodonovan 24:5a2272a25ff1 86 /*
danodonovan 24:5a2272a25ff1 87 * The following minimum delay must be inserted after each SPI transfer to allow
danodonovan 24:5a2272a25ff1 88 * time for it to be processed by the device
danodonovan 24:5a2272a25ff1 89 */
danodonovan 24:5a2272a25ff1 90 #define POST_SPI_TRANSFER_DELAY_USEC (20)
danodonovan 24:5a2272a25ff1 91
danodonovan 24:5a2272a25ff1 92 /*
danodonovan 24:5a2272a25ff1 93 * The following macros are used to encapsulate the register access code
danodonovan 24:5a2272a25ff1 94 * to improve readability in the functions further below in this file
danodonovan 24:5a2272a25ff1 95 */
danodonovan 24:5a2272a25ff1 96 #define STRINGIFY(name) #name
danodonovan 24:5a2272a25ff1 97
danodonovan 24:5a2272a25ff1 98 /* Expand the full name of the reset value macro for the specified register */
danodonovan 24:5a2272a25ff1 99 #define REG_RESET_VAL(_name) REG_ADISENSE_##_name##_RESET
danodonovan 24:5a2272a25ff1 100
danodonovan 24:5a2272a25ff1 101 /* Checks if a value is outside the bounds of the specified register field */
danodonovan 24:5a2272a25ff1 102 #define CHECK_REG_FIELD_VAL(_field, _val) \
danodonovan 24:5a2272a25ff1 103 do { \
danodonovan 24:5a2272a25ff1 104 uint32_t _mask = BITM_ADISENSE_##_field; \
danodonovan 24:5a2272a25ff1 105 uint32_t _shift = BITP_ADISENSE_##_field; \
danodonovan 24:5a2272a25ff1 106 if ((((_val) << _shift) & ~(_mask)) != 0) { \
danodonovan 24:5a2272a25ff1 107 ADI_SENSE_LOG_ERROR("Value 0x%08X invalid for register field %s", \
danodonovan 24:5a2272a25ff1 108 (uint32_t)(_val), \
danodonovan 24:5a2272a25ff1 109 STRINGIFY(ADISENSE_##_field)); \
danodonovan 24:5a2272a25ff1 110 return ADI_SENSE_INVALID_PARAM; \
danodonovan 24:5a2272a25ff1 111 } \
danodonovan 24:5a2272a25ff1 112 } while(false)
danodonovan 24:5a2272a25ff1 113
danodonovan 24:5a2272a25ff1 114 /*
danodonovan 24:5a2272a25ff1 115 * Encapsulates the write to a specified register
danodonovan 24:5a2272a25ff1 116 * NOTE - this will cause the calling function to return on error
danodonovan 24:5a2272a25ff1 117 */
danodonovan 24:5a2272a25ff1 118 #define WRITE_REG(_hdev, _val, _name, _type) \
danodonovan 24:5a2272a25ff1 119 do { \
danodonovan 24:5a2272a25ff1 120 ADI_SENSE_RESULT _res; \
danodonovan 24:5a2272a25ff1 121 _type _regval = _val; \
danodonovan 24:5a2272a25ff1 122 _res = adi_sense_1000_WriteRegister((_hdev), \
danodonovan 24:5a2272a25ff1 123 REG_ADISENSE_##_name, \
danodonovan 24:5a2272a25ff1 124 &_regval, sizeof(_regval)); \
danodonovan 24:5a2272a25ff1 125 if (_res != ADI_SENSE_SUCCESS) \
danodonovan 24:5a2272a25ff1 126 return _res; \
danodonovan 24:5a2272a25ff1 127 } while(false)
danodonovan 24:5a2272a25ff1 128
danodonovan 24:5a2272a25ff1 129 /* Wrapper macro to write a value to a uint32_t register */
danodonovan 24:5a2272a25ff1 130 #define WRITE_REG_U32(_hdev, _val, _name) \
danodonovan 24:5a2272a25ff1 131 WRITE_REG(_hdev, _val, _name, uint32_t)
danodonovan 24:5a2272a25ff1 132 /* Wrapper macro to write a value to a uint16_t register */
danodonovan 24:5a2272a25ff1 133 #define WRITE_REG_U16(_hdev, _val, _name) \
danodonovan 24:5a2272a25ff1 134 WRITE_REG(_hdev, _val, _name, uint16_t)
danodonovan 24:5a2272a25ff1 135 /* Wrapper macro to write a value to a uint8_t register */
danodonovan 24:5a2272a25ff1 136 #define WRITE_REG_U8(_hdev, _val, _name) \
danodonovan 24:5a2272a25ff1 137 WRITE_REG(_hdev, _val, _name, uint8_t)
danodonovan 24:5a2272a25ff1 138 /* Wrapper macro to write a value to a float32_t register */
danodonovan 24:5a2272a25ff1 139 #define WRITE_REG_FLOAT(_hdev, _val, _name) \
danodonovan 24:5a2272a25ff1 140 WRITE_REG(_hdev, _val, _name, float32_t)
danodonovan 24:5a2272a25ff1 141
danodonovan 24:5a2272a25ff1 142 /*
danodonovan 24:5a2272a25ff1 143 * Encapsulates the read from a specified register
danodonovan 24:5a2272a25ff1 144 * NOTE - this will cause the calling function to return on error
danodonovan 24:5a2272a25ff1 145 */
danodonovan 24:5a2272a25ff1 146 #define READ_REG(_hdev, _val, _name, _type) \
danodonovan 24:5a2272a25ff1 147 do { \
danodonovan 24:5a2272a25ff1 148 ADI_SENSE_RESULT _res; \
danodonovan 24:5a2272a25ff1 149 _type _regval; \
danodonovan 24:5a2272a25ff1 150 _res = adi_sense_1000_ReadRegister((_hdev), \
danodonovan 24:5a2272a25ff1 151 REG_ADISENSE_##_name, \
danodonovan 24:5a2272a25ff1 152 &_regval, sizeof(_regval)); \
danodonovan 24:5a2272a25ff1 153 if (_res != ADI_SENSE_SUCCESS) \
danodonovan 24:5a2272a25ff1 154 return _res; \
danodonovan 24:5a2272a25ff1 155 _val = _regval; \
danodonovan 24:5a2272a25ff1 156 } while(false)
danodonovan 24:5a2272a25ff1 157
danodonovan 24:5a2272a25ff1 158 /* Wrapper macro to read a value from a uint32_t register */
danodonovan 24:5a2272a25ff1 159 #define READ_REG_U32(_hdev, _val, _name) \
danodonovan 24:5a2272a25ff1 160 READ_REG(_hdev, _val, _name, uint32_t)
danodonovan 24:5a2272a25ff1 161 /* Wrapper macro to read a value from a uint16_t register */
danodonovan 24:5a2272a25ff1 162 #define READ_REG_U16(_hdev, _val, _name) \
danodonovan 24:5a2272a25ff1 163 READ_REG(_hdev, _val, _name, uint16_t)
danodonovan 24:5a2272a25ff1 164 /* Wrapper macro to read a value from a uint8_t register */
danodonovan 24:5a2272a25ff1 165 #define READ_REG_U8(_hdev, _val, _name) \
danodonovan 24:5a2272a25ff1 166 READ_REG(_hdev, _val, _name, uint8_t)
danodonovan 24:5a2272a25ff1 167 /* Wrapper macro to read a value from a float32_t register */
danodonovan 24:5a2272a25ff1 168 #define READ_REG_FLOAT(_hdev, _val, _name) \
danodonovan 24:5a2272a25ff1 169 READ_REG(_hdev, _val, _name, float32_t)
danodonovan 24:5a2272a25ff1 170
danodonovan 24:5a2272a25ff1 171 /*
danodonovan 24:5a2272a25ff1 172 * Wrapper macro to write an array of values to a uint8_t register
danodonovan 24:5a2272a25ff1 173 * NOTE - this is intended only for writing to a keyhole data register
danodonovan 24:5a2272a25ff1 174 */
danodonovan 24:5a2272a25ff1 175 #define WRITE_REG_U8_ARRAY(_hdev, _arr, _len, _name) \
danodonovan 24:5a2272a25ff1 176 do { \
danodonovan 24:5a2272a25ff1 177 ADI_SENSE_RESULT _res; \
danodonovan 24:5a2272a25ff1 178 _res = adi_sense_1000_WriteRegister(_hdev, \
danodonovan 24:5a2272a25ff1 179 REG_ADISENSE_##_name, \
danodonovan 24:5a2272a25ff1 180 _arr, _len); \
danodonovan 24:5a2272a25ff1 181 if (_res != ADI_SENSE_SUCCESS) \
danodonovan 24:5a2272a25ff1 182 return _res; \
danodonovan 24:5a2272a25ff1 183 } while(false)
danodonovan 24:5a2272a25ff1 184
danodonovan 24:5a2272a25ff1 185 /*
danodonovan 24:5a2272a25ff1 186 * Wrapper macro to read an array of values from a uint8_t register
danodonovan 24:5a2272a25ff1 187 * NOTE - this is intended only for reading from a keyhole data register
danodonovan 24:5a2272a25ff1 188 */
danodonovan 24:5a2272a25ff1 189 #define READ_REG_U8_ARRAY(_hdev, _arr, _len, _name) \
danodonovan 24:5a2272a25ff1 190 do { \
danodonovan 24:5a2272a25ff1 191 ADI_SENSE_RESULT _res; \
danodonovan 24:5a2272a25ff1 192 _res = adi_sense_1000_ReadRegister((_hdev), \
danodonovan 24:5a2272a25ff1 193 REG_ADISENSE_##_name, \
danodonovan 24:5a2272a25ff1 194 _arr, _len); \
danodonovan 24:5a2272a25ff1 195 if (_res != ADI_SENSE_SUCCESS) \
danodonovan 24:5a2272a25ff1 196 return _res; \
danodonovan 24:5a2272a25ff1 197 } while(false)
danodonovan 24:5a2272a25ff1 198
danodonovan 24:5a2272a25ff1 199 #define ADI_SENSE_1000_CHANNEL_IS_ADC(c) \
danodonovan 24:5a2272a25ff1 200 ((c) >= ADI_SENSE_1000_CHANNEL_ID_CJC_0 && (c) <= ADI_SENSE_1000_CHANNEL_ID_CURRENT_0)
danodonovan 24:5a2272a25ff1 201
danodonovan 24:5a2272a25ff1 202 #define ADI_SENSE_1000_CHANNEL_IS_ADC_CJC(c) \
danodonovan 24:5a2272a25ff1 203 ((c) >= ADI_SENSE_1000_CHANNEL_ID_CJC_0 && (c) <= ADI_SENSE_1000_CHANNEL_ID_CJC_1)
danodonovan 24:5a2272a25ff1 204
danodonovan 24:5a2272a25ff1 205 #define ADI_SENSE_1000_CHANNEL_IS_ADC_SENSOR(c) \
danodonovan 24:5a2272a25ff1 206 ((c) >= ADI_SENSE_1000_CHANNEL_ID_SENSOR_0 && (c) <= ADI_SENSE_1000_CHANNEL_ID_SENSOR_3)
danodonovan 24:5a2272a25ff1 207
danodonovan 24:5a2272a25ff1 208 #define ADI_SENSE_1000_CHANNEL_IS_ADC_VOLTAGE(c) \
danodonovan 24:5a2272a25ff1 209 ((c) == ADI_SENSE_1000_CHANNEL_ID_VOLTAGE_0)
danodonovan 24:5a2272a25ff1 210
danodonovan 24:5a2272a25ff1 211 #define ADI_SENSE_1000_CHANNEL_IS_ADC_CURRENT(c) \
danodonovan 24:5a2272a25ff1 212 ((c) == ADI_SENSE_1000_CHANNEL_ID_CURRENT_0)
danodonovan 24:5a2272a25ff1 213
danodonovan 24:5a2272a25ff1 214 #define ADI_SENSE_1000_CHANNEL_IS_VIRTUAL(c) \
danodonovan 24:5a2272a25ff1 215 ((c) == ADI_SENSE_1000_CHANNEL_ID_SPI_1 || (c) == ADI_SENSE_1000_CHANNEL_ID_SPI_2)
danodonovan 24:5a2272a25ff1 216
danodonovan 24:5a2272a25ff1 217 typedef struct
danodonovan 24:5a2272a25ff1 218 {
danodonovan 24:5a2272a25ff1 219 unsigned nDeviceIndex;
danodonovan 24:5a2272a25ff1 220 ADI_SENSE_SPI_HANDLE hSpi;
danodonovan 24:5a2272a25ff1 221 ADI_SENSE_GPIO_HANDLE hGpio;
danodonovan 24:5a2272a25ff1 222 } ADI_SENSE_DEVICE_CONTEXT;
danodonovan 24:5a2272a25ff1 223
danodonovan 24:5a2272a25ff1 224 static ADI_SENSE_DEVICE_CONTEXT gDeviceCtx[ADI_SENSE_PLATFORM_MAX_DEVICES];
danodonovan 24:5a2272a25ff1 225
danodonovan 24:5a2272a25ff1 226 /*
danodonovan 24:5a2272a25ff1 227 * Open an ADI Sense device instance.
danodonovan 24:5a2272a25ff1 228 */
danodonovan 24:5a2272a25ff1 229 ADI_SENSE_RESULT adi_sense_Open(
danodonovan 24:5a2272a25ff1 230 unsigned const nDeviceIndex,
danodonovan 24:5a2272a25ff1 231 ADI_SENSE_CONNECTION * const pConnectionInfo,
danodonovan 24:5a2272a25ff1 232 ADI_SENSE_DEVICE_HANDLE * const phDevice)
danodonovan 24:5a2272a25ff1 233 {
danodonovan 24:5a2272a25ff1 234 ADI_SENSE_DEVICE_CONTEXT *pCtx;
danodonovan 24:5a2272a25ff1 235 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 236
danodonovan 24:5a2272a25ff1 237 if (nDeviceIndex >= ADI_SENSE_PLATFORM_MAX_DEVICES)
danodonovan 24:5a2272a25ff1 238 return ADI_SENSE_INVALID_DEVICE_NUM;
danodonovan 24:5a2272a25ff1 239
danodonovan 24:5a2272a25ff1 240 pCtx = &gDeviceCtx[nDeviceIndex];
danodonovan 24:5a2272a25ff1 241 pCtx->nDeviceIndex = nDeviceIndex;
danodonovan 24:5a2272a25ff1 242
danodonovan 24:5a2272a25ff1 243 eRet = adi_sense_LogOpen();
danodonovan 24:5a2272a25ff1 244 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 245 return eRet;
danodonovan 24:5a2272a25ff1 246
danodonovan 24:5a2272a25ff1 247 eRet = adi_sense_GpioOpen(&pConnectionInfo->gpio, &pCtx->hGpio);
danodonovan 24:5a2272a25ff1 248 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 249 return eRet;
danodonovan 24:5a2272a25ff1 250
danodonovan 24:5a2272a25ff1 251 eRet = adi_sense_SpiOpen(&pConnectionInfo->spi, &pCtx->hSpi);
danodonovan 24:5a2272a25ff1 252 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 253 return eRet;
danodonovan 24:5a2272a25ff1 254
danodonovan 24:5a2272a25ff1 255 *phDevice = pCtx;
danodonovan 24:5a2272a25ff1 256 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 257 }
danodonovan 24:5a2272a25ff1 258
danodonovan 24:5a2272a25ff1 259 /*
danodonovan 24:5a2272a25ff1 260 * Get the current state of the specified GPIO input signal.
danodonovan 24:5a2272a25ff1 261 */
danodonovan 24:5a2272a25ff1 262 ADI_SENSE_RESULT adi_sense_GetGpioState(
danodonovan 24:5a2272a25ff1 263 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 264 ADI_SENSE_GPIO_PIN const ePinId,
danodonovan 24:5a2272a25ff1 265 bool_t * const pbAsserted)
danodonovan 24:5a2272a25ff1 266 {
danodonovan 24:5a2272a25ff1 267 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
danodonovan 24:5a2272a25ff1 268
danodonovan 24:5a2272a25ff1 269 return adi_sense_GpioGet(pCtx->hGpio, ePinId, pbAsserted);
danodonovan 24:5a2272a25ff1 270 }
danodonovan 24:5a2272a25ff1 271
danodonovan 24:5a2272a25ff1 272 /*
danodonovan 24:5a2272a25ff1 273 * Register an application-defined callback function for GPIO interrupts.
danodonovan 24:5a2272a25ff1 274 */
danodonovan 24:5a2272a25ff1 275 ADI_SENSE_RESULT adi_sense_RegisterGpioCallback(
danodonovan 24:5a2272a25ff1 276 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 277 ADI_SENSE_GPIO_PIN const ePinId,
danodonovan 24:5a2272a25ff1 278 ADI_SENSE_GPIO_CALLBACK const callbackFunction,
danodonovan 24:5a2272a25ff1 279 void * const pCallbackParam)
danodonovan 24:5a2272a25ff1 280 {
danodonovan 24:5a2272a25ff1 281 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
danodonovan 24:5a2272a25ff1 282
danodonovan 24:5a2272a25ff1 283 if (callbackFunction)
danodonovan 24:5a2272a25ff1 284 {
danodonovan 24:5a2272a25ff1 285 return adi_sense_GpioIrqEnable(pCtx->hGpio, ePinId, callbackFunction,
danodonovan 24:5a2272a25ff1 286 pCallbackParam);
danodonovan 24:5a2272a25ff1 287 }
danodonovan 24:5a2272a25ff1 288 else
danodonovan 24:5a2272a25ff1 289 {
danodonovan 24:5a2272a25ff1 290 return adi_sense_GpioIrqDisable(pCtx->hGpio, ePinId);
danodonovan 24:5a2272a25ff1 291 }
danodonovan 24:5a2272a25ff1 292 }
danodonovan 24:5a2272a25ff1 293
danodonovan 24:5a2272a25ff1 294 /*
danodonovan 24:5a2272a25ff1 295 * Reset the specified ADI Sense device.
danodonovan 24:5a2272a25ff1 296 */
danodonovan 24:5a2272a25ff1 297 ADI_SENSE_RESULT adi_sense_Reset(
danodonovan 24:5a2272a25ff1 298 ADI_SENSE_DEVICE_HANDLE const hDevice)
danodonovan 24:5a2272a25ff1 299 {
danodonovan 24:5a2272a25ff1 300 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
danodonovan 24:5a2272a25ff1 301 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 302
danodonovan 24:5a2272a25ff1 303 /* Pulse the Reset GPIO pin low for a minimum of 4 microseconds */
danodonovan 24:5a2272a25ff1 304 eRet = adi_sense_GpioSet(pCtx->hGpio, ADI_SENSE_GPIO_PIN_RESET, false);
danodonovan 24:5a2272a25ff1 305 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 306 return eRet;
danodonovan 24:5a2272a25ff1 307
danodonovan 24:5a2272a25ff1 308 adi_sense_TimeDelayUsec(4);
danodonovan 24:5a2272a25ff1 309
danodonovan 24:5a2272a25ff1 310 eRet = adi_sense_GpioSet(pCtx->hGpio, ADI_SENSE_GPIO_PIN_RESET, true);
danodonovan 24:5a2272a25ff1 311 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 312 return eRet;
danodonovan 24:5a2272a25ff1 313
danodonovan 24:5a2272a25ff1 314 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 315 }
danodonovan 24:5a2272a25ff1 316
danodonovan 24:5a2272a25ff1 317
danodonovan 24:5a2272a25ff1 318 /*!
danodonovan 24:5a2272a25ff1 319 * @brief Get general status of ADISense module.
danodonovan 24:5a2272a25ff1 320 *
danodonovan 24:5a2272a25ff1 321 * @param[in]
danodonovan 24:5a2272a25ff1 322 * @param[out] pStatus : Pointer to CORE Status struct.
danodonovan 24:5a2272a25ff1 323 *
danodonovan 24:5a2272a25ff1 324 * @return Status
danodonovan 24:5a2272a25ff1 325 * - #ADI_SENSE_SUCCESS Call completed successfully.
danodonovan 24:5a2272a25ff1 326 * - #ADI_SENSE_FAILURE If status register read fails.
danodonovan 24:5a2272a25ff1 327 *
danodonovan 24:5a2272a25ff1 328 * @details Read the general status register for the ADISense
danodonovan 24:5a2272a25ff1 329 * module. Indicates Error, Alert conditions, data ready
danodonovan 24:5a2272a25ff1 330 * and command running.
danodonovan 24:5a2272a25ff1 331 *
danodonovan 24:5a2272a25ff1 332 */
danodonovan 24:5a2272a25ff1 333 ADI_SENSE_RESULT adi_sense_GetStatus(
danodonovan 24:5a2272a25ff1 334 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 335 ADI_SENSE_STATUS * const pStatus)
danodonovan 24:5a2272a25ff1 336 {
danodonovan 24:5a2272a25ff1 337 ADI_ADISENSE_CORE_Status_t statusReg;
danodonovan 24:5a2272a25ff1 338 READ_REG_U8(hDevice, statusReg.VALUE8, CORE_STATUS);
danodonovan 24:5a2272a25ff1 339
danodonovan 24:5a2272a25ff1 340 memset(pStatus, 0, sizeof(*pStatus));
danodonovan 24:5a2272a25ff1 341
danodonovan 24:5a2272a25ff1 342 if (!statusReg.Cmd_Running) /* Active-low, so invert it */
danodonovan 24:5a2272a25ff1 343 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_BUSY;
danodonovan 24:5a2272a25ff1 344 if (statusReg.Drdy)
danodonovan 24:5a2272a25ff1 345 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_DATAREADY;
danodonovan 24:5a2272a25ff1 346 if (statusReg.FIFO_Error)
danodonovan 24:5a2272a25ff1 347 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_FIFO_ERROR;
danodonovan 24:5a2272a25ff1 348 if (statusReg.Alert_Active)
danodonovan 24:5a2272a25ff1 349 {
danodonovan 24:5a2272a25ff1 350 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_ALERT;
danodonovan 24:5a2272a25ff1 351
danodonovan 24:5a2272a25ff1 352 ADI_ADISENSE_CORE_Alert_Code_t alertCodeReg;
danodonovan 24:5a2272a25ff1 353 READ_REG_U16(hDevice, alertCodeReg.VALUE16, CORE_ALERT_CODE);
danodonovan 24:5a2272a25ff1 354 pStatus->alertCode = alertCodeReg.Alert_Code;
danodonovan 24:5a2272a25ff1 355
danodonovan 24:5a2272a25ff1 356 ADI_ADISENSE_CORE_Channel_Alert_Status_t channelAlertStatusReg;
danodonovan 24:5a2272a25ff1 357 READ_REG_U16(hDevice, channelAlertStatusReg.VALUE16,
danodonovan 24:5a2272a25ff1 358 CORE_CHANNEL_ALERT_STATUS);
danodonovan 24:5a2272a25ff1 359
danodonovan 24:5a2272a25ff1 360 for (unsigned i = 0; i < ADI_SENSE_1000_MAX_CHANNELS; i++)
danodonovan 24:5a2272a25ff1 361 {
danodonovan 24:5a2272a25ff1 362 if (channelAlertStatusReg.VALUE16 & (1 << i))
danodonovan 24:5a2272a25ff1 363 {
danodonovan 24:5a2272a25ff1 364 ADI_ADISENSE_CORE_Alert_Code_Ch_t channelAlertCodeReg;
danodonovan 24:5a2272a25ff1 365 READ_REG_U16(hDevice, channelAlertCodeReg.VALUE16, CORE_ALERT_CODE_CHn(i));
danodonovan 24:5a2272a25ff1 366 pStatus->channelAlertCodes[i] = channelAlertCodeReg.Alert_Code_Ch;
danodonovan 24:5a2272a25ff1 367
danodonovan 24:5a2272a25ff1 368 ADI_ADISENSE_CORE_Alert_Detail_Ch_t alertDetailReg;
danodonovan 24:5a2272a25ff1 369 READ_REG_U16(hDevice, alertDetailReg.VALUE16,
danodonovan 24:5a2272a25ff1 370 CORE_ALERT_DETAIL_CHn(i));
danodonovan 24:5a2272a25ff1 371
danodonovan 24:5a2272a25ff1 372 if (alertDetailReg.Time_Out)
danodonovan 24:5a2272a25ff1 373 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_TIMEOUT;
danodonovan 24:5a2272a25ff1 374 if (alertDetailReg.Under_Range)
danodonovan 24:5a2272a25ff1 375 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_UNDER_RANGE;
danodonovan 24:5a2272a25ff1 376 if (alertDetailReg.Over_Range)
danodonovan 24:5a2272a25ff1 377 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_OVER_RANGE;
danodonovan 24:5a2272a25ff1 378 if (alertDetailReg.Low_Limit)
danodonovan 24:5a2272a25ff1 379 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_LOW_LIMIT;
danodonovan 24:5a2272a25ff1 380 if (alertDetailReg.High_Limit)
danodonovan 24:5a2272a25ff1 381 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_HIGH_LIMIT;
danodonovan 24:5a2272a25ff1 382 if (alertDetailReg.Sensor_Open)
danodonovan 24:5a2272a25ff1 383 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_SENSOR_OPEN;
danodonovan 24:5a2272a25ff1 384 if (alertDetailReg.Ref_Detect)
danodonovan 24:5a2272a25ff1 385 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_REF_DETECT;
danodonovan 24:5a2272a25ff1 386 if (alertDetailReg.Config_Err)
danodonovan 24:5a2272a25ff1 387 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_CONFIG_ERR;
danodonovan 24:5a2272a25ff1 388 if (alertDetailReg.LUT_Error_Ch)
danodonovan 24:5a2272a25ff1 389 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_LUT_ERR;
danodonovan 24:5a2272a25ff1 390 if (alertDetailReg.Sensor_Not_Ready)
danodonovan 24:5a2272a25ff1 391 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_SENSOR_NOT_READY;
danodonovan 24:5a2272a25ff1 392 if (alertDetailReg.Comp_Not_Ready)
danodonovan 24:5a2272a25ff1 393 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_COMP_NOT_READY;
danodonovan 24:5a2272a25ff1 394 if (alertDetailReg.Under_Voltage)
danodonovan 24:5a2272a25ff1 395 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_UNDER_VOLTAGE;
danodonovan 24:5a2272a25ff1 396 if (alertDetailReg.Over_Voltage)
danodonovan 24:5a2272a25ff1 397 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_OVER_VOLTAGE;
danodonovan 24:5a2272a25ff1 398 if (alertDetailReg.Correction_UnderRange)
danodonovan 24:5a2272a25ff1 399 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_LUT_UNDER_RANGE;
danodonovan 24:5a2272a25ff1 400 if (alertDetailReg.Correction_OverRange)
danodonovan 24:5a2272a25ff1 401 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_LUT_OVER_RANGE;
danodonovan 24:5a2272a25ff1 402 }
danodonovan 24:5a2272a25ff1 403 }
danodonovan 24:5a2272a25ff1 404
danodonovan 24:5a2272a25ff1 405 ADI_ADISENSE_CORE_Alert_Status_2_t alert2Reg;
danodonovan 24:5a2272a25ff1 406 READ_REG_U16(hDevice, alert2Reg.VALUE16, CORE_ALERT_STATUS_2);
danodonovan 24:5a2272a25ff1 407 if (alert2Reg.Configuration_Error)
danodonovan 24:5a2272a25ff1 408 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_CONFIG_ERROR;
danodonovan 24:5a2272a25ff1 409 if (alert2Reg.LUT_Error)
danodonovan 24:5a2272a25ff1 410 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_LUT_ERROR;
danodonovan 24:5a2272a25ff1 411 }
danodonovan 24:5a2272a25ff1 412
danodonovan 24:5a2272a25ff1 413 if (statusReg.Error)
danodonovan 24:5a2272a25ff1 414 {
danodonovan 24:5a2272a25ff1 415 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_ERROR;
danodonovan 24:5a2272a25ff1 416
danodonovan 24:5a2272a25ff1 417 ADI_ADISENSE_CORE_Error_Code_t errorCodeReg;
danodonovan 24:5a2272a25ff1 418 READ_REG_U16(hDevice, errorCodeReg.VALUE16, CORE_ERROR_CODE);
danodonovan 24:5a2272a25ff1 419 pStatus->errorCode = errorCodeReg.Error_Code;
danodonovan 24:5a2272a25ff1 420
danodonovan 24:5a2272a25ff1 421 ADI_ADISENSE_CORE_Diagnostics_Status_t diagStatusReg;
danodonovan 24:5a2272a25ff1 422 READ_REG_U16(hDevice, diagStatusReg.VALUE16, CORE_DIAGNOSTICS_STATUS);
danodonovan 24:5a2272a25ff1 423
danodonovan 24:5a2272a25ff1 424 if (diagStatusReg.Diag_Checksum_Error)
danodonovan 24:5a2272a25ff1 425 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_CHECKSUM_ERROR;
danodonovan 24:5a2272a25ff1 426 if (diagStatusReg.Diag_Comms_Error)
danodonovan 24:5a2272a25ff1 427 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_COMMS_ERROR;
danodonovan 24:5a2272a25ff1 428 if (diagStatusReg.Diag_Supply_Monitor_Error)
danodonovan 24:5a2272a25ff1 429 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_SUPPLY_MONITOR_ERROR;
danodonovan 24:5a2272a25ff1 430 if (diagStatusReg.Diag_Supply_Cap_Error)
danodonovan 24:5a2272a25ff1 431 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_SUPPLY_CAP_ERROR;
danodonovan 24:5a2272a25ff1 432 if (diagStatusReg.Diag_Ainm_UV_Error)
danodonovan 24:5a2272a25ff1 433 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_AINM_UV_ERROR;
danodonovan 24:5a2272a25ff1 434 if (diagStatusReg.Diag_Ainm_OV_Error)
danodonovan 24:5a2272a25ff1 435 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_AINM_OV_ERROR;
danodonovan 24:5a2272a25ff1 436 if (diagStatusReg.Diag_Ainp_UV_Error)
danodonovan 24:5a2272a25ff1 437 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_AINP_UV_ERROR;
danodonovan 24:5a2272a25ff1 438 if (diagStatusReg.Diag_Ainp_OV_Error)
danodonovan 24:5a2272a25ff1 439 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_AINP_OV_ERROR;
danodonovan 24:5a2272a25ff1 440 if (diagStatusReg.Diag_Conversion_Error)
danodonovan 24:5a2272a25ff1 441 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_CONVERSION_ERROR;
danodonovan 24:5a2272a25ff1 442 if (diagStatusReg.Diag_Calibration_Error)
danodonovan 24:5a2272a25ff1 443 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_CALIBRATION_ERROR;
danodonovan 24:5a2272a25ff1 444 }
danodonovan 24:5a2272a25ff1 445
danodonovan 24:5a2272a25ff1 446 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 447 }
danodonovan 24:5a2272a25ff1 448
danodonovan 24:5a2272a25ff1 449 ADI_SENSE_RESULT adi_sense_GetCommandRunningState(
danodonovan 24:5a2272a25ff1 450 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 451 bool_t *pbCommandRunning)
danodonovan 24:5a2272a25ff1 452 {
danodonovan 24:5a2272a25ff1 453 ADI_ADISENSE_CORE_Status_t statusReg;
danodonovan 24:5a2272a25ff1 454
danodonovan 24:5a2272a25ff1 455 READ_REG_U8(hDevice, statusReg.VALUE8, CORE_STATUS);
danodonovan 24:5a2272a25ff1 456
danodonovan 24:5a2272a25ff1 457 /* We should never normally see 0xFF here if the module is operational */
danodonovan 24:5a2272a25ff1 458 if (statusReg.VALUE8 == 0xFF)
danodonovan 24:5a2272a25ff1 459 return ADI_SENSE_ERR_NOT_INITIALIZED;
danodonovan 24:5a2272a25ff1 460
danodonovan 24:5a2272a25ff1 461 *pbCommandRunning = !statusReg.Cmd_Running; /* Active-low, so invert it */
danodonovan 24:5a2272a25ff1 462
danodonovan 24:5a2272a25ff1 463 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 464 }
danodonovan 24:5a2272a25ff1 465
danodonovan 24:5a2272a25ff1 466 static ADI_SENSE_RESULT executeCommand(
danodonovan 24:5a2272a25ff1 467 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 468 ADI_ADISENSE_CORE_Command_Special_Command const command,
danodonovan 24:5a2272a25ff1 469 bool_t const bWaitForCompletion)
danodonovan 24:5a2272a25ff1 470 {
danodonovan 24:5a2272a25ff1 471 ADI_ADISENSE_CORE_Command_t commandReg;
danodonovan 24:5a2272a25ff1 472 bool_t bCommandRunning;
danodonovan 24:5a2272a25ff1 473 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 474
danodonovan 24:5a2272a25ff1 475 /*
danodonovan 24:5a2272a25ff1 476 * Don't allow another command to be issued if one is already running, but
danodonovan 24:5a2272a25ff1 477 * make an exception for ADISENSE_CORE_COMMAND_NOP which can be used to
danodonovan 24:5a2272a25ff1 478 * request a running command to be stopped (e.g. continuous measurement)
danodonovan 24:5a2272a25ff1 479 */
danodonovan 24:5a2272a25ff1 480 if (command != ADISENSE_CORE_COMMAND_NOP)
danodonovan 24:5a2272a25ff1 481 {
danodonovan 24:5a2272a25ff1 482 eRet = adi_sense_GetCommandRunningState(hDevice, &bCommandRunning);
danodonovan 24:5a2272a25ff1 483 if (eRet)
danodonovan 24:5a2272a25ff1 484 return eRet;
danodonovan 24:5a2272a25ff1 485
danodonovan 24:5a2272a25ff1 486 if (bCommandRunning)
danodonovan 24:5a2272a25ff1 487 return ADI_SENSE_IN_USE;
danodonovan 24:5a2272a25ff1 488 }
danodonovan 24:5a2272a25ff1 489
danodonovan 24:5a2272a25ff1 490 commandReg.Special_Command = command;
danodonovan 24:5a2272a25ff1 491 WRITE_REG_U8(hDevice, commandReg.VALUE8, CORE_COMMAND);
danodonovan 24:5a2272a25ff1 492
danodonovan 24:5a2272a25ff1 493 if (bWaitForCompletion)
danodonovan 24:5a2272a25ff1 494 {
danodonovan 24:5a2272a25ff1 495 do {
danodonovan 24:5a2272a25ff1 496 /* Allow a minimum 50usec delay for status update before checking */
danodonovan 24:5a2272a25ff1 497 adi_sense_TimeDelayUsec(50);
danodonovan 24:5a2272a25ff1 498
danodonovan 24:5a2272a25ff1 499 eRet = adi_sense_GetCommandRunningState(hDevice, &bCommandRunning);
danodonovan 24:5a2272a25ff1 500 if (eRet)
danodonovan 24:5a2272a25ff1 501 return eRet;
danodonovan 24:5a2272a25ff1 502 } while (bCommandRunning);
danodonovan 24:5a2272a25ff1 503 }
danodonovan 24:5a2272a25ff1 504
danodonovan 24:5a2272a25ff1 505 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 506 }
danodonovan 24:5a2272a25ff1 507
danodonovan 24:5a2272a25ff1 508 ADI_SENSE_RESULT adi_sense_ApplyConfigUpdates(
danodonovan 24:5a2272a25ff1 509 ADI_SENSE_DEVICE_HANDLE const hDevice)
danodonovan 24:5a2272a25ff1 510 {
danodonovan 24:5a2272a25ff1 511 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_LATCH_CONFIG, true);
danodonovan 24:5a2272a25ff1 512 }
danodonovan 24:5a2272a25ff1 513
danodonovan 24:5a2272a25ff1 514 /*!
danodonovan 24:5a2272a25ff1 515 * @brief Start a measurement cycle.
danodonovan 24:5a2272a25ff1 516 *
danodonovan 24:5a2272a25ff1 517 * @param[out]
danodonovan 24:5a2272a25ff1 518 *
danodonovan 24:5a2272a25ff1 519 * @return Status
danodonovan 24:5a2272a25ff1 520 * - #ADI_SENSE_SUCCESS Call completed successfully.
danodonovan 24:5a2272a25ff1 521 * - #ADI_SENSE_FAILURE
danodonovan 24:5a2272a25ff1 522 *
danodonovan 24:5a2272a25ff1 523 * @details Sends the latch config command. Configuration for channels in
danodonovan 24:5a2272a25ff1 524 * conversion cycle should be completed before this function.
danodonovan 24:5a2272a25ff1 525 * Channel enabled bit should be set before this function.
danodonovan 24:5a2272a25ff1 526 * Starts a conversion and configures the format of the sample.
danodonovan 24:5a2272a25ff1 527 *
danodonovan 24:5a2272a25ff1 528 */
danodonovan 24:5a2272a25ff1 529 ADI_SENSE_RESULT adi_sense_StartMeasurement(
danodonovan 24:5a2272a25ff1 530 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 531 ADI_SENSE_MEASUREMENT_MODE const eMeasurementMode)
danodonovan 24:5a2272a25ff1 532 {
danodonovan 24:5a2272a25ff1 533 switch (eMeasurementMode)
danodonovan 24:5a2272a25ff1 534 {
danodonovan 24:5a2272a25ff1 535 case ADI_SENSE_MEASUREMENT_MODE_HEALTHCHECK:
danodonovan 24:5a2272a25ff1 536 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SYSTEM_CHECK, false);
danodonovan 24:5a2272a25ff1 537 case ADI_SENSE_MEASUREMENT_MODE_NORMAL:
danodonovan 24:5a2272a25ff1 538 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_CONVERT_WITH_RAW, false);
danodonovan 24:5a2272a25ff1 539 case ADI_SENSE_MEASUREMENT_MODE_OMIT_RAW:
danodonovan 24:5a2272a25ff1 540 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_CONVERT, false);
danodonovan 24:5a2272a25ff1 541 default:
danodonovan 24:5a2272a25ff1 542 ADI_SENSE_LOG_ERROR("Invalid measurement mode %d specified",
danodonovan 24:5a2272a25ff1 543 eMeasurementMode);
danodonovan 24:5a2272a25ff1 544 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 545 }
danodonovan 24:5a2272a25ff1 546 }
danodonovan 24:5a2272a25ff1 547
danodonovan 24:5a2272a25ff1 548 /*
danodonovan 24:5a2272a25ff1 549 * Store the configuration settings to persistent memory on the device.
danodonovan 24:5a2272a25ff1 550 * No other command must be running when this is called.
danodonovan 24:5a2272a25ff1 551 * Do not power down the device while this command is running.
danodonovan 24:5a2272a25ff1 552 */
danodonovan 24:5a2272a25ff1 553 ADI_SENSE_RESULT adi_sense_SaveConfig(
danodonovan 24:5a2272a25ff1 554 ADI_SENSE_DEVICE_HANDLE const hDevice)
danodonovan 24:5a2272a25ff1 555 {
danodonovan 24:5a2272a25ff1 556 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SAVE_CONFIG, true);
danodonovan 24:5a2272a25ff1 557 }
danodonovan 24:5a2272a25ff1 558
danodonovan 24:5a2272a25ff1 559 /*
danodonovan 24:5a2272a25ff1 560 * Restore the configuration settings from persistent memory on the device.
danodonovan 24:5a2272a25ff1 561 * No other command must be running when this is called.
danodonovan 24:5a2272a25ff1 562 */
danodonovan 24:5a2272a25ff1 563 ADI_SENSE_RESULT adi_sense_RestoreConfig(
danodonovan 24:5a2272a25ff1 564 ADI_SENSE_DEVICE_HANDLE const hDevice)
danodonovan 24:5a2272a25ff1 565 {
danodonovan 24:5a2272a25ff1 566 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_LOAD_CONFIG, true);
danodonovan 24:5a2272a25ff1 567 }
danodonovan 24:5a2272a25ff1 568
danodonovan 24:5a2272a25ff1 569 /*
danodonovan 24:5a2272a25ff1 570 * Store the LUT data to persistent memory on the device.
danodonovan 24:5a2272a25ff1 571 * No other command must be running when this is called.
danodonovan 24:5a2272a25ff1 572 * Do not power down the device while this command is running.
danodonovan 24:5a2272a25ff1 573 */
danodonovan 24:5a2272a25ff1 574 ADI_SENSE_RESULT adi_sense_SaveLutData(
danodonovan 24:5a2272a25ff1 575 ADI_SENSE_DEVICE_HANDLE const hDevice)
danodonovan 24:5a2272a25ff1 576 {
danodonovan 24:5a2272a25ff1 577 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SAVE_LUT2, true);
danodonovan 24:5a2272a25ff1 578 }
danodonovan 24:5a2272a25ff1 579
danodonovan 24:5a2272a25ff1 580 /*
danodonovan 24:5a2272a25ff1 581 * Restore the LUT data from persistent memory on the device.
danodonovan 24:5a2272a25ff1 582 * No other command must be running when this is called.
danodonovan 24:5a2272a25ff1 583 */
danodonovan 24:5a2272a25ff1 584 ADI_SENSE_RESULT adi_sense_RestoreLutData(
danodonovan 24:5a2272a25ff1 585 ADI_SENSE_DEVICE_HANDLE const hDevice)
danodonovan 24:5a2272a25ff1 586 {
danodonovan 24:5a2272a25ff1 587 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_LOAD_LUT, true);
danodonovan 24:5a2272a25ff1 588 }
danodonovan 24:5a2272a25ff1 589
danodonovan 24:5a2272a25ff1 590 /*
danodonovan 24:5a2272a25ff1 591 * Stop the measurement cycles on the device.
danodonovan 24:5a2272a25ff1 592 * To be used only if a measurement command is currently running.
danodonovan 24:5a2272a25ff1 593 */
danodonovan 24:5a2272a25ff1 594 ADI_SENSE_RESULT adi_sense_StopMeasurement(
danodonovan 24:5a2272a25ff1 595 ADI_SENSE_DEVICE_HANDLE const hDevice)
danodonovan 24:5a2272a25ff1 596 {
danodonovan 24:5a2272a25ff1 597 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_NOP, true);
danodonovan 24:5a2272a25ff1 598 }
danodonovan 24:5a2272a25ff1 599
danodonovan 24:5a2272a25ff1 600 /*
danodonovan 24:5a2272a25ff1 601 * Run built-in diagnostic checks on the device.
danodonovan 24:5a2272a25ff1 602 * Diagnostics are executed according to the current applied settings.
danodonovan 24:5a2272a25ff1 603 * No other command must be running when this is called.
danodonovan 24:5a2272a25ff1 604 */
danodonovan 24:5a2272a25ff1 605 ADI_SENSE_RESULT adi_sense_RunDiagnostics(
danodonovan 24:5a2272a25ff1 606 ADI_SENSE_DEVICE_HANDLE const hDevice)
danodonovan 24:5a2272a25ff1 607 {
danodonovan 24:5a2272a25ff1 608 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_RUN_DIAGNOSTICS, true);
danodonovan 24:5a2272a25ff1 609 }
danodonovan 24:5a2272a25ff1 610
danodonovan 24:5a2272a25ff1 611 /*
danodonovan 24:5a2272a25ff1 612 * Run self-calibration routines on the device.
danodonovan 24:5a2272a25ff1 613 * Calibration is executed according to the current applied settings.
danodonovan 24:5a2272a25ff1 614 * No other command must be running when this is called.
danodonovan 24:5a2272a25ff1 615 */
danodonovan 24:5a2272a25ff1 616 ADI_SENSE_RESULT adi_sense_RunCalibration(
danodonovan 24:5a2272a25ff1 617 ADI_SENSE_DEVICE_HANDLE const hDevice)
danodonovan 24:5a2272a25ff1 618 {
danodonovan 24:5a2272a25ff1 619 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SELF_CALIBRATION, true);
danodonovan 24:5a2272a25ff1 620 }
danodonovan 24:5a2272a25ff1 621
danodonovan 24:5a2272a25ff1 622 /*
danodonovan 24:5a2272a25ff1 623 * Read a set of data samples from the device.
danodonovan 24:5a2272a25ff1 624 * This may be called at any time.
danodonovan 24:5a2272a25ff1 625 */
danodonovan 24:5a2272a25ff1 626 ADI_SENSE_RESULT adi_sense_GetData(
danodonovan 24:5a2272a25ff1 627 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 628 ADI_SENSE_MEASUREMENT_MODE const eMeasurementMode,
danodonovan 24:5a2272a25ff1 629 ADI_SENSE_DATA_SAMPLE * const pSamples,
danodonovan 24:5a2272a25ff1 630 uint32_t const nRequested,
danodonovan 24:5a2272a25ff1 631 uint32_t * const pnReturned)
danodonovan 24:5a2272a25ff1 632 {
danodonovan 24:5a2272a25ff1 633 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
danodonovan 24:5a2272a25ff1 634 uint16_t command = REG_READ_COMMAND |
danodonovan 24:5a2272a25ff1 635 (REG_ADISENSE_CORE_DATA_FIFO & REG_ADDRESS_MASK);
danodonovan 24:5a2272a25ff1 636 uint8_t commandData[2] = {
danodonovan 24:5a2272a25ff1 637 command >> 8,
danodonovan 24:5a2272a25ff1 638 command & 0xFF
danodonovan 24:5a2272a25ff1 639 };
danodonovan 24:5a2272a25ff1 640 uint8_t commandResponse[2];
danodonovan 24:5a2272a25ff1 641 unsigned nValidSamples = 0;
danodonovan 24:5a2272a25ff1 642 ADI_SENSE_RESULT eRet = ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 643
danodonovan 24:5a2272a25ff1 644 do {
danodonovan 24:5a2272a25ff1 645 eRet = adi_sense_SpiTransfer(pCtx->hSpi, commandData, commandResponse,
danodonovan 24:5a2272a25ff1 646 sizeof(command), false);
danodonovan 24:5a2272a25ff1 647 if (eRet)
danodonovan 24:5a2272a25ff1 648 {
danodonovan 24:5a2272a25ff1 649 ADI_SENSE_LOG_ERROR("Failed to send read command for FIFO register");
danodonovan 24:5a2272a25ff1 650 return eRet;
danodonovan 24:5a2272a25ff1 651 }
danodonovan 24:5a2272a25ff1 652
danodonovan 24:5a2272a25ff1 653 adi_sense_TimeDelayUsec(POST_SPI_TRANSFER_DELAY_USEC);
danodonovan 24:5a2272a25ff1 654 } while ((commandResponse[0] != REG_COMMAND_RESP_0) ||
danodonovan 24:5a2272a25ff1 655 (commandResponse[1] != REG_COMMAND_RESP_1));
danodonovan 24:5a2272a25ff1 656
danodonovan 24:5a2272a25ff1 657 for (unsigned i = 0; i < nRequested; i++)
danodonovan 24:5a2272a25ff1 658 {
danodonovan 24:5a2272a25ff1 659 ADI_ADISENSE_CORE_Data_FIFO_t dataFifoReg;
danodonovan 24:5a2272a25ff1 660 bool_t bHoldCs = true;
danodonovan 24:5a2272a25ff1 661 unsigned readSampleSize = sizeof(dataFifoReg);
danodonovan 24:5a2272a25ff1 662
danodonovan 24:5a2272a25ff1 663 if (eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_OMIT_RAW)
danodonovan 24:5a2272a25ff1 664 readSampleSize -= 3; /* 3B raw value omitted in this case */
danodonovan 24:5a2272a25ff1 665
danodonovan 24:5a2272a25ff1 666 /* Keep the CS signal asserted for all but the last sample */
danodonovan 24:5a2272a25ff1 667 if ((i + 1) == nRequested)
danodonovan 24:5a2272a25ff1 668 bHoldCs = false;
danodonovan 24:5a2272a25ff1 669
danodonovan 24:5a2272a25ff1 670 eRet = adi_sense_SpiTransfer(pCtx->hSpi, NULL, &dataFifoReg,
danodonovan 24:5a2272a25ff1 671 readSampleSize, bHoldCs);
danodonovan 24:5a2272a25ff1 672 if (eRet)
danodonovan 24:5a2272a25ff1 673 {
danodonovan 24:5a2272a25ff1 674 ADI_SENSE_LOG_ERROR("Failed to read data from FIFO register");
danodonovan 24:5a2272a25ff1 675 return eRet;
danodonovan 24:5a2272a25ff1 676 }
danodonovan 24:5a2272a25ff1 677
danodonovan 24:5a2272a25ff1 678 if (! dataFifoReg.Ch_Valid)
danodonovan 24:5a2272a25ff1 679 {
danodonovan 24:5a2272a25ff1 680 /*
danodonovan 24:5a2272a25ff1 681 * Reading an invalid sample indicates that there are no
danodonovan 24:5a2272a25ff1 682 * more samples available or we've lost sync with the device.
danodonovan 24:5a2272a25ff1 683 * In the latter case, it might be recoverable, but return here
danodonovan 24:5a2272a25ff1 684 * to let the application check the device status and decide itself.
danodonovan 24:5a2272a25ff1 685 */
danodonovan 24:5a2272a25ff1 686 eRet = ADI_SENSE_INCOMPLETE;
danodonovan 24:5a2272a25ff1 687 break;
danodonovan 24:5a2272a25ff1 688 }
danodonovan 24:5a2272a25ff1 689
danodonovan 24:5a2272a25ff1 690 ADI_SENSE_DATA_SAMPLE *pSample = &pSamples[nValidSamples];
danodonovan 24:5a2272a25ff1 691
danodonovan 24:5a2272a25ff1 692 pSample->status = 0;
danodonovan 24:5a2272a25ff1 693 if (dataFifoReg.Ch_Error)
danodonovan 24:5a2272a25ff1 694 pSample->status |= ADI_SENSE_DEVICE_STATUS_ERROR;
danodonovan 24:5a2272a25ff1 695 if (dataFifoReg.Ch_Alert)
danodonovan 24:5a2272a25ff1 696 pSample->status |= ADI_SENSE_DEVICE_STATUS_ALERT;
danodonovan 24:5a2272a25ff1 697
danodonovan 24:5a2272a25ff1 698 if (dataFifoReg.Ch_Raw)
danodonovan 24:5a2272a25ff1 699 pSample->rawValue = dataFifoReg.Raw_Sample;
danodonovan 24:5a2272a25ff1 700 else
danodonovan 24:5a2272a25ff1 701 pSample->rawValue = 0;
danodonovan 24:5a2272a25ff1 702
danodonovan 24:5a2272a25ff1 703 pSample->channelId = dataFifoReg.Channel_ID;
danodonovan 24:5a2272a25ff1 704 pSample->processedValue = dataFifoReg.Sensor_Result;
danodonovan 24:5a2272a25ff1 705
danodonovan 24:5a2272a25ff1 706 nValidSamples++;
danodonovan 24:5a2272a25ff1 707 }
danodonovan 24:5a2272a25ff1 708 *pnReturned = nValidSamples;
danodonovan 24:5a2272a25ff1 709
danodonovan 24:5a2272a25ff1 710 adi_sense_TimeDelayUsec(POST_SPI_TRANSFER_DELAY_USEC);
danodonovan 24:5a2272a25ff1 711
danodonovan 24:5a2272a25ff1 712 return eRet;
danodonovan 24:5a2272a25ff1 713 }
danodonovan 24:5a2272a25ff1 714
danodonovan 24:5a2272a25ff1 715 /*
danodonovan 24:5a2272a25ff1 716 * Close the given ADI Sense device.
danodonovan 24:5a2272a25ff1 717 */
danodonovan 24:5a2272a25ff1 718 ADI_SENSE_RESULT adi_sense_Close(
danodonovan 24:5a2272a25ff1 719 ADI_SENSE_DEVICE_HANDLE const hDevice)
danodonovan 24:5a2272a25ff1 720 {
danodonovan 24:5a2272a25ff1 721 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
danodonovan 24:5a2272a25ff1 722
danodonovan 24:5a2272a25ff1 723 adi_sense_GpioClose(pCtx->hGpio);
danodonovan 24:5a2272a25ff1 724 adi_sense_SpiClose(pCtx->hSpi);
danodonovan 24:5a2272a25ff1 725 adi_sense_LogClose();
danodonovan 24:5a2272a25ff1 726
danodonovan 24:5a2272a25ff1 727 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 728 }
danodonovan 24:5a2272a25ff1 729
danodonovan 24:5a2272a25ff1 730 ADI_SENSE_RESULT adi_sense_1000_WriteRegister(
danodonovan 24:5a2272a25ff1 731 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 732 uint16_t nAddress,
danodonovan 24:5a2272a25ff1 733 void *pData,
danodonovan 24:5a2272a25ff1 734 unsigned nLength)
danodonovan 24:5a2272a25ff1 735 {
danodonovan 24:5a2272a25ff1 736 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 737 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
danodonovan 24:5a2272a25ff1 738 uint16_t command = REG_WRITE_COMMAND | (nAddress & REG_ADDRESS_MASK);
danodonovan 24:5a2272a25ff1 739 uint8_t commandData[2] = {
danodonovan 24:5a2272a25ff1 740 command >> 8,
danodonovan 24:5a2272a25ff1 741 command & 0xFF
danodonovan 24:5a2272a25ff1 742 };
danodonovan 24:5a2272a25ff1 743 uint8_t commandResponse[2];
danodonovan 24:5a2272a25ff1 744
danodonovan 24:5a2272a25ff1 745 do {
danodonovan 24:5a2272a25ff1 746 eRet = adi_sense_SpiTransfer(pCtx->hSpi, commandData, commandResponse,
danodonovan 24:5a2272a25ff1 747 sizeof(command), false);
danodonovan 24:5a2272a25ff1 748 if (eRet)
danodonovan 24:5a2272a25ff1 749 {
danodonovan 24:5a2272a25ff1 750 ADI_SENSE_LOG_ERROR("Failed to send write command for register %u",
danodonovan 24:5a2272a25ff1 751 nAddress);
danodonovan 24:5a2272a25ff1 752 return eRet;
danodonovan 24:5a2272a25ff1 753 }
danodonovan 24:5a2272a25ff1 754
danodonovan 24:5a2272a25ff1 755 adi_sense_TimeDelayUsec(POST_SPI_TRANSFER_DELAY_USEC);
danodonovan 24:5a2272a25ff1 756 } while ((commandResponse[0] != REG_COMMAND_RESP_0) ||
danodonovan 24:5a2272a25ff1 757 (commandResponse[1] != REG_COMMAND_RESP_1));
danodonovan 24:5a2272a25ff1 758
danodonovan 24:5a2272a25ff1 759 eRet = adi_sense_SpiTransfer(pCtx->hSpi, pData, NULL, nLength, false);
danodonovan 24:5a2272a25ff1 760 if (eRet)
danodonovan 24:5a2272a25ff1 761 {
danodonovan 24:5a2272a25ff1 762 ADI_SENSE_LOG_ERROR("Failed to write data (%dB) to register %u",
danodonovan 24:5a2272a25ff1 763 nLength, nAddress);
danodonovan 24:5a2272a25ff1 764 return eRet;
danodonovan 24:5a2272a25ff1 765 }
danodonovan 24:5a2272a25ff1 766
danodonovan 24:5a2272a25ff1 767 adi_sense_TimeDelayUsec(POST_SPI_TRANSFER_DELAY_USEC);
danodonovan 24:5a2272a25ff1 768
danodonovan 24:5a2272a25ff1 769 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 770 }
danodonovan 24:5a2272a25ff1 771
danodonovan 24:5a2272a25ff1 772 ADI_SENSE_RESULT adi_sense_1000_ReadRegister(
danodonovan 24:5a2272a25ff1 773 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 774 uint16_t nAddress,
danodonovan 24:5a2272a25ff1 775 void *pData,
danodonovan 24:5a2272a25ff1 776 unsigned nLength)
danodonovan 24:5a2272a25ff1 777 {
danodonovan 24:5a2272a25ff1 778 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 779 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
danodonovan 24:5a2272a25ff1 780 uint16_t command = REG_READ_COMMAND | (nAddress & REG_ADDRESS_MASK);
danodonovan 24:5a2272a25ff1 781 uint8_t commandData[2] = {
danodonovan 24:5a2272a25ff1 782 command >> 8,
danodonovan 24:5a2272a25ff1 783 command & 0xFF
danodonovan 24:5a2272a25ff1 784 };
danodonovan 24:5a2272a25ff1 785 uint8_t commandResponse[2];
danodonovan 24:5a2272a25ff1 786
danodonovan 24:5a2272a25ff1 787 do {
danodonovan 24:5a2272a25ff1 788 eRet = adi_sense_SpiTransfer(pCtx->hSpi, commandData, commandResponse,
danodonovan 24:5a2272a25ff1 789 sizeof(command), false);
danodonovan 24:5a2272a25ff1 790 if (eRet)
danodonovan 24:5a2272a25ff1 791 {
danodonovan 24:5a2272a25ff1 792 ADI_SENSE_LOG_ERROR("Failed to send read command for register %u",
danodonovan 24:5a2272a25ff1 793 nAddress);
danodonovan 24:5a2272a25ff1 794 return eRet;
danodonovan 24:5a2272a25ff1 795 }
danodonovan 24:5a2272a25ff1 796
danodonovan 24:5a2272a25ff1 797 adi_sense_TimeDelayUsec(POST_SPI_TRANSFER_DELAY_USEC);
danodonovan 24:5a2272a25ff1 798 } while ((commandResponse[0] != REG_COMMAND_RESP_0) ||
danodonovan 24:5a2272a25ff1 799 (commandResponse[1] != REG_COMMAND_RESP_1));
danodonovan 24:5a2272a25ff1 800
danodonovan 24:5a2272a25ff1 801 eRet = adi_sense_SpiTransfer(pCtx->hSpi, NULL, pData, nLength, false);
danodonovan 24:5a2272a25ff1 802 if (eRet)
danodonovan 24:5a2272a25ff1 803 {
danodonovan 24:5a2272a25ff1 804 ADI_SENSE_LOG_ERROR("Failed to read data (%uB) from register %u",
danodonovan 24:5a2272a25ff1 805 nLength, nAddress);
danodonovan 24:5a2272a25ff1 806 return eRet;
danodonovan 24:5a2272a25ff1 807 }
danodonovan 24:5a2272a25ff1 808
danodonovan 24:5a2272a25ff1 809 adi_sense_TimeDelayUsec(POST_SPI_TRANSFER_DELAY_USEC);
danodonovan 24:5a2272a25ff1 810
danodonovan 24:5a2272a25ff1 811 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 812 }
danodonovan 24:5a2272a25ff1 813
danodonovan 24:5a2272a25ff1 814 ADI_SENSE_RESULT adi_sense_GetDeviceReadyState(
danodonovan 24:5a2272a25ff1 815 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 816 bool_t * const bReady)
danodonovan 24:5a2272a25ff1 817 {
danodonovan 24:5a2272a25ff1 818 ADI_ADISENSE_SPI_Chip_Type_t chipTypeReg;
danodonovan 24:5a2272a25ff1 819
danodonovan 24:5a2272a25ff1 820 READ_REG_U8(hDevice, chipTypeReg.VALUE8, SPI_CHIP_TYPE);
danodonovan 24:5a2272a25ff1 821 /* If we read this register successfully, assume the device is ready */
danodonovan 24:5a2272a25ff1 822 *bReady = (chipTypeReg.VALUE8 == REG_ADISENSE_SPI_CHIP_TYPE_RESET);
danodonovan 24:5a2272a25ff1 823
danodonovan 24:5a2272a25ff1 824 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 825 }
danodonovan 24:5a2272a25ff1 826
danodonovan 24:5a2272a25ff1 827 ADI_SENSE_RESULT adi_sense_1000_GetDataReadyModeInfo(
danodonovan 24:5a2272a25ff1 828 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 829 ADI_SENSE_MEASUREMENT_MODE const eMeasurementMode,
danodonovan 24:5a2272a25ff1 830 ADI_SENSE_1000_OPERATING_MODE * const peOperatingMode,
danodonovan 24:5a2272a25ff1 831 ADI_SENSE_1000_DATAREADY_MODE * const peDataReadyMode,
danodonovan 24:5a2272a25ff1 832 uint32_t * const pnSamplesPerDataready,
danodonovan 24:5a2272a25ff1 833 uint32_t * const pnSamplesPerCycle)
danodonovan 24:5a2272a25ff1 834 {
danodonovan 24:5a2272a25ff1 835 unsigned nChannelsEnabled = 0;
danodonovan 24:5a2272a25ff1 836 unsigned nSamplesPerCycle = 0;
danodonovan 24:5a2272a25ff1 837
danodonovan 24:5a2272a25ff1 838 for (ADI_SENSE_1000_CHANNEL_ID chId = 0; chId < ADI_SENSE_1000_MAX_CHANNELS; chId++)
danodonovan 24:5a2272a25ff1 839 {
danodonovan 24:5a2272a25ff1 840 ADI_ADISENSE_CORE_Sensor_Details_t sensorDetailsReg;
danodonovan 24:5a2272a25ff1 841 ADI_ADISENSE_CORE_Channel_Count_t channelCountReg;
danodonovan 24:5a2272a25ff1 842
danodonovan 24:5a2272a25ff1 843 if (ADI_SENSE_1000_CHANNEL_IS_VIRTUAL(chId))
danodonovan 24:5a2272a25ff1 844 continue;
danodonovan 24:5a2272a25ff1 845
danodonovan 24:5a2272a25ff1 846 READ_REG_U8(hDevice, channelCountReg.VALUE8, CORE_CHANNEL_COUNTn(chId));
danodonovan 24:5a2272a25ff1 847 READ_REG_U32(hDevice, sensorDetailsReg.VALUE32, CORE_SENSOR_DETAILSn(chId));
danodonovan 24:5a2272a25ff1 848
danodonovan 24:5a2272a25ff1 849 if (channelCountReg.Channel_Enable && !sensorDetailsReg.Do_Not_Publish)
danodonovan 24:5a2272a25ff1 850 {
danodonovan 24:5a2272a25ff1 851 ADI_ADISENSE_CORE_Sensor_Type_t sensorTypeReg;
danodonovan 24:5a2272a25ff1 852 unsigned nActualChannels = 1;
danodonovan 24:5a2272a25ff1 853
danodonovan 24:5a2272a25ff1 854 READ_REG_U16(hDevice, sensorTypeReg.VALUE16, CORE_SENSOR_TYPEn(chId));
danodonovan 24:5a2272a25ff1 855
danodonovan 24:5a2272a25ff1 856 if (chId == ADI_SENSE_1000_CHANNEL_ID_SPI_0)
danodonovan 24:5a2272a25ff1 857 {
danodonovan 24:5a2272a25ff1 858 /* Some sensors automatically generate samples on additional "virtual" channels
danodonovan 24:5a2272a25ff1 859 * so these channels must be counted as active when those sensors are selected
danodonovan 24:5a2272a25ff1 860 * and we use the count from the corresponding "physical" channel */
danodonovan 24:5a2272a25ff1 861 if (sensorTypeReg.Sensor_Type ==
danodonovan 24:5a2272a25ff1 862 ADISENSE_CORE_SENSOR_TYPE_SENSOR_SPI_ACCELEROMETER_1)
danodonovan 24:5a2272a25ff1 863 nActualChannels += 2;
danodonovan 24:5a2272a25ff1 864 }
danodonovan 24:5a2272a25ff1 865
danodonovan 24:5a2272a25ff1 866 nChannelsEnabled += nActualChannels;
danodonovan 24:5a2272a25ff1 867 if (eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_HEALTHCHECK)
danodonovan 24:5a2272a25ff1 868 /* Assume a single sample per channel in test mode */
danodonovan 24:5a2272a25ff1 869 nSamplesPerCycle += nActualChannels;
danodonovan 24:5a2272a25ff1 870 else
danodonovan 24:5a2272a25ff1 871 nSamplesPerCycle += nActualChannels *
danodonovan 24:5a2272a25ff1 872 (channelCountReg.Channel_Count + 1);
danodonovan 24:5a2272a25ff1 873 }
danodonovan 24:5a2272a25ff1 874 }
danodonovan 24:5a2272a25ff1 875
danodonovan 24:5a2272a25ff1 876 if (nChannelsEnabled == 0)
danodonovan 24:5a2272a25ff1 877 {
danodonovan 24:5a2272a25ff1 878 *pnSamplesPerDataready = 0;
danodonovan 24:5a2272a25ff1 879 *pnSamplesPerCycle = 0;
danodonovan 24:5a2272a25ff1 880 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 881 }
danodonovan 24:5a2272a25ff1 882
danodonovan 24:5a2272a25ff1 883 ADI_ADISENSE_CORE_Mode_t modeReg;
danodonovan 24:5a2272a25ff1 884 READ_REG_U8(hDevice, modeReg.VALUE8, CORE_MODE);
danodonovan 24:5a2272a25ff1 885
danodonovan 24:5a2272a25ff1 886 *pnSamplesPerCycle = nSamplesPerCycle;
danodonovan 24:5a2272a25ff1 887
danodonovan 24:5a2272a25ff1 888 /* Assume DRDY_PER_CONVERSION behaviour in test mode */
danodonovan 24:5a2272a25ff1 889 if ((eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_HEALTHCHECK) ||
danodonovan 24:5a2272a25ff1 890 (modeReg.Drdy_Mode == ADISENSE_CORE_MODE_DRDY_PER_CONVERSION))
danodonovan 24:5a2272a25ff1 891 {
danodonovan 24:5a2272a25ff1 892 *pnSamplesPerDataready = 1;
danodonovan 24:5a2272a25ff1 893 }
danodonovan 24:5a2272a25ff1 894 else if (modeReg.Drdy_Mode == ADISENSE_CORE_MODE_DRDY_PER_CYCLE)
danodonovan 24:5a2272a25ff1 895 {
danodonovan 24:5a2272a25ff1 896 *pnSamplesPerDataready = nSamplesPerCycle;
danodonovan 24:5a2272a25ff1 897 }
danodonovan 24:5a2272a25ff1 898 else
danodonovan 24:5a2272a25ff1 899 {
danodonovan 24:5a2272a25ff1 900 ADI_ADISENSE_CORE_Fifo_Num_Cycles_t fifoNumCyclesReg;
danodonovan 24:5a2272a25ff1 901 READ_REG_U8(hDevice, fifoNumCyclesReg.VALUE8, CORE_FIFO_NUM_CYCLES);
danodonovan 24:5a2272a25ff1 902
danodonovan 24:5a2272a25ff1 903 *pnSamplesPerDataready =
danodonovan 24:5a2272a25ff1 904 nSamplesPerCycle * fifoNumCyclesReg.Fifo_Num_Cycles;
danodonovan 24:5a2272a25ff1 905 }
danodonovan 24:5a2272a25ff1 906
danodonovan 24:5a2272a25ff1 907 /* Assume SINGLECYCLE in test mode */
danodonovan 24:5a2272a25ff1 908 if ((eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_HEALTHCHECK) ||
danodonovan 24:5a2272a25ff1 909 (modeReg.Conversion_Mode == ADISENSE_CORE_MODE_SINGLECYCLE))
danodonovan 24:5a2272a25ff1 910 *peOperatingMode = ADI_SENSE_1000_OPERATING_MODE_SINGLECYCLE;
danodonovan 24:5a2272a25ff1 911 else if (modeReg.Conversion_Mode == ADISENSE_CORE_MODE_MULTICYCLE)
danodonovan 24:5a2272a25ff1 912 *peOperatingMode = ADI_SENSE_1000_OPERATING_MODE_MULTICYCLE;
danodonovan 24:5a2272a25ff1 913 else
danodonovan 24:5a2272a25ff1 914 *peOperatingMode = ADI_SENSE_1000_OPERATING_MODE_CONTINUOUS;
danodonovan 24:5a2272a25ff1 915
danodonovan 24:5a2272a25ff1 916 /* Assume DRDY_PER_CONVERSION behaviour in test mode */
danodonovan 24:5a2272a25ff1 917 if ((eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_HEALTHCHECK) ||
danodonovan 24:5a2272a25ff1 918 (modeReg.Drdy_Mode == ADISENSE_CORE_MODE_DRDY_PER_CONVERSION))
danodonovan 24:5a2272a25ff1 919 *peDataReadyMode = ADI_SENSE_1000_DATAREADY_PER_CONVERSION;
danodonovan 24:5a2272a25ff1 920 else if (modeReg.Drdy_Mode == ADISENSE_CORE_MODE_DRDY_PER_CYCLE)
danodonovan 24:5a2272a25ff1 921 *peDataReadyMode = ADI_SENSE_1000_DATAREADY_PER_CYCLE;
danodonovan 24:5a2272a25ff1 922 else
danodonovan 24:5a2272a25ff1 923 *peDataReadyMode = ADI_SENSE_1000_DATAREADY_PER_MULTICYCLE_BURST;
danodonovan 24:5a2272a25ff1 924
danodonovan 24:5a2272a25ff1 925 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 926 }
danodonovan 24:5a2272a25ff1 927
danodonovan 24:5a2272a25ff1 928 ADI_SENSE_RESULT adi_sense_GetProductID(
danodonovan 24:5a2272a25ff1 929 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 930 ADI_SENSE_PRODUCT_ID *pProductId)
danodonovan 24:5a2272a25ff1 931 {
danodonovan 24:5a2272a25ff1 932 ADI_ADISENSE_SPI_Product_ID_L_t productIdLoReg;
danodonovan 24:5a2272a25ff1 933 ADI_ADISENSE_SPI_Product_ID_H_t productIdHiReg;
danodonovan 24:5a2272a25ff1 934
danodonovan 24:5a2272a25ff1 935 READ_REG_U8(hDevice, productIdLoReg.VALUE8, SPI_PRODUCT_ID_L);
danodonovan 24:5a2272a25ff1 936 READ_REG_U8(hDevice, productIdHiReg.VALUE8, SPI_PRODUCT_ID_H);
danodonovan 24:5a2272a25ff1 937
danodonovan 24:5a2272a25ff1 938 *pProductId = (productIdHiReg.VALUE8 << 8) | productIdLoReg.VALUE8;
danodonovan 24:5a2272a25ff1 939 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 940 }
danodonovan 24:5a2272a25ff1 941
danodonovan 24:5a2272a25ff1 942 static ADI_SENSE_RESULT adi_sense_SetPowerMode(
danodonovan 24:5a2272a25ff1 943 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 944 ADI_SENSE_1000_POWER_MODE powerMode)
danodonovan 24:5a2272a25ff1 945 {
danodonovan 24:5a2272a25ff1 946 ADI_ADISENSE_CORE_Power_Config_t powerConfigReg;
danodonovan 24:5a2272a25ff1 947
danodonovan 24:5a2272a25ff1 948 if (powerMode == ADI_SENSE_1000_POWER_MODE_LOW)
danodonovan 24:5a2272a25ff1 949 {
danodonovan 24:5a2272a25ff1 950 powerConfigReg.Power_Mode_ADC = ADISENSE_CORE_POWER_CONFIG_ADC_LOW_POWER;
danodonovan 24:5a2272a25ff1 951 /* TODO - we need an enum in the register map for the MCU power modes */
danodonovan 24:5a2272a25ff1 952 powerConfigReg.Power_Mode_MCU = 0x0;
danodonovan 24:5a2272a25ff1 953 }
danodonovan 24:5a2272a25ff1 954 else if (powerMode == ADI_SENSE_1000_POWER_MODE_MID)
danodonovan 24:5a2272a25ff1 955 {
danodonovan 24:5a2272a25ff1 956 powerConfigReg.Power_Mode_ADC = ADISENSE_CORE_POWER_CONFIG_ADC_MID_POWER;
danodonovan 24:5a2272a25ff1 957 powerConfigReg.Power_Mode_MCU = 0x1;
danodonovan 24:5a2272a25ff1 958 }
danodonovan 24:5a2272a25ff1 959 else if (powerMode == ADI_SENSE_1000_POWER_MODE_FULL)
danodonovan 24:5a2272a25ff1 960 {
danodonovan 24:5a2272a25ff1 961 powerConfigReg.Power_Mode_ADC = ADISENSE_CORE_POWER_CONFIG_ADC_FULL_POWER;
danodonovan 24:5a2272a25ff1 962 powerConfigReg.Power_Mode_MCU = 0x2;
danodonovan 24:5a2272a25ff1 963 }
danodonovan 24:5a2272a25ff1 964 else
danodonovan 24:5a2272a25ff1 965 {
danodonovan 24:5a2272a25ff1 966 ADI_SENSE_LOG_ERROR("Invalid power mode %d specified", powerMode);
danodonovan 24:5a2272a25ff1 967 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 968 }
danodonovan 24:5a2272a25ff1 969
danodonovan 24:5a2272a25ff1 970 WRITE_REG_U8(hDevice, powerConfigReg.VALUE8, CORE_POWER_CONFIG);
danodonovan 24:5a2272a25ff1 971
danodonovan 24:5a2272a25ff1 972 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 973 }
danodonovan 24:5a2272a25ff1 974
danodonovan 24:5a2272a25ff1 975 static ADI_SENSE_RESULT adi_sense_SetVddVoltage(
danodonovan 24:5a2272a25ff1 976 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 977 float32_t vddVoltage)
danodonovan 24:5a2272a25ff1 978 {
danodonovan 24:5a2272a25ff1 979 WRITE_REG_FLOAT(hDevice, vddVoltage, CORE_AVDD_VOLTAGE);
danodonovan 24:5a2272a25ff1 980
danodonovan 24:5a2272a25ff1 981 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 982 }
danodonovan 24:5a2272a25ff1 983
danodonovan 24:5a2272a25ff1 984 ADI_SENSE_RESULT adi_sense_1000_SetPowerConfig(
danodonovan 24:5a2272a25ff1 985 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 986 ADI_SENSE_1000_POWER_CONFIG *pPowerConfig)
danodonovan 24:5a2272a25ff1 987 {
danodonovan 24:5a2272a25ff1 988 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 989
danodonovan 24:5a2272a25ff1 990 eRet = adi_sense_SetPowerMode(hDevice, pPowerConfig->powerMode);
danodonovan 24:5a2272a25ff1 991 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 992 {
danodonovan 24:5a2272a25ff1 993 ADI_SENSE_LOG_ERROR("Failed to set power mode");
danodonovan 24:5a2272a25ff1 994 return eRet;
danodonovan 24:5a2272a25ff1 995 }
danodonovan 24:5a2272a25ff1 996
danodonovan 24:5a2272a25ff1 997 eRet = adi_sense_SetVddVoltage(hDevice, pPowerConfig->supplyVoltage);
danodonovan 24:5a2272a25ff1 998 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 999 {
danodonovan 24:5a2272a25ff1 1000 ADI_SENSE_LOG_ERROR("Failed to set AVdd voltage");
danodonovan 24:5a2272a25ff1 1001 return eRet;
danodonovan 24:5a2272a25ff1 1002 }
danodonovan 24:5a2272a25ff1 1003
danodonovan 24:5a2272a25ff1 1004 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1005 }
danodonovan 24:5a2272a25ff1 1006
danodonovan 24:5a2272a25ff1 1007 static ADI_SENSE_RESULT adi_sense_SetMode(
danodonovan 24:5a2272a25ff1 1008 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1009 ADI_SENSE_1000_OPERATING_MODE eOperatingMode,
danodonovan 24:5a2272a25ff1 1010 ADI_SENSE_1000_DATAREADY_MODE eDataReadyMode)
danodonovan 24:5a2272a25ff1 1011 {
danodonovan 24:5a2272a25ff1 1012 ADI_ADISENSE_CORE_Mode_t modeReg;
danodonovan 24:5a2272a25ff1 1013
danodonovan 24:5a2272a25ff1 1014 modeReg.VALUE8 = REG_RESET_VAL(CORE_MODE);
danodonovan 24:5a2272a25ff1 1015
danodonovan 24:5a2272a25ff1 1016 if (eOperatingMode == ADI_SENSE_1000_OPERATING_MODE_SINGLECYCLE)
danodonovan 24:5a2272a25ff1 1017 {
danodonovan 24:5a2272a25ff1 1018 modeReg.Conversion_Mode = ADISENSE_CORE_MODE_SINGLECYCLE;
danodonovan 24:5a2272a25ff1 1019 }
danodonovan 24:5a2272a25ff1 1020 else if (eOperatingMode == ADI_SENSE_1000_OPERATING_MODE_CONTINUOUS)
danodonovan 24:5a2272a25ff1 1021 {
danodonovan 24:5a2272a25ff1 1022 modeReg.Conversion_Mode = ADISENSE_CORE_MODE_CONTINUOUS;
danodonovan 24:5a2272a25ff1 1023 }
danodonovan 24:5a2272a25ff1 1024 else if (eOperatingMode == ADI_SENSE_1000_OPERATING_MODE_MULTICYCLE)
danodonovan 24:5a2272a25ff1 1025 {
danodonovan 24:5a2272a25ff1 1026 modeReg.Conversion_Mode = ADISENSE_CORE_MODE_MULTICYCLE;
danodonovan 24:5a2272a25ff1 1027 }
danodonovan 24:5a2272a25ff1 1028 else
danodonovan 24:5a2272a25ff1 1029 {
danodonovan 24:5a2272a25ff1 1030 ADI_SENSE_LOG_ERROR("Invalid operating mode %d specified",
danodonovan 24:5a2272a25ff1 1031 eOperatingMode);
danodonovan 24:5a2272a25ff1 1032 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1033 }
danodonovan 24:5a2272a25ff1 1034
danodonovan 24:5a2272a25ff1 1035 if (eDataReadyMode == ADI_SENSE_1000_DATAREADY_PER_CONVERSION)
danodonovan 24:5a2272a25ff1 1036 {
danodonovan 24:5a2272a25ff1 1037 modeReg.Drdy_Mode = ADISENSE_CORE_MODE_DRDY_PER_CONVERSION;
danodonovan 24:5a2272a25ff1 1038 }
danodonovan 24:5a2272a25ff1 1039 else if (eDataReadyMode == ADI_SENSE_1000_DATAREADY_PER_CYCLE)
danodonovan 24:5a2272a25ff1 1040 {
danodonovan 24:5a2272a25ff1 1041 modeReg.Drdy_Mode = ADISENSE_CORE_MODE_DRDY_PER_CYCLE;
danodonovan 24:5a2272a25ff1 1042 }
danodonovan 24:5a2272a25ff1 1043 else if (eDataReadyMode == ADI_SENSE_1000_DATAREADY_PER_MULTICYCLE_BURST)
danodonovan 24:5a2272a25ff1 1044 {
danodonovan 24:5a2272a25ff1 1045 if (eOperatingMode != ADI_SENSE_1000_OPERATING_MODE_MULTICYCLE)
danodonovan 24:5a2272a25ff1 1046 {
danodonovan 24:5a2272a25ff1 1047 ADI_SENSE_LOG_ERROR(
danodonovan 24:5a2272a25ff1 1048 "Data-ready mode %d cannot be used with operating mode %d",
danodonovan 24:5a2272a25ff1 1049 eDataReadyMode, eOperatingMode);
danodonovan 24:5a2272a25ff1 1050 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1051 }
danodonovan 24:5a2272a25ff1 1052 else
danodonovan 24:5a2272a25ff1 1053 {
danodonovan 24:5a2272a25ff1 1054 modeReg.Drdy_Mode = ADISENSE_CORE_MODE_DRDY_PER_FIFO_FILL;
danodonovan 24:5a2272a25ff1 1055 }
danodonovan 24:5a2272a25ff1 1056 }
danodonovan 24:5a2272a25ff1 1057 else
danodonovan 24:5a2272a25ff1 1058 {
danodonovan 24:5a2272a25ff1 1059 ADI_SENSE_LOG_ERROR("Invalid data-ready mode %d specified", eDataReadyMode);
danodonovan 24:5a2272a25ff1 1060 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1061 }
danodonovan 24:5a2272a25ff1 1062
danodonovan 24:5a2272a25ff1 1063 WRITE_REG_U8(hDevice, modeReg.VALUE8, CORE_MODE);
danodonovan 24:5a2272a25ff1 1064
danodonovan 24:5a2272a25ff1 1065 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1066 }
danodonovan 24:5a2272a25ff1 1067
danodonovan 24:5a2272a25ff1 1068 ADI_SENSE_RESULT adi_sense_SetCycleInterval(
danodonovan 24:5a2272a25ff1 1069 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1070 uint32_t nCycleInterval)
danodonovan 24:5a2272a25ff1 1071 {
danodonovan 24:5a2272a25ff1 1072 ADI_ADISENSE_CORE_Cycle_Control_t cycleControlReg;
danodonovan 24:5a2272a25ff1 1073
danodonovan 24:5a2272a25ff1 1074 cycleControlReg.VALUE16 = REG_RESET_VAL(CORE_CYCLE_CONTROL);
danodonovan 24:5a2272a25ff1 1075
danodonovan 24:5a2272a25ff1 1076 if (nCycleInterval < (1 << 12))
danodonovan 24:5a2272a25ff1 1077 {
danodonovan 24:5a2272a25ff1 1078 cycleControlReg.Cycle_Time_Units = ADISENSE_CORE_CYCLE_CONTROL_MICROSECONDS;
danodonovan 24:5a2272a25ff1 1079 }
danodonovan 24:5a2272a25ff1 1080 else if (nCycleInterval < (1000 * (1 << 12)))
danodonovan 24:5a2272a25ff1 1081 {
danodonovan 24:5a2272a25ff1 1082 cycleControlReg.Cycle_Time_Units = ADISENSE_CORE_CYCLE_CONTROL_MILLISECONDS;
danodonovan 24:5a2272a25ff1 1083 nCycleInterval /= 1000;
danodonovan 24:5a2272a25ff1 1084 }
danodonovan 24:5a2272a25ff1 1085 else
danodonovan 24:5a2272a25ff1 1086 {
danodonovan 24:5a2272a25ff1 1087 cycleControlReg.Cycle_Time_Units = ADISENSE_CORE_CYCLE_CONTROL_SECONDS;
danodonovan 24:5a2272a25ff1 1088 nCycleInterval /= 1000000;
danodonovan 24:5a2272a25ff1 1089 }
danodonovan 24:5a2272a25ff1 1090
danodonovan 24:5a2272a25ff1 1091 CHECK_REG_FIELD_VAL(CORE_CYCLE_CONTROL_CYCLE_TIME, nCycleInterval);
danodonovan 24:5a2272a25ff1 1092 cycleControlReg.Cycle_Time = nCycleInterval;
danodonovan 24:5a2272a25ff1 1093
danodonovan 24:5a2272a25ff1 1094 WRITE_REG_U16(hDevice, cycleControlReg.VALUE16, CORE_CYCLE_CONTROL);
danodonovan 24:5a2272a25ff1 1095
danodonovan 24:5a2272a25ff1 1096 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1097 }
danodonovan 24:5a2272a25ff1 1098
danodonovan 24:5a2272a25ff1 1099 static ADI_SENSE_RESULT adi_sense_SetMultiCycleConfig(
danodonovan 24:5a2272a25ff1 1100 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1101 ADI_SENSE_1000_MULTICYCLE_CONFIG *pMultiCycleConfig)
danodonovan 24:5a2272a25ff1 1102 {
danodonovan 24:5a2272a25ff1 1103 CHECK_REG_FIELD_VAL(CORE_FIFO_NUM_CYCLES_FIFO_NUM_CYCLES,
danodonovan 24:5a2272a25ff1 1104 pMultiCycleConfig->cyclesPerBurst);
danodonovan 24:5a2272a25ff1 1105
danodonovan 24:5a2272a25ff1 1106 WRITE_REG_U8(hDevice, pMultiCycleConfig->cyclesPerBurst,
danodonovan 24:5a2272a25ff1 1107 CORE_FIFO_NUM_CYCLES);
danodonovan 24:5a2272a25ff1 1108
danodonovan 24:5a2272a25ff1 1109 WRITE_REG_U32(hDevice, pMultiCycleConfig->burstInterval,
danodonovan 24:5a2272a25ff1 1110 CORE_MULTI_CYCLE_REPEAT_INTERVAL);
danodonovan 24:5a2272a25ff1 1111
danodonovan 24:5a2272a25ff1 1112 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1113 }
danodonovan 24:5a2272a25ff1 1114
danodonovan 24:5a2272a25ff1 1115 static ADI_SENSE_RESULT adi_sense_SetExternalReferenceValues(
danodonovan 24:5a2272a25ff1 1116 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1117 float32_t externalRef1Value,
danodonovan 24:5a2272a25ff1 1118 float32_t externalRef2Value)
danodonovan 24:5a2272a25ff1 1119 {
danodonovan 24:5a2272a25ff1 1120 WRITE_REG_FLOAT(hDevice, externalRef1Value, CORE_EXTERNAL_REFERENCE1);
danodonovan 24:5a2272a25ff1 1121 WRITE_REG_FLOAT(hDevice, externalRef2Value, CORE_EXTERNAL_REFERENCE2);
danodonovan 24:5a2272a25ff1 1122
danodonovan 24:5a2272a25ff1 1123 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1124 }
danodonovan 24:5a2272a25ff1 1125
danodonovan 24:5a2272a25ff1 1126 ADI_SENSE_RESULT adi_sense_1000_SetMeasurementConfig(
danodonovan 24:5a2272a25ff1 1127 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1128 ADI_SENSE_1000_MEASUREMENT_CONFIG *pMeasConfig)
danodonovan 24:5a2272a25ff1 1129 {
danodonovan 24:5a2272a25ff1 1130 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 1131
danodonovan 24:5a2272a25ff1 1132 eRet = adi_sense_SetMode(hDevice,
danodonovan 24:5a2272a25ff1 1133 pMeasConfig->operatingMode,
danodonovan 24:5a2272a25ff1 1134 pMeasConfig->dataReadyMode);
danodonovan 24:5a2272a25ff1 1135 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1136 {
danodonovan 24:5a2272a25ff1 1137 ADI_SENSE_LOG_ERROR("Failed to set operating mode");
danodonovan 24:5a2272a25ff1 1138 return eRet;
danodonovan 24:5a2272a25ff1 1139 }
danodonovan 24:5a2272a25ff1 1140
danodonovan 24:5a2272a25ff1 1141 if (pMeasConfig->operatingMode != ADI_SENSE_1000_OPERATING_MODE_SINGLECYCLE)
danodonovan 24:5a2272a25ff1 1142 {
danodonovan 24:5a2272a25ff1 1143 eRet = adi_sense_SetCycleInterval(hDevice, pMeasConfig->cycleInterval);
danodonovan 24:5a2272a25ff1 1144 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1145 {
danodonovan 24:5a2272a25ff1 1146 ADI_SENSE_LOG_ERROR("Failed to set cycle interval");
danodonovan 24:5a2272a25ff1 1147 return eRet;
danodonovan 24:5a2272a25ff1 1148 }
danodonovan 24:5a2272a25ff1 1149 }
danodonovan 24:5a2272a25ff1 1150
danodonovan 24:5a2272a25ff1 1151 if (pMeasConfig->operatingMode == ADI_SENSE_1000_OPERATING_MODE_MULTICYCLE)
danodonovan 24:5a2272a25ff1 1152 {
danodonovan 24:5a2272a25ff1 1153 eRet = adi_sense_SetMultiCycleConfig(hDevice,
danodonovan 24:5a2272a25ff1 1154 &pMeasConfig->multiCycleConfig);
danodonovan 24:5a2272a25ff1 1155 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1156 {
danodonovan 24:5a2272a25ff1 1157 ADI_SENSE_LOG_ERROR("Failed to set multi-cycle configuration");
danodonovan 24:5a2272a25ff1 1158 return eRet;
danodonovan 24:5a2272a25ff1 1159 }
danodonovan 24:5a2272a25ff1 1160 }
danodonovan 24:5a2272a25ff1 1161
danodonovan 24:5a2272a25ff1 1162 eRet = adi_sense_SetExternalReferenceValues(hDevice,
danodonovan 24:5a2272a25ff1 1163 pMeasConfig->externalRef1Value,
danodonovan 24:5a2272a25ff1 1164 pMeasConfig->externalRef2Value);
danodonovan 24:5a2272a25ff1 1165 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1166 {
danodonovan 24:5a2272a25ff1 1167 ADI_SENSE_LOG_ERROR("Failed to set external reference values");
danodonovan 24:5a2272a25ff1 1168 return eRet;
danodonovan 24:5a2272a25ff1 1169 }
danodonovan 24:5a2272a25ff1 1170
danodonovan 24:5a2272a25ff1 1171 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1172 }
danodonovan 24:5a2272a25ff1 1173
danodonovan 24:5a2272a25ff1 1174 ADI_SENSE_RESULT adi_sense_1000_SetDiagnosticsConfig(
danodonovan 24:5a2272a25ff1 1175 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1176 ADI_SENSE_1000_DIAGNOSTICS_CONFIG *pDiagnosticsConfig)
danodonovan 24:5a2272a25ff1 1177 {
danodonovan 24:5a2272a25ff1 1178 ADI_ADISENSE_CORE_Diagnostics_Control_t diagnosticsControlReg;
danodonovan 24:5a2272a25ff1 1179
danodonovan 24:5a2272a25ff1 1180 diagnosticsControlReg.VALUE16 = REG_RESET_VAL(CORE_DIAGNOSTICS_CONTROL);
danodonovan 24:5a2272a25ff1 1181
danodonovan 24:5a2272a25ff1 1182 if (pDiagnosticsConfig->disableGlobalDiag)
danodonovan 24:5a2272a25ff1 1183 diagnosticsControlReg.Diag_Global_En = 0;
danodonovan 24:5a2272a25ff1 1184 else
danodonovan 24:5a2272a25ff1 1185 diagnosticsControlReg.Diag_Global_En = 1;
danodonovan 24:5a2272a25ff1 1186
danodonovan 24:5a2272a25ff1 1187 if (pDiagnosticsConfig->disableMeasurementDiag)
danodonovan 24:5a2272a25ff1 1188 diagnosticsControlReg.Diag_Meas_En = 0;
danodonovan 24:5a2272a25ff1 1189 else
danodonovan 24:5a2272a25ff1 1190 diagnosticsControlReg.Diag_Meas_En = 1;
danodonovan 24:5a2272a25ff1 1191
danodonovan 24:5a2272a25ff1 1192 switch (pDiagnosticsConfig->osdFrequency)
danodonovan 24:5a2272a25ff1 1193 {
danodonovan 24:5a2272a25ff1 1194 case ADI_SENSE_1000_OPEN_SENSOR_DIAGNOSTICS_DISABLED:
danodonovan 24:5a2272a25ff1 1195 diagnosticsControlReg.Diag_OSD_Freq = ADISENSE_CORE_DIAGNOSTICS_CONTROL_OCD_OFF;
danodonovan 24:5a2272a25ff1 1196 break;
danodonovan 24:5a2272a25ff1 1197 case ADI_SENSE_1000_OPEN_SENSOR_DIAGNOSTICS_PER_CYCLE:
danodonovan 24:5a2272a25ff1 1198 diagnosticsControlReg.Diag_OSD_Freq = ADISENSE_CORE_DIAGNOSTICS_CONTROL_OCD_PER_1_CYCLE;
danodonovan 24:5a2272a25ff1 1199 break;
danodonovan 24:5a2272a25ff1 1200 case ADI_SENSE_1000_OPEN_SENSOR_DIAGNOSTICS_PER_100_CYCLES:
danodonovan 24:5a2272a25ff1 1201 diagnosticsControlReg.Diag_OSD_Freq = ADISENSE_CORE_DIAGNOSTICS_CONTROL_OCD_PER_100_CYCLES;
danodonovan 24:5a2272a25ff1 1202 break;
danodonovan 24:5a2272a25ff1 1203 case ADI_SENSE_1000_OPEN_SENSOR_DIAGNOSTICS_PER_1000_CYCLES:
danodonovan 24:5a2272a25ff1 1204 diagnosticsControlReg.Diag_OSD_Freq = ADISENSE_CORE_DIAGNOSTICS_CONTROL_OCD_PER_1000_CYCLES;
danodonovan 24:5a2272a25ff1 1205 break;
danodonovan 24:5a2272a25ff1 1206 default:
danodonovan 24:5a2272a25ff1 1207 ADI_SENSE_LOG_ERROR("Invalid open-sensor diagnostic frequency %d specified",
danodonovan 24:5a2272a25ff1 1208 pDiagnosticsConfig->osdFrequency);
danodonovan 24:5a2272a25ff1 1209 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1210 }
danodonovan 24:5a2272a25ff1 1211
danodonovan 24:5a2272a25ff1 1212 WRITE_REG_U16(hDevice, diagnosticsControlReg.VALUE16, CORE_DIAGNOSTICS_CONTROL);
danodonovan 24:5a2272a25ff1 1213
danodonovan 24:5a2272a25ff1 1214 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1215 }
danodonovan 24:5a2272a25ff1 1216
danodonovan 24:5a2272a25ff1 1217 ADI_SENSE_RESULT adi_sense_1000_SetChannelCount(
danodonovan 24:5a2272a25ff1 1218 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1219 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1220 uint32_t nMeasurementsPerCycle)
danodonovan 24:5a2272a25ff1 1221 {
danodonovan 24:5a2272a25ff1 1222 ADI_ADISENSE_CORE_Channel_Count_t channelCountReg;
danodonovan 24:5a2272a25ff1 1223
danodonovan 24:5a2272a25ff1 1224 channelCountReg.VALUE8 = REG_RESET_VAL(CORE_CHANNEL_COUNTn);
danodonovan 24:5a2272a25ff1 1225
danodonovan 24:5a2272a25ff1 1226 if (nMeasurementsPerCycle > 0)
danodonovan 24:5a2272a25ff1 1227 {
danodonovan 24:5a2272a25ff1 1228 nMeasurementsPerCycle -= 1;
danodonovan 24:5a2272a25ff1 1229
danodonovan 24:5a2272a25ff1 1230 CHECK_REG_FIELD_VAL(CORE_CHANNEL_COUNT_CHANNEL_COUNT,
danodonovan 24:5a2272a25ff1 1231 nMeasurementsPerCycle);
danodonovan 24:5a2272a25ff1 1232
danodonovan 24:5a2272a25ff1 1233 channelCountReg.Channel_Enable = 1;
danodonovan 24:5a2272a25ff1 1234 channelCountReg.Channel_Count = nMeasurementsPerCycle;
danodonovan 24:5a2272a25ff1 1235 }
danodonovan 24:5a2272a25ff1 1236 else
danodonovan 24:5a2272a25ff1 1237 {
danodonovan 24:5a2272a25ff1 1238 channelCountReg.Channel_Enable = 0;
danodonovan 24:5a2272a25ff1 1239 }
danodonovan 24:5a2272a25ff1 1240
danodonovan 24:5a2272a25ff1 1241 WRITE_REG_U8(hDevice, channelCountReg.VALUE8, CORE_CHANNEL_COUNTn(eChannelId));
danodonovan 24:5a2272a25ff1 1242
danodonovan 24:5a2272a25ff1 1243 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1244 }
danodonovan 24:5a2272a25ff1 1245
danodonovan 24:5a2272a25ff1 1246 static ADI_SENSE_RESULT adi_sense_SetChannelAdcSensorType(
danodonovan 24:5a2272a25ff1 1247 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1248 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1249 ADI_SENSE_1000_ADC_SENSOR_TYPE sensorType)
danodonovan 24:5a2272a25ff1 1250 {
danodonovan 24:5a2272a25ff1 1251 ADI_ADISENSE_CORE_Sensor_Type_t sensorTypeReg;
danodonovan 24:5a2272a25ff1 1252
danodonovan 24:5a2272a25ff1 1253 sensorTypeReg.VALUE16 = REG_RESET_VAL(CORE_SENSOR_TYPEn);
danodonovan 24:5a2272a25ff1 1254
danodonovan 24:5a2272a25ff1 1255 /* Ensure that the sensor type is valid for this channel */
danodonovan 24:5a2272a25ff1 1256 switch(sensorType)
danodonovan 24:5a2272a25ff1 1257 {
danodonovan 24:5a2272a25ff1 1258 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_J_DEF_L1:
danodonovan 24:5a2272a25ff1 1259 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_K_DEF_L1:
danodonovan 24:5a2272a25ff1 1260 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_T_DEF_L1:
danodonovan 24:5a2272a25ff1 1261 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_1_DEF_L2:
danodonovan 24:5a2272a25ff1 1262 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_2_DEF_L2:
danodonovan 24:5a2272a25ff1 1263 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_3_DEF_L2:
danodonovan 24:5a2272a25ff1 1264 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_4_DEF_L2:
danodonovan 24:5a2272a25ff1 1265 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_J_ADV_L1:
danodonovan 24:5a2272a25ff1 1266 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_K_ADV_L1:
danodonovan 24:5a2272a25ff1 1267 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_T_ADV_L1:
danodonovan 24:5a2272a25ff1 1268 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_1_ADV_L2:
danodonovan 24:5a2272a25ff1 1269 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_2_ADV_L2:
danodonovan 24:5a2272a25ff1 1270 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_3_ADV_L2:
danodonovan 24:5a2272a25ff1 1271 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_4_ADV_L2:
danodonovan 24:5a2272a25ff1 1272 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_PT100_DEF_L1:
danodonovan 24:5a2272a25ff1 1273 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_PT1000_DEF_L1:
danodonovan 24:5a2272a25ff1 1274 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_1_DEF_L2:
danodonovan 24:5a2272a25ff1 1275 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_2_DEF_L2:
danodonovan 24:5a2272a25ff1 1276 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_3_DEF_L2:
danodonovan 24:5a2272a25ff1 1277 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_4_DEF_L2:
danodonovan 24:5a2272a25ff1 1278 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_PT100_ADV_L1:
danodonovan 24:5a2272a25ff1 1279 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_PT1000_ADV_L1:
danodonovan 24:5a2272a25ff1 1280 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_1_ADV_L2:
danodonovan 24:5a2272a25ff1 1281 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_2_ADV_L2:
danodonovan 24:5a2272a25ff1 1282 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_3_ADV_L2:
danodonovan 24:5a2272a25ff1 1283 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_4_ADV_L2:
danodonovan 24:5a2272a25ff1 1284 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_PT100_DEF_L1:
danodonovan 24:5a2272a25ff1 1285 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_PT1000_DEF_L1:
danodonovan 24:5a2272a25ff1 1286 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_1_DEF_L2:
danodonovan 24:5a2272a25ff1 1287 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_2_DEF_L2:
danodonovan 24:5a2272a25ff1 1288 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_3_DEF_L2:
danodonovan 24:5a2272a25ff1 1289 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_4_DEF_L2:
danodonovan 24:5a2272a25ff1 1290 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_PT100_ADV_L1:
danodonovan 24:5a2272a25ff1 1291 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_PT1000_ADV_L1:
danodonovan 24:5a2272a25ff1 1292 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_1_ADV_L2:
danodonovan 24:5a2272a25ff1 1293 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_2_ADV_L2:
danodonovan 24:5a2272a25ff1 1294 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_3_ADV_L2:
danodonovan 24:5a2272a25ff1 1295 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_4_ADV_L2:
danodonovan 24:5a2272a25ff1 1296 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_1_DEF_L2:
danodonovan 24:5a2272a25ff1 1297 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_2_DEF_L2:
danodonovan 24:5a2272a25ff1 1298 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_3_DEF_L2:
danodonovan 24:5a2272a25ff1 1299 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_4_DEF_L2:
danodonovan 24:5a2272a25ff1 1300 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_1_ADV_L2:
danodonovan 24:5a2272a25ff1 1301 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_2_ADV_L2:
danodonovan 24:5a2272a25ff1 1302 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_3_ADV_L2:
danodonovan 24:5a2272a25ff1 1303 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_4_ADV_L2:
danodonovan 24:5a2272a25ff1 1304 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_1_DEF_L2:
danodonovan 24:5a2272a25ff1 1305 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_2_DEF_L2:
danodonovan 24:5a2272a25ff1 1306 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_3_DEF_L2:
danodonovan 24:5a2272a25ff1 1307 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_4_DEF_L2:
danodonovan 24:5a2272a25ff1 1308 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_1_ADV_L2:
danodonovan 24:5a2272a25ff1 1309 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_2_ADV_L2:
danodonovan 24:5a2272a25ff1 1310 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_3_ADV_L2:
danodonovan 24:5a2272a25ff1 1311 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_4_ADV_L2:
danodonovan 24:5a2272a25ff1 1312 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_A_10K_DEF_L1:
danodonovan 24:5a2272a25ff1 1313 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_B_10K_DEF_L1:
danodonovan 24:5a2272a25ff1 1314 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_1_DEF_L2:
danodonovan 24:5a2272a25ff1 1315 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_2_DEF_L2:
danodonovan 24:5a2272a25ff1 1316 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_3_DEF_L2:
danodonovan 24:5a2272a25ff1 1317 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_4_DEF_L2:
danodonovan 24:5a2272a25ff1 1318 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_A_10K_ADV_L1:
danodonovan 24:5a2272a25ff1 1319 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_B_10K_ADV_L1:
danodonovan 24:5a2272a25ff1 1320 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_1_ADV_L2:
danodonovan 24:5a2272a25ff1 1321 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_2_ADV_L2:
danodonovan 24:5a2272a25ff1 1322 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_3_ADV_L2:
danodonovan 24:5a2272a25ff1 1323 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_4_ADV_L2:
danodonovan 24:5a2272a25ff1 1324 if (! ADI_SENSE_1000_CHANNEL_IS_ADC_SENSOR(eChannelId))
danodonovan 24:5a2272a25ff1 1325 {
danodonovan 24:5a2272a25ff1 1326 ADI_SENSE_LOG_ERROR(
danodonovan 24:5a2272a25ff1 1327 "Invalid ADC sensor type %d specified for channel %d",
danodonovan 24:5a2272a25ff1 1328 sensorType, eChannelId);
danodonovan 24:5a2272a25ff1 1329 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1330 }
danodonovan 24:5a2272a25ff1 1331 break;
danodonovan 24:5a2272a25ff1 1332 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_PT100_DEF_L1:
danodonovan 24:5a2272a25ff1 1333 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_PT1000_DEF_L1:
danodonovan 24:5a2272a25ff1 1334 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_1_DEF_L2:
danodonovan 24:5a2272a25ff1 1335 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_2_DEF_L2:
danodonovan 24:5a2272a25ff1 1336 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_3_DEF_L2:
danodonovan 24:5a2272a25ff1 1337 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_4_DEF_L2:
danodonovan 24:5a2272a25ff1 1338 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_PT100_ADV_L1:
danodonovan 24:5a2272a25ff1 1339 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_PT1000_ADV_L1:
danodonovan 24:5a2272a25ff1 1340 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_1_ADV_L2:
danodonovan 24:5a2272a25ff1 1341 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_2_ADV_L2:
danodonovan 24:5a2272a25ff1 1342 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_3_ADV_L2:
danodonovan 24:5a2272a25ff1 1343 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_4_ADV_L2:
danodonovan 24:5a2272a25ff1 1344 if (! (ADI_SENSE_1000_CHANNEL_IS_ADC_SENSOR(eChannelId) ||
danodonovan 24:5a2272a25ff1 1345 ADI_SENSE_1000_CHANNEL_IS_ADC_CJC(eChannelId)))
danodonovan 24:5a2272a25ff1 1346 {
danodonovan 24:5a2272a25ff1 1347 ADI_SENSE_LOG_ERROR(
danodonovan 24:5a2272a25ff1 1348 "Invalid ADC sensor type %d specified for channel %d",
danodonovan 24:5a2272a25ff1 1349 sensorType, eChannelId);
danodonovan 24:5a2272a25ff1 1350 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1351 }
danodonovan 24:5a2272a25ff1 1352 break;
danodonovan 24:5a2272a25ff1 1353 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE:
danodonovan 24:5a2272a25ff1 1354 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_HONEYWELL_TRUSTABILITY:
danodonovan 24:5a2272a25ff1 1355 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_AMPHENOL_NPA300X:
danodonovan 24:5a2272a25ff1 1356 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_3_DEF:
danodonovan 24:5a2272a25ff1 1357 if (! ADI_SENSE_1000_CHANNEL_IS_ADC_VOLTAGE(eChannelId))
danodonovan 24:5a2272a25ff1 1358 {
danodonovan 24:5a2272a25ff1 1359 ADI_SENSE_LOG_ERROR(
danodonovan 24:5a2272a25ff1 1360 "Invalid ADC sensor type %d specified for channel %d",
danodonovan 24:5a2272a25ff1 1361 sensorType, eChannelId);
danodonovan 24:5a2272a25ff1 1362 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1363 }
danodonovan 24:5a2272a25ff1 1364 break;
danodonovan 24:5a2272a25ff1 1365 case ADI_SENSE_1000_ADC_SENSOR_CURRENT:
danodonovan 24:5a2272a25ff1 1366 case ADI_SENSE_1000_ADC_SENSOR_CURRENT_PRESSURE_HONEYWELL_PX2:
danodonovan 24:5a2272a25ff1 1367 case ADI_SENSE_1000_ADC_SENSOR_CURRENT_PRESSURE_2_DEF:
danodonovan 24:5a2272a25ff1 1368 if (! ADI_SENSE_1000_CHANNEL_IS_ADC_CURRENT(eChannelId))
danodonovan 24:5a2272a25ff1 1369 {
danodonovan 24:5a2272a25ff1 1370 ADI_SENSE_LOG_ERROR(
danodonovan 24:5a2272a25ff1 1371 "Invalid ADC sensor type %d specified for channel %d",
danodonovan 24:5a2272a25ff1 1372 sensorType, eChannelId);
danodonovan 24:5a2272a25ff1 1373 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1374 }
danodonovan 24:5a2272a25ff1 1375 break;
danodonovan 24:5a2272a25ff1 1376 default:
danodonovan 24:5a2272a25ff1 1377 ADI_SENSE_LOG_ERROR("Invalid/unsupported ADC sensor type %d specified",
danodonovan 24:5a2272a25ff1 1378 sensorType);
danodonovan 24:5a2272a25ff1 1379 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1380 }
danodonovan 24:5a2272a25ff1 1381
danodonovan 24:5a2272a25ff1 1382 sensorTypeReg.Sensor_Type = sensorType;
danodonovan 24:5a2272a25ff1 1383
danodonovan 24:5a2272a25ff1 1384 WRITE_REG_U16(hDevice, sensorTypeReg.VALUE16, CORE_SENSOR_TYPEn(eChannelId));
danodonovan 24:5a2272a25ff1 1385
danodonovan 24:5a2272a25ff1 1386 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1387 }
danodonovan 24:5a2272a25ff1 1388
danodonovan 24:5a2272a25ff1 1389 static ADI_SENSE_RESULT adi_sense_SetChannelAdcSensorDetails(
danodonovan 24:5a2272a25ff1 1390 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1391 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1392 ADI_SENSE_1000_CHANNEL_CONFIG *pChannelConfig)
danodonovan 24:5a2272a25ff1 1393 /*
danodonovan 24:5a2272a25ff1 1394 * TODO - it would be nice if the general- vs. ADC-specific sensor details could be split into separate registers
danodonovan 24:5a2272a25ff1 1395 * General details:
danodonovan 24:5a2272a25ff1 1396 * - Measurement_Units
danodonovan 24:5a2272a25ff1 1397 * - Compensation_Channel
danodonovan 24:5a2272a25ff1 1398 * - CJC_Publish (if "CJC" was removed from the name)
danodonovan 24:5a2272a25ff1 1399 * ADC-specific details:
danodonovan 24:5a2272a25ff1 1400 * - PGA_Gain
danodonovan 24:5a2272a25ff1 1401 * - Reference_Select
danodonovan 24:5a2272a25ff1 1402 * - Reference_Buffer_Disable
danodonovan 24:5a2272a25ff1 1403 * - Vbias
danodonovan 24:5a2272a25ff1 1404 */
danodonovan 24:5a2272a25ff1 1405 {
danodonovan 24:5a2272a25ff1 1406 ADI_SENSE_1000_ADC_CHANNEL_CONFIG *pAdcChannelConfig = &pChannelConfig->adcChannelConfig;
danodonovan 24:5a2272a25ff1 1407 ADI_SENSE_1000_ADC_REFERENCE_CONFIG *pRefConfig = &pAdcChannelConfig->reference;
danodonovan 24:5a2272a25ff1 1408 ADI_ADISENSE_CORE_Sensor_Details_t sensorDetailsReg;
danodonovan 24:5a2272a25ff1 1409
danodonovan 24:5a2272a25ff1 1410 sensorDetailsReg.VALUE32 = REG_RESET_VAL(CORE_SENSOR_DETAILSn);
danodonovan 24:5a2272a25ff1 1411
danodonovan 24:5a2272a25ff1 1412 switch(pChannelConfig->measurementUnit)
danodonovan 24:5a2272a25ff1 1413 {
danodonovan 24:5a2272a25ff1 1414 case ADI_SENSE_1000_MEASUREMENT_UNIT_FAHRENHEIT:
danodonovan 24:5a2272a25ff1 1415 sensorDetailsReg.Measurement_Units = ADISENSE_CORE_SENSOR_DETAILS_UNITS_DEGF;
danodonovan 24:5a2272a25ff1 1416 break;
danodonovan 24:5a2272a25ff1 1417 case ADI_SENSE_1000_MEASUREMENT_UNIT_CELSIUS:
danodonovan 24:5a2272a25ff1 1418 case ADI_SENSE_1000_MEASUREMENT_UNIT_DEFAULT:
danodonovan 24:5a2272a25ff1 1419 sensorDetailsReg.Measurement_Units = ADISENSE_CORE_SENSOR_DETAILS_UNITS_DEGC;
danodonovan 24:5a2272a25ff1 1420 break;
danodonovan 24:5a2272a25ff1 1421 default:
danodonovan 24:5a2272a25ff1 1422 ADI_SENSE_LOG_ERROR("Invalid measurement unit %d specified",
danodonovan 24:5a2272a25ff1 1423 pChannelConfig->measurementUnit);
danodonovan 24:5a2272a25ff1 1424 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1425 }
danodonovan 24:5a2272a25ff1 1426
danodonovan 24:5a2272a25ff1 1427 sensorDetailsReg.Compensation_Channel = pChannelConfig->compensationChannel;
danodonovan 24:5a2272a25ff1 1428
danodonovan 24:5a2272a25ff1 1429 switch(pRefConfig->type)
danodonovan 24:5a2272a25ff1 1430 {
danodonovan 24:5a2272a25ff1 1431 case ADI_SENSE_1000_ADC_REFERENCE_RESISTOR_INTERNAL_1:
danodonovan 24:5a2272a25ff1 1432 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_RINT1;
danodonovan 24:5a2272a25ff1 1433 break;
danodonovan 24:5a2272a25ff1 1434 case ADI_SENSE_1000_ADC_REFERENCE_RESISTOR_INTERNAL_2:
danodonovan 24:5a2272a25ff1 1435 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_RINT2;
danodonovan 24:5a2272a25ff1 1436 break;
danodonovan 24:5a2272a25ff1 1437 case ADI_SENSE_1000_ADC_REFERENCE_VOLTAGE_INTERNAL:
danodonovan 24:5a2272a25ff1 1438 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_INT;
danodonovan 24:5a2272a25ff1 1439 break;
danodonovan 24:5a2272a25ff1 1440 case ADI_SENSE_1000_ADC_REFERENCE_VOLTAGE_AVDD:
danodonovan 24:5a2272a25ff1 1441 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_AVDD;
danodonovan 24:5a2272a25ff1 1442 break;
danodonovan 24:5a2272a25ff1 1443 case ADI_SENSE_1000_ADC_REFERENCE_RESISTOR_EXTERNAL_1:
danodonovan 24:5a2272a25ff1 1444 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_REXT1;
danodonovan 24:5a2272a25ff1 1445 break;
danodonovan 24:5a2272a25ff1 1446 case ADI_SENSE_1000_ADC_REFERENCE_RESISTOR_EXTERNAL_2:
danodonovan 24:5a2272a25ff1 1447 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_REXT2;
danodonovan 24:5a2272a25ff1 1448 break;
danodonovan 24:5a2272a25ff1 1449 case ADI_SENSE_1000_ADC_REFERENCE_VOLTAGE_EXTERNAL_1:
danodonovan 24:5a2272a25ff1 1450 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_VEXT1;
danodonovan 24:5a2272a25ff1 1451 break;
danodonovan 24:5a2272a25ff1 1452 case ADI_SENSE_1000_ADC_REFERENCE_VOLTAGE_EXTERNAL_2:
danodonovan 24:5a2272a25ff1 1453 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_VEXT2;
danodonovan 24:5a2272a25ff1 1454 break;
danodonovan 24:5a2272a25ff1 1455 case ADI_SENSE_1000_ADC_REFERENCE_BRIDGE_EXCITATION:
danodonovan 24:5a2272a25ff1 1456 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_EXC;
danodonovan 24:5a2272a25ff1 1457 break;
danodonovan 24:5a2272a25ff1 1458 default:
danodonovan 24:5a2272a25ff1 1459 ADI_SENSE_LOG_ERROR("Invalid ADC reference type %d specified",
danodonovan 24:5a2272a25ff1 1460 pRefConfig->type);
danodonovan 24:5a2272a25ff1 1461 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1462 }
danodonovan 24:5a2272a25ff1 1463
danodonovan 24:5a2272a25ff1 1464 switch(pAdcChannelConfig->gain)
danodonovan 24:5a2272a25ff1 1465 {
danodonovan 24:5a2272a25ff1 1466 case ADI_SENSE_1000_ADC_GAIN_1X:
danodonovan 24:5a2272a25ff1 1467 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_1;
danodonovan 24:5a2272a25ff1 1468 break;
danodonovan 24:5a2272a25ff1 1469 case ADI_SENSE_1000_ADC_GAIN_2X:
danodonovan 24:5a2272a25ff1 1470 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_2;
danodonovan 24:5a2272a25ff1 1471 break;
danodonovan 24:5a2272a25ff1 1472 case ADI_SENSE_1000_ADC_GAIN_4X:
danodonovan 24:5a2272a25ff1 1473 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_4;
danodonovan 24:5a2272a25ff1 1474 break;
danodonovan 24:5a2272a25ff1 1475 case ADI_SENSE_1000_ADC_GAIN_8X:
danodonovan 24:5a2272a25ff1 1476 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_8;
danodonovan 24:5a2272a25ff1 1477 break;
danodonovan 24:5a2272a25ff1 1478 case ADI_SENSE_1000_ADC_GAIN_16X:
danodonovan 24:5a2272a25ff1 1479 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_16;
danodonovan 24:5a2272a25ff1 1480 break;
danodonovan 24:5a2272a25ff1 1481 case ADI_SENSE_1000_ADC_GAIN_32X:
danodonovan 24:5a2272a25ff1 1482 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_32;
danodonovan 24:5a2272a25ff1 1483 break;
danodonovan 24:5a2272a25ff1 1484 case ADI_SENSE_1000_ADC_GAIN_64X:
danodonovan 24:5a2272a25ff1 1485 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_64;
danodonovan 24:5a2272a25ff1 1486 break;
danodonovan 24:5a2272a25ff1 1487 case ADI_SENSE_1000_ADC_GAIN_128X:
danodonovan 24:5a2272a25ff1 1488 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_128;
danodonovan 24:5a2272a25ff1 1489 break;
danodonovan 24:5a2272a25ff1 1490 default:
danodonovan 24:5a2272a25ff1 1491 ADI_SENSE_LOG_ERROR("Invalid ADC gain %d specified",
danodonovan 24:5a2272a25ff1 1492 pAdcChannelConfig->gain);
danodonovan 24:5a2272a25ff1 1493 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1494 }
danodonovan 24:5a2272a25ff1 1495
danodonovan 24:5a2272a25ff1 1496 if (pAdcChannelConfig->enableVbias)
danodonovan 24:5a2272a25ff1 1497 sensorDetailsReg.Vbias = 1;
danodonovan 24:5a2272a25ff1 1498 else
danodonovan 24:5a2272a25ff1 1499 sensorDetailsReg.Vbias = 0;
danodonovan 24:5a2272a25ff1 1500
danodonovan 24:5a2272a25ff1 1501 if (pAdcChannelConfig->reference.disableBuffer)
danodonovan 24:5a2272a25ff1 1502 sensorDetailsReg.Reference_Buffer_Disable = 1;
danodonovan 24:5a2272a25ff1 1503 else
danodonovan 24:5a2272a25ff1 1504 sensorDetailsReg.Reference_Buffer_Disable = 0;
danodonovan 24:5a2272a25ff1 1505
danodonovan 24:5a2272a25ff1 1506 if (pChannelConfig->disablePublishing)
danodonovan 24:5a2272a25ff1 1507 sensorDetailsReg.Do_Not_Publish = 1;
danodonovan 24:5a2272a25ff1 1508 else
danodonovan 24:5a2272a25ff1 1509 sensorDetailsReg.Do_Not_Publish = 0;
danodonovan 24:5a2272a25ff1 1510
danodonovan 24:5a2272a25ff1 1511 WRITE_REG_U32(hDevice, sensorDetailsReg.VALUE32, CORE_SENSOR_DETAILSn(eChannelId));
danodonovan 24:5a2272a25ff1 1512
danodonovan 24:5a2272a25ff1 1513 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1514 }
danodonovan 24:5a2272a25ff1 1515
danodonovan 24:5a2272a25ff1 1516 static ADI_SENSE_RESULT adi_sense_SetChannelAdcFilter(
danodonovan 24:5a2272a25ff1 1517 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1518 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1519 ADI_SENSE_1000_ADC_FILTER_CONFIG *pFilterConfig)
danodonovan 24:5a2272a25ff1 1520 {
danodonovan 24:5a2272a25ff1 1521 ADI_ADISENSE_CORE_Filter_Select_t filterSelectReg;
danodonovan 24:5a2272a25ff1 1522
danodonovan 24:5a2272a25ff1 1523 filterSelectReg.VALUE32 = REG_RESET_VAL(CORE_FILTER_SELECTn);
danodonovan 24:5a2272a25ff1 1524
danodonovan 24:5a2272a25ff1 1525 if (pFilterConfig->type == ADI_SENSE_1000_ADC_FILTER_SINC4)
danodonovan 24:5a2272a25ff1 1526 {
danodonovan 24:5a2272a25ff1 1527 filterSelectReg.ADC_Filter_Type = ADISENSE_CORE_FILTER_SELECT_FILTER_SINC4;
danodonovan 24:5a2272a25ff1 1528 filterSelectReg.ADC_FS = pFilterConfig->fs;
danodonovan 24:5a2272a25ff1 1529 }
danodonovan 24:5a2272a25ff1 1530 else if (pFilterConfig->type == ADI_SENSE_1000_ADC_FILTER_FIR_20SPS)
danodonovan 24:5a2272a25ff1 1531 {
danodonovan 24:5a2272a25ff1 1532 filterSelectReg.ADC_Filter_Type = ADISENSE_CORE_FILTER_SELECT_FILTER_FIR_20SPS;
danodonovan 24:5a2272a25ff1 1533 }
danodonovan 24:5a2272a25ff1 1534 else if (pFilterConfig->type == ADI_SENSE_1000_ADC_FILTER_FIR_25SPS)
danodonovan 24:5a2272a25ff1 1535 {
danodonovan 24:5a2272a25ff1 1536 filterSelectReg.ADC_Filter_Type = ADISENSE_CORE_FILTER_SELECT_FILTER_FIR_25SPS;
danodonovan 24:5a2272a25ff1 1537 }
danodonovan 24:5a2272a25ff1 1538 else
danodonovan 24:5a2272a25ff1 1539 {
danodonovan 24:5a2272a25ff1 1540 ADI_SENSE_LOG_ERROR("Invalid ADC filter type %d specified",
danodonovan 24:5a2272a25ff1 1541 pFilterConfig->type);
danodonovan 24:5a2272a25ff1 1542 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1543 }
danodonovan 24:5a2272a25ff1 1544
danodonovan 24:5a2272a25ff1 1545 WRITE_REG_U32(hDevice, filterSelectReg.VALUE32, CORE_FILTER_SELECTn(eChannelId));
danodonovan 24:5a2272a25ff1 1546
danodonovan 24:5a2272a25ff1 1547 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1548 }
danodonovan 24:5a2272a25ff1 1549
danodonovan 24:5a2272a25ff1 1550 static ADI_SENSE_RESULT adi_sense_SetChannelAdcCurrentConfig(
danodonovan 24:5a2272a25ff1 1551 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1552 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1553 ADI_SENSE_1000_ADC_EXC_CURRENT_CONFIG *pCurrentConfig)
danodonovan 24:5a2272a25ff1 1554 {
danodonovan 24:5a2272a25ff1 1555 ADI_ADISENSE_CORE_Channel_Excitation_t channelExcitationReg;
danodonovan 24:5a2272a25ff1 1556
danodonovan 24:5a2272a25ff1 1557 channelExcitationReg.VALUE8 = REG_RESET_VAL(CORE_CHANNEL_EXCITATIONn);
danodonovan 24:5a2272a25ff1 1558
danodonovan 24:5a2272a25ff1 1559 if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_NONE)
danodonovan 24:5a2272a25ff1 1560 {
danodonovan 24:5a2272a25ff1 1561 channelExcitationReg.IOUT0_Disable = 1;
danodonovan 24:5a2272a25ff1 1562 channelExcitationReg.IOUT1_Disable = 1;
danodonovan 24:5a2272a25ff1 1563
danodonovan 24:5a2272a25ff1 1564 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_OFF;
danodonovan 24:5a2272a25ff1 1565 }
danodonovan 24:5a2272a25ff1 1566 else
danodonovan 24:5a2272a25ff1 1567 {
danodonovan 24:5a2272a25ff1 1568 channelExcitationReg.IOUT0_Disable = 0;
danodonovan 24:5a2272a25ff1 1569 channelExcitationReg.IOUT1_Disable = 0;
danodonovan 24:5a2272a25ff1 1570
danodonovan 24:5a2272a25ff1 1571 if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_50uA)
danodonovan 24:5a2272a25ff1 1572 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_50UA;
danodonovan 24:5a2272a25ff1 1573 else if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_100uA)
danodonovan 24:5a2272a25ff1 1574 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_100UA;
danodonovan 24:5a2272a25ff1 1575 else if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_250uA)
danodonovan 24:5a2272a25ff1 1576 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_250UA;
danodonovan 24:5a2272a25ff1 1577 else if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_500uA)
danodonovan 24:5a2272a25ff1 1578 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_500UA;
danodonovan 24:5a2272a25ff1 1579 else if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_750uA)
danodonovan 24:5a2272a25ff1 1580 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_750UA;
danodonovan 24:5a2272a25ff1 1581 else if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_1000uA)
danodonovan 24:5a2272a25ff1 1582 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_1000UA;
danodonovan 24:5a2272a25ff1 1583 else
danodonovan 24:5a2272a25ff1 1584 {
danodonovan 24:5a2272a25ff1 1585 ADI_SENSE_LOG_ERROR("Invalid ADC excitation current %d specified",
danodonovan 24:5a2272a25ff1 1586 pCurrentConfig->outputLevel);
danodonovan 24:5a2272a25ff1 1587 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1588 }
danodonovan 24:5a2272a25ff1 1589
danodonovan 24:5a2272a25ff1 1590 if (pCurrentConfig->swapOption == ADI_SENSE_1000_ADC_EXC_CURRENT_SWAP_DYNAMIC)
danodonovan 24:5a2272a25ff1 1591 {
danodonovan 24:5a2272a25ff1 1592 channelExcitationReg.IOUT_Dont_Swap_3Wire = 0;
danodonovan 24:5a2272a25ff1 1593 channelExcitationReg.IOUT_Static_Swap_3Wire = 0;
danodonovan 24:5a2272a25ff1 1594 }
danodonovan 24:5a2272a25ff1 1595 else if (pCurrentConfig->swapOption == ADI_SENSE_1000_ADC_EXC_CURRENT_SWAP_STATIC)
danodonovan 24:5a2272a25ff1 1596 {
danodonovan 24:5a2272a25ff1 1597 channelExcitationReg.IOUT_Dont_Swap_3Wire = 1;
danodonovan 24:5a2272a25ff1 1598 channelExcitationReg.IOUT_Static_Swap_3Wire = 1;
danodonovan 24:5a2272a25ff1 1599 }
danodonovan 24:5a2272a25ff1 1600 else if (pCurrentConfig->swapOption == ADI_SENSE_1000_ADC_EXC_CURRENT_SWAP_NONE)
danodonovan 24:5a2272a25ff1 1601 {
danodonovan 24:5a2272a25ff1 1602 channelExcitationReg.IOUT_Dont_Swap_3Wire = 1;
danodonovan 24:5a2272a25ff1 1603 channelExcitationReg.IOUT_Static_Swap_3Wire = 0;
danodonovan 24:5a2272a25ff1 1604 }
danodonovan 24:5a2272a25ff1 1605 else
danodonovan 24:5a2272a25ff1 1606 {
danodonovan 24:5a2272a25ff1 1607 ADI_SENSE_LOG_ERROR(
danodonovan 24:5a2272a25ff1 1608 "Invalid ADC excitation current swap option %d specified",
danodonovan 24:5a2272a25ff1 1609 pCurrentConfig->swapOption);
danodonovan 24:5a2272a25ff1 1610 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1611 }
danodonovan 24:5a2272a25ff1 1612 }
danodonovan 24:5a2272a25ff1 1613
danodonovan 24:5a2272a25ff1 1614 WRITE_REG_U8(hDevice, channelExcitationReg.VALUE8, CORE_CHANNEL_EXCITATIONn(eChannelId));
danodonovan 24:5a2272a25ff1 1615
danodonovan 24:5a2272a25ff1 1616 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1617 }
danodonovan 24:5a2272a25ff1 1618
danodonovan 24:5a2272a25ff1 1619 ADI_SENSE_RESULT adi_sense_SetAdcChannelConfig(
danodonovan 24:5a2272a25ff1 1620 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1621 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1622 ADI_SENSE_1000_CHANNEL_CONFIG *pChannelConfig)
danodonovan 24:5a2272a25ff1 1623 {
danodonovan 24:5a2272a25ff1 1624 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 1625 ADI_SENSE_1000_ADC_CHANNEL_CONFIG *pAdcChannelConfig =
danodonovan 24:5a2272a25ff1 1626 &pChannelConfig->adcChannelConfig;
danodonovan 24:5a2272a25ff1 1627
danodonovan 24:5a2272a25ff1 1628 eRet = adi_sense_SetChannelAdcSensorType(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1629 pAdcChannelConfig->sensor);
danodonovan 24:5a2272a25ff1 1630 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1631 {
danodonovan 24:5a2272a25ff1 1632 ADI_SENSE_LOG_ERROR("Failed to set ADC sensor type for channel %d",
danodonovan 24:5a2272a25ff1 1633 eChannelId);
danodonovan 24:5a2272a25ff1 1634 return eRet;
danodonovan 24:5a2272a25ff1 1635 }
danodonovan 24:5a2272a25ff1 1636
danodonovan 24:5a2272a25ff1 1637 eRet = adi_sense_SetChannelAdcSensorDetails(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1638 pChannelConfig);
danodonovan 24:5a2272a25ff1 1639 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1640 {
danodonovan 24:5a2272a25ff1 1641 ADI_SENSE_LOG_ERROR("Failed to set ADC sensor details for channel %d",
danodonovan 24:5a2272a25ff1 1642 eChannelId);
danodonovan 24:5a2272a25ff1 1643 return eRet;
danodonovan 24:5a2272a25ff1 1644 }
danodonovan 24:5a2272a25ff1 1645
danodonovan 24:5a2272a25ff1 1646 eRet = adi_sense_SetChannelAdcFilter(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1647 &pAdcChannelConfig->filter);
danodonovan 24:5a2272a25ff1 1648 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1649 {
danodonovan 24:5a2272a25ff1 1650 ADI_SENSE_LOG_ERROR("Failed to set ADC filter for channel %d",
danodonovan 24:5a2272a25ff1 1651 eChannelId);
danodonovan 24:5a2272a25ff1 1652 return eRet;
danodonovan 24:5a2272a25ff1 1653 }
danodonovan 24:5a2272a25ff1 1654
danodonovan 24:5a2272a25ff1 1655 eRet = adi_sense_SetChannelAdcCurrentConfig(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1656 &pAdcChannelConfig->current);
danodonovan 24:5a2272a25ff1 1657 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1658 {
danodonovan 24:5a2272a25ff1 1659 ADI_SENSE_LOG_ERROR("Failed to set ADC current for channel %d",
danodonovan 24:5a2272a25ff1 1660 eChannelId);
danodonovan 24:5a2272a25ff1 1661 return eRet;
danodonovan 24:5a2272a25ff1 1662 }
danodonovan 24:5a2272a25ff1 1663
danodonovan 24:5a2272a25ff1 1664 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1665 }
danodonovan 24:5a2272a25ff1 1666
danodonovan 24:5a2272a25ff1 1667
danodonovan 24:5a2272a25ff1 1668 static ADI_SENSE_RESULT adi_sense_SetDigitalSensorCommands(
danodonovan 24:5a2272a25ff1 1669 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1670 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1671 ADI_SENSE_1000_DIGITAL_SENSOR_COMMAND *pConfigCommand,
danodonovan 24:5a2272a25ff1 1672 ADI_SENSE_1000_DIGITAL_SENSOR_COMMAND *pDataRequestCommand)
danodonovan 24:5a2272a25ff1 1673 {
danodonovan 24:5a2272a25ff1 1674 ADI_ADISENSE_CORE_Digital_Sensor_Num_Cmds_t numCmdsReg;
danodonovan 24:5a2272a25ff1 1675
danodonovan 24:5a2272a25ff1 1676 numCmdsReg.VALUE8 = REG_RESET_VAL(CORE_DIGITAL_SENSOR_NUM_CMDSn);
danodonovan 24:5a2272a25ff1 1677
danodonovan 24:5a2272a25ff1 1678 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_NUM_CMDS_DIGITAL_SENSOR_NUM_CFG_CMDS,
danodonovan 24:5a2272a25ff1 1679 pConfigCommand->commandLength);
danodonovan 24:5a2272a25ff1 1680 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_NUM_CMDS_DIGITAL_SENSOR_NUM_READ_CMDS,
danodonovan 24:5a2272a25ff1 1681 pDataRequestCommand->commandLength);
danodonovan 24:5a2272a25ff1 1682
danodonovan 24:5a2272a25ff1 1683 numCmdsReg.Digital_Sensor_Num_Cfg_Cmds = pConfigCommand->commandLength;
danodonovan 24:5a2272a25ff1 1684 numCmdsReg.Digital_Sensor_Num_Read_Cmds = pDataRequestCommand->commandLength;
danodonovan 24:5a2272a25ff1 1685
danodonovan 24:5a2272a25ff1 1686 WRITE_REG_U8(hDevice, numCmdsReg.VALUE8,
danodonovan 24:5a2272a25ff1 1687 CORE_DIGITAL_SENSOR_NUM_CMDSn(eChannelId));
danodonovan 24:5a2272a25ff1 1688
danodonovan 24:5a2272a25ff1 1689 switch (pConfigCommand->commandLength)
danodonovan 24:5a2272a25ff1 1690 {
danodonovan 24:5a2272a25ff1 1691 /* NOTE - intentional fall-through cases below */
danodonovan 24:5a2272a25ff1 1692 case 7:
danodonovan 24:5a2272a25ff1 1693 WRITE_REG_U8(hDevice, pConfigCommand->command[6],
danodonovan 24:5a2272a25ff1 1694 CORE_DIGITAL_SENSOR_COMMAND7n(eChannelId));
danodonovan 24:5a2272a25ff1 1695 case 6:
danodonovan 24:5a2272a25ff1 1696 WRITE_REG_U8(hDevice, pConfigCommand->command[5],
danodonovan 24:5a2272a25ff1 1697 CORE_DIGITAL_SENSOR_COMMAND6n(eChannelId));
danodonovan 24:5a2272a25ff1 1698 case 5:
danodonovan 24:5a2272a25ff1 1699 WRITE_REG_U8(hDevice, pConfigCommand->command[4],
danodonovan 24:5a2272a25ff1 1700 CORE_DIGITAL_SENSOR_COMMAND5n(eChannelId));
danodonovan 24:5a2272a25ff1 1701 case 4:
danodonovan 24:5a2272a25ff1 1702 WRITE_REG_U8(hDevice, pConfigCommand->command[3],
danodonovan 24:5a2272a25ff1 1703 CORE_DIGITAL_SENSOR_COMMAND4n(eChannelId));
danodonovan 24:5a2272a25ff1 1704 case 3:
danodonovan 24:5a2272a25ff1 1705 WRITE_REG_U8(hDevice, pConfigCommand->command[2],
danodonovan 24:5a2272a25ff1 1706 CORE_DIGITAL_SENSOR_COMMAND3n(eChannelId));
danodonovan 24:5a2272a25ff1 1707 case 2:
danodonovan 24:5a2272a25ff1 1708 WRITE_REG_U8(hDevice, pConfigCommand->command[1],
danodonovan 24:5a2272a25ff1 1709 CORE_DIGITAL_SENSOR_COMMAND2n(eChannelId));
danodonovan 24:5a2272a25ff1 1710 case 1:
danodonovan 24:5a2272a25ff1 1711 WRITE_REG_U8(hDevice, pConfigCommand->command[0],
danodonovan 24:5a2272a25ff1 1712 CORE_DIGITAL_SENSOR_COMMAND1n(eChannelId));
danodonovan 24:5a2272a25ff1 1713 case 0:
danodonovan 24:5a2272a25ff1 1714 default:
danodonovan 24:5a2272a25ff1 1715 break;
danodonovan 24:5a2272a25ff1 1716 };
danodonovan 24:5a2272a25ff1 1717
danodonovan 24:5a2272a25ff1 1718 switch (pDataRequestCommand->commandLength)
danodonovan 24:5a2272a25ff1 1719 {
danodonovan 24:5a2272a25ff1 1720 /* NOTE - intentional fall-through cases below */
danodonovan 24:5a2272a25ff1 1721 case 7:
danodonovan 24:5a2272a25ff1 1722 WRITE_REG_U8(hDevice, pDataRequestCommand->command[6],
danodonovan 24:5a2272a25ff1 1723 CORE_DIGITAL_SENSOR_READ_CMD7n(eChannelId));
danodonovan 24:5a2272a25ff1 1724 case 6:
danodonovan 24:5a2272a25ff1 1725 WRITE_REG_U8(hDevice, pDataRequestCommand->command[5],
danodonovan 24:5a2272a25ff1 1726 CORE_DIGITAL_SENSOR_READ_CMD6n(eChannelId));
danodonovan 24:5a2272a25ff1 1727 case 5:
danodonovan 24:5a2272a25ff1 1728 WRITE_REG_U8(hDevice, pDataRequestCommand->command[4],
danodonovan 24:5a2272a25ff1 1729 CORE_DIGITAL_SENSOR_READ_CMD5n(eChannelId));
danodonovan 24:5a2272a25ff1 1730 case 4:
danodonovan 24:5a2272a25ff1 1731 WRITE_REG_U8(hDevice, pDataRequestCommand->command[3],
danodonovan 24:5a2272a25ff1 1732 CORE_DIGITAL_SENSOR_READ_CMD4n(eChannelId));
danodonovan 24:5a2272a25ff1 1733 case 3:
danodonovan 24:5a2272a25ff1 1734 WRITE_REG_U8(hDevice, pDataRequestCommand->command[2],
danodonovan 24:5a2272a25ff1 1735 CORE_DIGITAL_SENSOR_READ_CMD3n(eChannelId));
danodonovan 24:5a2272a25ff1 1736 case 2:
danodonovan 24:5a2272a25ff1 1737 WRITE_REG_U8(hDevice, pDataRequestCommand->command[1],
danodonovan 24:5a2272a25ff1 1738 CORE_DIGITAL_SENSOR_READ_CMD2n(eChannelId));
danodonovan 24:5a2272a25ff1 1739 case 1:
danodonovan 24:5a2272a25ff1 1740 WRITE_REG_U8(hDevice, pDataRequestCommand->command[0],
danodonovan 24:5a2272a25ff1 1741 CORE_DIGITAL_SENSOR_READ_CMD1n(eChannelId));
danodonovan 24:5a2272a25ff1 1742 case 0:
danodonovan 24:5a2272a25ff1 1743 default:
danodonovan 24:5a2272a25ff1 1744 break;
danodonovan 24:5a2272a25ff1 1745 };
danodonovan 24:5a2272a25ff1 1746
danodonovan 24:5a2272a25ff1 1747 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1748 }
danodonovan 24:5a2272a25ff1 1749
danodonovan 24:5a2272a25ff1 1750 static ADI_SENSE_RESULT adi_sense_SetDigitalSensorFormat(
danodonovan 24:5a2272a25ff1 1751 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1752 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1753 ADI_SENSE_1000_DIGITAL_SENSOR_DATA_FORMAT *pDataFormat)
danodonovan 24:5a2272a25ff1 1754 {
danodonovan 24:5a2272a25ff1 1755 ADI_ADISENSE_CORE_Digital_Sensor_Config_t sensorConfigReg;
danodonovan 24:5a2272a25ff1 1756
danodonovan 24:5a2272a25ff1 1757 sensorConfigReg.VALUE16 = REG_RESET_VAL(CORE_DIGITAL_SENSOR_CONFIGn);
danodonovan 24:5a2272a25ff1 1758
danodonovan 24:5a2272a25ff1 1759 if (pDataFormat->coding != ADI_SENSE_1000_DIGITAL_SENSOR_DATA_CODING_NONE)
danodonovan 24:5a2272a25ff1 1760 {
danodonovan 24:5a2272a25ff1 1761 if (pDataFormat->frameLength == 0)
danodonovan 24:5a2272a25ff1 1762 {
danodonovan 24:5a2272a25ff1 1763 ADI_SENSE_LOG_ERROR("Invalid frame length specified for digital sensor data format");
danodonovan 24:5a2272a25ff1 1764 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1765 }
danodonovan 24:5a2272a25ff1 1766 if (pDataFormat->numDataBits == 0)
danodonovan 24:5a2272a25ff1 1767 {
danodonovan 24:5a2272a25ff1 1768 ADI_SENSE_LOG_ERROR("Invalid frame length specified for digital sensor data format");
danodonovan 24:5a2272a25ff1 1769 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1770 }
danodonovan 24:5a2272a25ff1 1771
danodonovan 24:5a2272a25ff1 1772 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_CONFIG_DIGITAL_SENSOR_READ_BYTES,
danodonovan 24:5a2272a25ff1 1773 pDataFormat->frameLength - 1);
danodonovan 24:5a2272a25ff1 1774 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_CONFIG_DIGITAL_SENSOR_DATA_BITS,
danodonovan 24:5a2272a25ff1 1775 pDataFormat->numDataBits - 1);
danodonovan 24:5a2272a25ff1 1776 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_CONFIG_DIGITAL_SENSOR_BIT_OFFSET,
danodonovan 24:5a2272a25ff1 1777 pDataFormat->bitOffset);
danodonovan 24:5a2272a25ff1 1778
danodonovan 24:5a2272a25ff1 1779 sensorConfigReg.Digital_Sensor_Read_Bytes = pDataFormat->frameLength - 1;
danodonovan 24:5a2272a25ff1 1780 sensorConfigReg.Digital_Sensor_Data_Bits = pDataFormat->numDataBits - 1;
danodonovan 24:5a2272a25ff1 1781 sensorConfigReg.Digital_Sensor_Bit_Offset = pDataFormat->bitOffset;
danodonovan 24:5a2272a25ff1 1782 sensorConfigReg.Digital_Sensor_LeftAligned = pDataFormat->leftJustified ? 1 : 0;
danodonovan 24:5a2272a25ff1 1783 sensorConfigReg.Digital_Sensor_LittleEndian = pDataFormat->littleEndian ? 1 : 0;
danodonovan 24:5a2272a25ff1 1784
danodonovan 24:5a2272a25ff1 1785 switch (pDataFormat->coding)
danodonovan 24:5a2272a25ff1 1786 {
danodonovan 24:5a2272a25ff1 1787 case ADI_SENSE_1000_DIGITAL_SENSOR_DATA_CODING_UNIPOLAR:
danodonovan 24:5a2272a25ff1 1788 sensorConfigReg.Digital_Sensor_Coding = ADISENSE_CORE_DIGITAL_SENSOR_CONFIG_CODING_UNIPOLAR;
danodonovan 24:5a2272a25ff1 1789 break;
danodonovan 24:5a2272a25ff1 1790 case ADI_SENSE_1000_DIGITAL_SENSOR_DATA_CODING_TWOS_COMPLEMENT:
danodonovan 24:5a2272a25ff1 1791 sensorConfigReg.Digital_Sensor_Coding = ADISENSE_CORE_DIGITAL_SENSOR_CONFIG_CODING_TWOS_COMPL;
danodonovan 24:5a2272a25ff1 1792 break;
danodonovan 24:5a2272a25ff1 1793 case ADI_SENSE_1000_DIGITAL_SENSOR_DATA_CODING_OFFSET_BINARY:
danodonovan 24:5a2272a25ff1 1794 sensorConfigReg.Digital_Sensor_Coding = ADISENSE_CORE_DIGITAL_SENSOR_CONFIG_CODING_OFFSET_BINARY;
danodonovan 24:5a2272a25ff1 1795 break;
danodonovan 24:5a2272a25ff1 1796 default:
danodonovan 24:5a2272a25ff1 1797 ADI_SENSE_LOG_ERROR("Invalid coding specified for digital sensor data format");
danodonovan 24:5a2272a25ff1 1798 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1799 }
danodonovan 24:5a2272a25ff1 1800 }
danodonovan 24:5a2272a25ff1 1801
danodonovan 24:5a2272a25ff1 1802 WRITE_REG_U16(hDevice, sensorConfigReg.VALUE16,
danodonovan 24:5a2272a25ff1 1803 CORE_DIGITAL_SENSOR_CONFIGn(eChannelId));
danodonovan 24:5a2272a25ff1 1804
danodonovan 24:5a2272a25ff1 1805
danodonovan 24:5a2272a25ff1 1806 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1807 }
danodonovan 24:5a2272a25ff1 1808
danodonovan 24:5a2272a25ff1 1809 static ADI_SENSE_RESULT adi_sense_SetChannelI2cSensorType(
danodonovan 24:5a2272a25ff1 1810 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1811 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1812 ADI_SENSE_1000_I2C_SENSOR_TYPE sensorType)
danodonovan 24:5a2272a25ff1 1813 {
danodonovan 24:5a2272a25ff1 1814 ADI_ADISENSE_CORE_Sensor_Type_t sensorTypeReg;
danodonovan 24:5a2272a25ff1 1815
danodonovan 24:5a2272a25ff1 1816 sensorTypeReg.VALUE16 = REG_RESET_VAL(CORE_SENSOR_TYPEn);
danodonovan 24:5a2272a25ff1 1817
danodonovan 24:5a2272a25ff1 1818 /* Ensure that the sensor type is valid for this channel */
danodonovan 24:5a2272a25ff1 1819 switch(sensorType)
danodonovan 24:5a2272a25ff1 1820 {
danodonovan 24:5a2272a25ff1 1821 case ADI_SENSE_1000_I2C_SENSOR_HUMIDITY_HONEYWELL_HUMIDICON:
danodonovan 24:5a2272a25ff1 1822 sensorTypeReg.Sensor_Type = ADISENSE_CORE_SENSOR_TYPE_SENSOR_I2C_HUMIDITY_HONEYWELL_HUMIDICON;
danodonovan 24:5a2272a25ff1 1823 break;
danodonovan 24:5a2272a25ff1 1824 case ADI_SENSE_1000_I2C_SENSOR_HUMIDITY_SENSIRION_SHT3X:
danodonovan 24:5a2272a25ff1 1825 sensorTypeReg.Sensor_Type = ADISENSE_CORE_SENSOR_TYPE_SENSOR_I2C_HUMIDITY_SENSIRION_SHT3X;
danodonovan 24:5a2272a25ff1 1826 break;
danodonovan 24:5a2272a25ff1 1827 default:
danodonovan 24:5a2272a25ff1 1828 ADI_SENSE_LOG_ERROR("Unsupported I2C sensor type %d specified", sensorType);
danodonovan 24:5a2272a25ff1 1829 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1830 }
danodonovan 24:5a2272a25ff1 1831
danodonovan 24:5a2272a25ff1 1832 WRITE_REG_U16(hDevice, sensorTypeReg.VALUE16, CORE_SENSOR_TYPEn(eChannelId));
danodonovan 24:5a2272a25ff1 1833
danodonovan 24:5a2272a25ff1 1834 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1835 }
danodonovan 24:5a2272a25ff1 1836
danodonovan 24:5a2272a25ff1 1837 static ADI_SENSE_RESULT adi_sense_SetChannelI2cSensorAddress(
danodonovan 24:5a2272a25ff1 1838 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1839 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1840 uint32_t deviceAddress)
danodonovan 24:5a2272a25ff1 1841 {
danodonovan 24:5a2272a25ff1 1842 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_ADDRESS_DIGITAL_SENSOR_ADDRESS, deviceAddress);
danodonovan 24:5a2272a25ff1 1843 WRITE_REG_U8(hDevice, deviceAddress, CORE_DIGITAL_SENSOR_ADDRESSn(eChannelId));
danodonovan 24:5a2272a25ff1 1844
danodonovan 24:5a2272a25ff1 1845 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1846 }
danodonovan 24:5a2272a25ff1 1847
danodonovan 24:5a2272a25ff1 1848 ADI_SENSE_RESULT adi_sense_SetI2cChannelConfig(
danodonovan 24:5a2272a25ff1 1849 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1850 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1851 ADI_SENSE_1000_I2C_CHANNEL_CONFIG *pI2cChannelConfig)
danodonovan 24:5a2272a25ff1 1852 {
danodonovan 24:5a2272a25ff1 1853 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 1854
danodonovan 24:5a2272a25ff1 1855 eRet = adi_sense_SetChannelI2cSensorType(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1856 pI2cChannelConfig->sensor);
danodonovan 24:5a2272a25ff1 1857 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1858 {
danodonovan 24:5a2272a25ff1 1859 ADI_SENSE_LOG_ERROR("Failed to set I2C sensor type for channel %d",
danodonovan 24:5a2272a25ff1 1860 eChannelId);
danodonovan 24:5a2272a25ff1 1861 return eRet;
danodonovan 24:5a2272a25ff1 1862 }
danodonovan 24:5a2272a25ff1 1863
danodonovan 24:5a2272a25ff1 1864 eRet = adi_sense_SetChannelI2cSensorAddress(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1865 pI2cChannelConfig->deviceAddress);
danodonovan 24:5a2272a25ff1 1866 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1867 {
danodonovan 24:5a2272a25ff1 1868 ADI_SENSE_LOG_ERROR("Failed to set I2C sensor address for channel %d",
danodonovan 24:5a2272a25ff1 1869 eChannelId);
danodonovan 24:5a2272a25ff1 1870 return eRet;
danodonovan 24:5a2272a25ff1 1871 }
danodonovan 24:5a2272a25ff1 1872
danodonovan 24:5a2272a25ff1 1873 eRet = adi_sense_SetDigitalSensorCommands(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1874 &pI2cChannelConfig->configurationCommand,
danodonovan 24:5a2272a25ff1 1875 &pI2cChannelConfig->dataRequestCommand);
danodonovan 24:5a2272a25ff1 1876 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1877 {
danodonovan 24:5a2272a25ff1 1878 ADI_SENSE_LOG_ERROR("Failed to set I2C sensor commands for channel %d",
danodonovan 24:5a2272a25ff1 1879 eChannelId);
danodonovan 24:5a2272a25ff1 1880 return eRet;
danodonovan 24:5a2272a25ff1 1881 }
danodonovan 24:5a2272a25ff1 1882
danodonovan 24:5a2272a25ff1 1883 eRet = adi_sense_SetDigitalSensorFormat(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1884 &pI2cChannelConfig->dataFormat);
danodonovan 24:5a2272a25ff1 1885 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1886 {
danodonovan 24:5a2272a25ff1 1887 ADI_SENSE_LOG_ERROR("Failed to set I2C sensor data format for channel %d",
danodonovan 24:5a2272a25ff1 1888 eChannelId);
danodonovan 24:5a2272a25ff1 1889 return eRet;
danodonovan 24:5a2272a25ff1 1890 }
danodonovan 24:5a2272a25ff1 1891
danodonovan 24:5a2272a25ff1 1892 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1893 }
danodonovan 24:5a2272a25ff1 1894
danodonovan 24:5a2272a25ff1 1895 static ADI_SENSE_RESULT adi_sense_SetChannelSpiSensorType(
danodonovan 24:5a2272a25ff1 1896 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1897 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1898 ADI_SENSE_1000_SPI_SENSOR_TYPE sensorType)
danodonovan 24:5a2272a25ff1 1899 {
danodonovan 24:5a2272a25ff1 1900 ADI_ADISENSE_CORE_Sensor_Type_t sensorTypeReg;
danodonovan 24:5a2272a25ff1 1901
danodonovan 24:5a2272a25ff1 1902 sensorTypeReg.VALUE16 = REG_RESET_VAL(CORE_SENSOR_TYPEn);
danodonovan 24:5a2272a25ff1 1903
danodonovan 24:5a2272a25ff1 1904 /* Ensure that the sensor type is valid for this channel */
danodonovan 24:5a2272a25ff1 1905 switch(sensorType)
danodonovan 24:5a2272a25ff1 1906 {
danodonovan 24:5a2272a25ff1 1907 case ADI_SENSE_1000_SPI_SENSOR_PRESSURE_HONEYWELL_TRUSTABILITY:
danodonovan 24:5a2272a25ff1 1908 sensorTypeReg.Sensor_Type = ADISENSE_CORE_SENSOR_TYPE_SENSOR_SPI_PRESSURE_HONEYWELL_TRUSTABILITY;
danodonovan 24:5a2272a25ff1 1909 break;
danodonovan 24:5a2272a25ff1 1910 case ADI_SENSE_1000_SPI_SENSOR_ACCELEROMETER_ADI_ADXL362:
danodonovan 24:5a2272a25ff1 1911 sensorTypeReg.Sensor_Type = ADISENSE_CORE_SENSOR_TYPE_SENSOR_SPI_ACCELEROMETER_1;
danodonovan 24:5a2272a25ff1 1912 break;
danodonovan 24:5a2272a25ff1 1913 default:
danodonovan 24:5a2272a25ff1 1914 ADI_SENSE_LOG_ERROR("Unsupported SPI sensor type %d specified", sensorType);
danodonovan 24:5a2272a25ff1 1915 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 1916 }
danodonovan 24:5a2272a25ff1 1917
danodonovan 24:5a2272a25ff1 1918 WRITE_REG_U16(hDevice, sensorTypeReg.VALUE16, CORE_SENSOR_TYPEn(eChannelId));
danodonovan 24:5a2272a25ff1 1919
danodonovan 24:5a2272a25ff1 1920 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1921 }
danodonovan 24:5a2272a25ff1 1922
danodonovan 24:5a2272a25ff1 1923 ADI_SENSE_RESULT adi_sense_SetSpiChannelConfig(
danodonovan 24:5a2272a25ff1 1924 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1925 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1926 ADI_SENSE_1000_SPI_CHANNEL_CONFIG *pSpiChannelConfig)
danodonovan 24:5a2272a25ff1 1927 {
danodonovan 24:5a2272a25ff1 1928 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 1929
danodonovan 24:5a2272a25ff1 1930 eRet = adi_sense_SetChannelSpiSensorType(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1931 pSpiChannelConfig->sensor);
danodonovan 24:5a2272a25ff1 1932 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1933 {
danodonovan 24:5a2272a25ff1 1934 ADI_SENSE_LOG_ERROR("Failed to set SPI sensor type for channel %d",
danodonovan 24:5a2272a25ff1 1935 eChannelId);
danodonovan 24:5a2272a25ff1 1936 return eRet;
danodonovan 24:5a2272a25ff1 1937 }
danodonovan 24:5a2272a25ff1 1938
danodonovan 24:5a2272a25ff1 1939 eRet = adi_sense_SetDigitalSensorCommands(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1940 &pSpiChannelConfig->configurationCommand,
danodonovan 24:5a2272a25ff1 1941 &pSpiChannelConfig->dataRequestCommand);
danodonovan 24:5a2272a25ff1 1942 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1943 {
danodonovan 24:5a2272a25ff1 1944 ADI_SENSE_LOG_ERROR("Failed to set SPI sensor commands for channel %d",
danodonovan 24:5a2272a25ff1 1945 eChannelId);
danodonovan 24:5a2272a25ff1 1946 return eRet;
danodonovan 24:5a2272a25ff1 1947 }
danodonovan 24:5a2272a25ff1 1948
danodonovan 24:5a2272a25ff1 1949 eRet = adi_sense_SetDigitalSensorFormat(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 1950 &pSpiChannelConfig->dataFormat);
danodonovan 24:5a2272a25ff1 1951 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 1952 {
danodonovan 24:5a2272a25ff1 1953 ADI_SENSE_LOG_ERROR("Failed to set SPI sensor data format for channel %d",
danodonovan 24:5a2272a25ff1 1954 eChannelId);
danodonovan 24:5a2272a25ff1 1955 return eRet;
danodonovan 24:5a2272a25ff1 1956 }
danodonovan 24:5a2272a25ff1 1957
danodonovan 24:5a2272a25ff1 1958 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1959 }
danodonovan 24:5a2272a25ff1 1960
danodonovan 24:5a2272a25ff1 1961 ADI_SENSE_RESULT adi_sense_1000_SetChannelThresholdLimits(
danodonovan 24:5a2272a25ff1 1962 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1963 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1964 float32_t fHighThresholdLimit,
danodonovan 24:5a2272a25ff1 1965 float32_t fLowThresholdLimit)
danodonovan 24:5a2272a25ff1 1966 {
danodonovan 24:5a2272a25ff1 1967 /*
danodonovan 24:5a2272a25ff1 1968 * If the low/high limits are *both* set to 0 in memory, or NaNs, assume
danodonovan 24:5a2272a25ff1 1969 * that they are unset, or not required, and use infinity defaults instead
danodonovan 24:5a2272a25ff1 1970 */
danodonovan 24:5a2272a25ff1 1971 if (fHighThresholdLimit == 0.0 && fLowThresholdLimit == 0.0)
danodonovan 24:5a2272a25ff1 1972 {
danodonovan 24:5a2272a25ff1 1973 fHighThresholdLimit = INFINITY;
danodonovan 24:5a2272a25ff1 1974 fLowThresholdLimit = -INFINITY;
danodonovan 24:5a2272a25ff1 1975 }
danodonovan 24:5a2272a25ff1 1976 else
danodonovan 24:5a2272a25ff1 1977 {
danodonovan 24:5a2272a25ff1 1978 if (isnan(fHighThresholdLimit))
danodonovan 24:5a2272a25ff1 1979 fHighThresholdLimit = INFINITY;
danodonovan 24:5a2272a25ff1 1980 if (isnan(fLowThresholdLimit))
danodonovan 24:5a2272a25ff1 1981 fLowThresholdLimit = -INFINITY;
danodonovan 24:5a2272a25ff1 1982 }
danodonovan 24:5a2272a25ff1 1983
danodonovan 24:5a2272a25ff1 1984 WRITE_REG_FLOAT(hDevice, fHighThresholdLimit,
danodonovan 24:5a2272a25ff1 1985 CORE_HIGH_THRESHOLD_LIMITn(eChannelId));
danodonovan 24:5a2272a25ff1 1986 WRITE_REG_FLOAT(hDevice, fLowThresholdLimit,
danodonovan 24:5a2272a25ff1 1987 CORE_LOW_THRESHOLD_LIMITn(eChannelId));
danodonovan 24:5a2272a25ff1 1988
danodonovan 24:5a2272a25ff1 1989 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 1990 }
danodonovan 24:5a2272a25ff1 1991
danodonovan 24:5a2272a25ff1 1992 ADI_SENSE_RESULT adi_sense_1000_SetOffsetGain(
danodonovan 24:5a2272a25ff1 1993 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 1994 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 1995 float32_t fOffsetAdjustment,
danodonovan 24:5a2272a25ff1 1996 float32_t fGainAdjustment)
danodonovan 24:5a2272a25ff1 1997 {
danodonovan 24:5a2272a25ff1 1998 /* Replace with default values if NaNs are specified (or 0.0 for gain) */
danodonovan 24:5a2272a25ff1 1999 if (isnan(fGainAdjustment) || (fGainAdjustment == 0.0))
danodonovan 24:5a2272a25ff1 2000 fGainAdjustment = 1.0;
danodonovan 24:5a2272a25ff1 2001 if (isnan(fOffsetAdjustment))
danodonovan 24:5a2272a25ff1 2002 fOffsetAdjustment = 0.0;
danodonovan 24:5a2272a25ff1 2003
danodonovan 24:5a2272a25ff1 2004 WRITE_REG_FLOAT(hDevice, fGainAdjustment, CORE_SENSOR_GAINn(eChannelId));
danodonovan 24:5a2272a25ff1 2005 WRITE_REG_FLOAT(hDevice, fOffsetAdjustment, CORE_SENSOR_OFFSETn(eChannelId));
danodonovan 24:5a2272a25ff1 2006
danodonovan 24:5a2272a25ff1 2007 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 2008 }
danodonovan 24:5a2272a25ff1 2009
danodonovan 24:5a2272a25ff1 2010 ADI_SENSE_RESULT adi_sense_1000_SetChannelSettlingTime(
danodonovan 24:5a2272a25ff1 2011 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 2012 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 2013 uint32_t nSettlingTime)
danodonovan 24:5a2272a25ff1 2014 {
danodonovan 24:5a2272a25ff1 2015 CHECK_REG_FIELD_VAL(CORE_SETTLING_TIME_SETTLING_TIME, nSettlingTime);
danodonovan 24:5a2272a25ff1 2016
danodonovan 24:5a2272a25ff1 2017 WRITE_REG_U16(hDevice, nSettlingTime, CORE_SETTLING_TIMEn(eChannelId));
danodonovan 24:5a2272a25ff1 2018
danodonovan 24:5a2272a25ff1 2019 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 2020 }
danodonovan 24:5a2272a25ff1 2021
danodonovan 24:5a2272a25ff1 2022 ADI_SENSE_RESULT adi_sense_1000_SetChannelConfig(
danodonovan 24:5a2272a25ff1 2023 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 2024 ADI_SENSE_1000_CHANNEL_ID eChannelId,
danodonovan 24:5a2272a25ff1 2025 ADI_SENSE_1000_CHANNEL_CONFIG *pChannelConfig)
danodonovan 24:5a2272a25ff1 2026 {
danodonovan 24:5a2272a25ff1 2027 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 2028
danodonovan 24:5a2272a25ff1 2029 if (! ADI_SENSE_1000_CHANNEL_IS_VIRTUAL(eChannelId))
danodonovan 24:5a2272a25ff1 2030 {
danodonovan 24:5a2272a25ff1 2031 /* If the channel is not enabled, disable it and return */
danodonovan 24:5a2272a25ff1 2032 if (! pChannelConfig->enableChannel)
danodonovan 24:5a2272a25ff1 2033 return adi_sense_1000_SetChannelCount(hDevice, eChannelId, 0);
danodonovan 24:5a2272a25ff1 2034
danodonovan 24:5a2272a25ff1 2035 eRet = adi_sense_1000_SetChannelCount(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 2036 pChannelConfig->measurementsPerCycle);
danodonovan 24:5a2272a25ff1 2037 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 2038 {
danodonovan 24:5a2272a25ff1 2039 ADI_SENSE_LOG_ERROR("Failed to set measurement count for channel %d",
danodonovan 24:5a2272a25ff1 2040 eChannelId);
danodonovan 24:5a2272a25ff1 2041 return eRet;
danodonovan 24:5a2272a25ff1 2042 }
danodonovan 24:5a2272a25ff1 2043
danodonovan 24:5a2272a25ff1 2044 switch (eChannelId)
danodonovan 24:5a2272a25ff1 2045 {
danodonovan 24:5a2272a25ff1 2046 case ADI_SENSE_1000_CHANNEL_ID_CJC_0:
danodonovan 24:5a2272a25ff1 2047 case ADI_SENSE_1000_CHANNEL_ID_CJC_1:
danodonovan 24:5a2272a25ff1 2048 case ADI_SENSE_1000_CHANNEL_ID_SENSOR_0:
danodonovan 24:5a2272a25ff1 2049 case ADI_SENSE_1000_CHANNEL_ID_SENSOR_1:
danodonovan 24:5a2272a25ff1 2050 case ADI_SENSE_1000_CHANNEL_ID_SENSOR_2:
danodonovan 24:5a2272a25ff1 2051 case ADI_SENSE_1000_CHANNEL_ID_SENSOR_3:
danodonovan 24:5a2272a25ff1 2052 case ADI_SENSE_1000_CHANNEL_ID_VOLTAGE_0:
danodonovan 24:5a2272a25ff1 2053 case ADI_SENSE_1000_CHANNEL_ID_CURRENT_0:
danodonovan 24:5a2272a25ff1 2054 eRet = adi_sense_SetAdcChannelConfig(hDevice, eChannelId, pChannelConfig);
danodonovan 24:5a2272a25ff1 2055 break;
danodonovan 24:5a2272a25ff1 2056 case ADI_SENSE_1000_CHANNEL_ID_I2C_0:
danodonovan 24:5a2272a25ff1 2057 case ADI_SENSE_1000_CHANNEL_ID_I2C_1:
danodonovan 24:5a2272a25ff1 2058 eRet = adi_sense_SetI2cChannelConfig(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 2059 &pChannelConfig->i2cChannelConfig);
danodonovan 24:5a2272a25ff1 2060 break;
danodonovan 24:5a2272a25ff1 2061 case ADI_SENSE_1000_CHANNEL_ID_SPI_0:
danodonovan 24:5a2272a25ff1 2062 eRet = adi_sense_SetSpiChannelConfig(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 2063 &pChannelConfig->spiChannelConfig);
danodonovan 24:5a2272a25ff1 2064 break;
danodonovan 24:5a2272a25ff1 2065 default:
danodonovan 24:5a2272a25ff1 2066 ADI_SENSE_LOG_ERROR("Invalid channel ID %d specified", eChannelId);
danodonovan 24:5a2272a25ff1 2067 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 2068 }
danodonovan 24:5a2272a25ff1 2069
danodonovan 24:5a2272a25ff1 2070 eRet = adi_sense_1000_SetChannelSettlingTime(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 2071 pChannelConfig->extraSettlingTime);
danodonovan 24:5a2272a25ff1 2072 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 2073 {
danodonovan 24:5a2272a25ff1 2074 ADI_SENSE_LOG_ERROR("Failed to set settling time for channel %d",
danodonovan 24:5a2272a25ff1 2075 eChannelId);
danodonovan 24:5a2272a25ff1 2076 return eRet;
danodonovan 24:5a2272a25ff1 2077 }
danodonovan 24:5a2272a25ff1 2078 }
danodonovan 24:5a2272a25ff1 2079
danodonovan 24:5a2272a25ff1 2080 if (pChannelConfig->enableChannel)
danodonovan 24:5a2272a25ff1 2081 {
danodonovan 24:5a2272a25ff1 2082 /* Threshold limits can be configured individually for virtual channels */
danodonovan 24:5a2272a25ff1 2083 eRet = adi_sense_1000_SetChannelThresholdLimits(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 2084 pChannelConfig->highThreshold,
danodonovan 24:5a2272a25ff1 2085 pChannelConfig->lowThreshold);
danodonovan 24:5a2272a25ff1 2086 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 2087 {
danodonovan 24:5a2272a25ff1 2088 ADI_SENSE_LOG_ERROR("Failed to set threshold limits for channel %d",
danodonovan 24:5a2272a25ff1 2089 eChannelId);
danodonovan 24:5a2272a25ff1 2090 return eRet;
danodonovan 24:5a2272a25ff1 2091 }
danodonovan 24:5a2272a25ff1 2092
danodonovan 24:5a2272a25ff1 2093 /* Offset and gain can be configured individually for virtual channels */
danodonovan 24:5a2272a25ff1 2094 eRet = adi_sense_1000_SetOffsetGain(hDevice, eChannelId,
danodonovan 24:5a2272a25ff1 2095 pChannelConfig->offsetAdjustment,
danodonovan 24:5a2272a25ff1 2096 pChannelConfig->gainAdjustment);
danodonovan 24:5a2272a25ff1 2097 if (eRet != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 2098 {
danodonovan 24:5a2272a25ff1 2099 ADI_SENSE_LOG_ERROR("Failed to set offset/gain for channel %d",
danodonovan 24:5a2272a25ff1 2100 eChannelId);
danodonovan 24:5a2272a25ff1 2101 return eRet;
danodonovan 24:5a2272a25ff1 2102 }
danodonovan 24:5a2272a25ff1 2103 }
danodonovan 24:5a2272a25ff1 2104
danodonovan 24:5a2272a25ff1 2105 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 2106 }
danodonovan 24:5a2272a25ff1 2107
danodonovan 24:5a2272a25ff1 2108 ADI_SENSE_RESULT adi_sense_SetConfig(
danodonovan 24:5a2272a25ff1 2109 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 2110 ADI_SENSE_CONFIG * const pConfig)
danodonovan 24:5a2272a25ff1 2111 {
danodonovan 24:5a2272a25ff1 2112 ADI_SENSE_1000_CONFIG *pDeviceConfig;
danodonovan 24:5a2272a25ff1 2113 ADI_SENSE_PRODUCT_ID productId;
danodonovan 24:5a2272a25ff1 2114 ADI_SENSE_RESULT eRet;
danodonovan 24:5a2272a25ff1 2115
danodonovan 24:5a2272a25ff1 2116 if (pConfig->productId != ADI_SENSE_PRODUCT_ID_1000)
danodonovan 24:5a2272a25ff1 2117 {
danodonovan 24:5a2272a25ff1 2118 ADI_SENSE_LOG_ERROR("Configuration Product ID (0x%X) is not supported (0x%0X)",
danodonovan 24:5a2272a25ff1 2119 pConfig->productId, ADI_SENSE_PRODUCT_ID_1000);
danodonovan 24:5a2272a25ff1 2120 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 2121 }
danodonovan 24:5a2272a25ff1 2122
danodonovan 24:5a2272a25ff1 2123 /* Check that the actual Product ID is a match? */
danodonovan 24:5a2272a25ff1 2124 eRet = adi_sense_GetProductID(hDevice, &productId);
danodonovan 24:5a2272a25ff1 2125 if (eRet)
danodonovan 24:5a2272a25ff1 2126 {
danodonovan 24:5a2272a25ff1 2127 ADI_SENSE_LOG_ERROR("Failed to read device Product ID register");
danodonovan 24:5a2272a25ff1 2128 return eRet;
danodonovan 24:5a2272a25ff1 2129 }
danodonovan 24:5a2272a25ff1 2130 if (pConfig->productId != productId)
danodonovan 24:5a2272a25ff1 2131 {
danodonovan 24:5a2272a25ff1 2132 ADI_SENSE_LOG_ERROR("Configuration Product ID (0x%X) does not match device (0x%0X)",
danodonovan 24:5a2272a25ff1 2133 pConfig->productId, productId);
danodonovan 24:5a2272a25ff1 2134 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 2135 }
danodonovan 24:5a2272a25ff1 2136
danodonovan 24:5a2272a25ff1 2137 pDeviceConfig = &pConfig->adisense1000;
danodonovan 24:5a2272a25ff1 2138
danodonovan 24:5a2272a25ff1 2139 eRet = adi_sense_1000_SetPowerConfig(hDevice, &pDeviceConfig->power);
danodonovan 24:5a2272a25ff1 2140 if (eRet)
danodonovan 24:5a2272a25ff1 2141 {
danodonovan 24:5a2272a25ff1 2142 ADI_SENSE_LOG_ERROR("Failed to set power configuration");
danodonovan 24:5a2272a25ff1 2143 return eRet;
danodonovan 24:5a2272a25ff1 2144 }
danodonovan 24:5a2272a25ff1 2145
danodonovan 24:5a2272a25ff1 2146 eRet = adi_sense_1000_SetMeasurementConfig(hDevice, &pDeviceConfig->measurement);
danodonovan 24:5a2272a25ff1 2147 if (eRet)
danodonovan 24:5a2272a25ff1 2148 {
danodonovan 24:5a2272a25ff1 2149 ADI_SENSE_LOG_ERROR("Failed to set measurement configuration");
danodonovan 24:5a2272a25ff1 2150 return eRet;
danodonovan 24:5a2272a25ff1 2151 }
danodonovan 24:5a2272a25ff1 2152
danodonovan 24:5a2272a25ff1 2153 eRet = adi_sense_1000_SetDiagnosticsConfig(hDevice, &pDeviceConfig->diagnostics);
danodonovan 24:5a2272a25ff1 2154 if (eRet)
danodonovan 24:5a2272a25ff1 2155 {
danodonovan 24:5a2272a25ff1 2156 ADI_SENSE_LOG_ERROR("Failed to set diagnostics configuration");
danodonovan 24:5a2272a25ff1 2157 return eRet;
danodonovan 24:5a2272a25ff1 2158 }
danodonovan 24:5a2272a25ff1 2159
danodonovan 24:5a2272a25ff1 2160 for (ADI_SENSE_1000_CHANNEL_ID id = 0; id < ADI_SENSE_1000_MAX_CHANNELS; id++)
danodonovan 24:5a2272a25ff1 2161 {
danodonovan 24:5a2272a25ff1 2162 eRet = adi_sense_1000_SetChannelConfig(hDevice, id,
danodonovan 24:5a2272a25ff1 2163 &pDeviceConfig->channels[id]);
danodonovan 24:5a2272a25ff1 2164 if (eRet)
danodonovan 24:5a2272a25ff1 2165 {
danodonovan 24:5a2272a25ff1 2166 ADI_SENSE_LOG_ERROR("Failed to set channel %d configuration", id);
danodonovan 24:5a2272a25ff1 2167 return eRet;
danodonovan 24:5a2272a25ff1 2168 }
danodonovan 24:5a2272a25ff1 2169 }
danodonovan 24:5a2272a25ff1 2170
danodonovan 24:5a2272a25ff1 2171 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 2172 }
danodonovan 24:5a2272a25ff1 2173
danodonovan 24:5a2272a25ff1 2174 ADI_SENSE_RESULT adi_sense_1000_SetLutData(
danodonovan 24:5a2272a25ff1 2175 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 2176 ADI_SENSE_1000_LUT * const pLutData)
danodonovan 24:5a2272a25ff1 2177 {
danodonovan 24:5a2272a25ff1 2178 ADI_SENSE_1000_LUT_HEADER *pLutHeader = &pLutData->header;
danodonovan 24:5a2272a25ff1 2179 ADI_SENSE_1000_LUT_TABLE *pLutTable = pLutData->tables;
danodonovan 24:5a2272a25ff1 2180 unsigned actualLength = 0;
danodonovan 24:5a2272a25ff1 2181
danodonovan 24:5a2272a25ff1 2182 if (pLutData->header.signature != ADI_SENSE_LUT_SIGNATURE)
danodonovan 24:5a2272a25ff1 2183 {
danodonovan 24:5a2272a25ff1 2184 ADI_SENSE_LOG_ERROR("LUT signature incorrect (expected 0x%X, actual 0x%X)",
danodonovan 24:5a2272a25ff1 2185 ADI_SENSE_LUT_SIGNATURE, pLutHeader->signature);
danodonovan 24:5a2272a25ff1 2186 return ADI_SENSE_INVALID_SIGNATURE;
danodonovan 24:5a2272a25ff1 2187 }
danodonovan 24:5a2272a25ff1 2188
danodonovan 24:5a2272a25ff1 2189 for (unsigned i = 0; i < pLutHeader->numTables; i++)
danodonovan 24:5a2272a25ff1 2190 {
danodonovan 24:5a2272a25ff1 2191 ADI_SENSE_1000_LUT_DESCRIPTOR *pDesc = &pLutTable->descriptor;
danodonovan 24:5a2272a25ff1 2192 ADI_SENSE_1000_LUT_TABLE_DATA *pData = &pLutTable->data;
danodonovan 24:5a2272a25ff1 2193 unsigned short calculatedCrc;
danodonovan 24:5a2272a25ff1 2194
danodonovan 24:5a2272a25ff1 2195 switch (pDesc->geometry)
danodonovan 24:5a2272a25ff1 2196 {
danodonovan 24:5a2272a25ff1 2197 case ADI_SENSE_1000_LUT_GEOMETRY_COEFFS:
danodonovan 24:5a2272a25ff1 2198 switch (pDesc->equation)
danodonovan 24:5a2272a25ff1 2199 {
danodonovan 24:5a2272a25ff1 2200 case ADI_SENSE_1000_LUT_EQUATION_POLYN:
danodonovan 24:5a2272a25ff1 2201 case ADI_SENSE_1000_LUT_EQUATION_POLYNEXP:
danodonovan 24:5a2272a25ff1 2202 case ADI_SENSE_1000_LUT_EQUATION_QUADRATIC:
danodonovan 24:5a2272a25ff1 2203 case ADI_SENSE_1000_LUT_EQUATION_STEINHART:
danodonovan 24:5a2272a25ff1 2204 case ADI_SENSE_1000_LUT_EQUATION_LOGARITHMIC:
danodonovan 24:5a2272a25ff1 2205 case ADI_SENSE_1000_LUT_EQUATION_EXPONENTIAL:
danodonovan 24:5a2272a25ff1 2206 case ADI_SENSE_1000_LUT_EQUATION_BIVARIATE_POLYN:
danodonovan 24:5a2272a25ff1 2207 break;
danodonovan 24:5a2272a25ff1 2208 default:
danodonovan 24:5a2272a25ff1 2209 ADI_SENSE_LOG_ERROR("Invalid equation %u specified for LUT table %u",
danodonovan 24:5a2272a25ff1 2210 pDesc->equation, i);
danodonovan 24:5a2272a25ff1 2211 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 2212 }
danodonovan 24:5a2272a25ff1 2213 break;
danodonovan 24:5a2272a25ff1 2214 case ADI_SENSE_1000_LUT_GEOMETRY_NES_1D:
danodonovan 24:5a2272a25ff1 2215 case ADI_SENSE_1000_LUT_GEOMETRY_NES_2D:
danodonovan 24:5a2272a25ff1 2216 case ADI_SENSE_1000_LUT_GEOMETRY_ES_1D:
danodonovan 24:5a2272a25ff1 2217 case ADI_SENSE_1000_LUT_GEOMETRY_ES_2D:
danodonovan 24:5a2272a25ff1 2218 if (pDesc->equation != ADI_SENSE_1000_LUT_EQUATION_LUT) {
danodonovan 24:5a2272a25ff1 2219 ADI_SENSE_LOG_ERROR("Invalid equation %u specified for LUT table %u",
danodonovan 24:5a2272a25ff1 2220 pDesc->equation, i);
danodonovan 24:5a2272a25ff1 2221 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 2222 }
danodonovan 24:5a2272a25ff1 2223 break;
danodonovan 24:5a2272a25ff1 2224 default:
danodonovan 24:5a2272a25ff1 2225 ADI_SENSE_LOG_ERROR("Invalid geometry %u specified for LUT table %u",
danodonovan 24:5a2272a25ff1 2226 pDesc->geometry, i);
danodonovan 24:5a2272a25ff1 2227 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 2228 }
danodonovan 24:5a2272a25ff1 2229
danodonovan 24:5a2272a25ff1 2230 switch (pDesc->dataType)
danodonovan 24:5a2272a25ff1 2231 {
danodonovan 24:5a2272a25ff1 2232 case ADI_SENSE_1000_LUT_DATA_TYPE_FLOAT32:
danodonovan 24:5a2272a25ff1 2233 case ADI_SENSE_1000_LUT_DATA_TYPE_FLOAT64:
danodonovan 24:5a2272a25ff1 2234 break;
danodonovan 24:5a2272a25ff1 2235 default:
danodonovan 24:5a2272a25ff1 2236 ADI_SENSE_LOG_ERROR("Invalid vector format %u specified for LUT table %u",
danodonovan 24:5a2272a25ff1 2237 pDesc->dataType, i);
danodonovan 24:5a2272a25ff1 2238 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 2239 }
danodonovan 24:5a2272a25ff1 2240
danodonovan 24:5a2272a25ff1 2241 calculatedCrc = crc16_ccitt(pData, pDesc->length);
danodonovan 24:5a2272a25ff1 2242 if (calculatedCrc != pDesc->crc16)
danodonovan 24:5a2272a25ff1 2243 {
danodonovan 24:5a2272a25ff1 2244 ADI_SENSE_LOG_ERROR("CRC validation failed on LUT table %u (expected 0x%04X, actual 0x%04X)",
danodonovan 24:5a2272a25ff1 2245 i, pDesc->crc16, calculatedCrc);
danodonovan 24:5a2272a25ff1 2246 return ADI_SENSE_CRC_ERROR;
danodonovan 24:5a2272a25ff1 2247 }
danodonovan 24:5a2272a25ff1 2248
danodonovan 24:5a2272a25ff1 2249 actualLength += sizeof(*pDesc) + pDesc->length;
danodonovan 24:5a2272a25ff1 2250
danodonovan 24:5a2272a25ff1 2251 /* Move to the next look-up table */
danodonovan 24:5a2272a25ff1 2252 pLutTable = (ADI_SENSE_1000_LUT_TABLE *)((uint8_t *)pLutTable + sizeof(*pDesc) + pDesc->length);
danodonovan 24:5a2272a25ff1 2253 }
danodonovan 24:5a2272a25ff1 2254
danodonovan 24:5a2272a25ff1 2255 if (actualLength != pLutHeader->totalLength)
danodonovan 24:5a2272a25ff1 2256 {
danodonovan 24:5a2272a25ff1 2257 ADI_SENSE_LOG_ERROR("LUT table length mismatch (expected %u, actual %u)",
danodonovan 24:5a2272a25ff1 2258 pLutHeader->totalLength, actualLength);
danodonovan 24:5a2272a25ff1 2259 return ADI_SENSE_WRONG_SIZE;
danodonovan 24:5a2272a25ff1 2260 }
danodonovan 24:5a2272a25ff1 2261
danodonovan 24:5a2272a25ff1 2262 if (sizeof(*pLutHeader) + pLutHeader->totalLength > ADI_SENSE_LUT_MAX_SIZE)
danodonovan 24:5a2272a25ff1 2263 {
danodonovan 24:5a2272a25ff1 2264 ADI_SENSE_LOG_ERROR("Maximum LUT table length (%u bytes) exceeded",
danodonovan 24:5a2272a25ff1 2265 ADI_SENSE_LUT_MAX_SIZE);
danodonovan 24:5a2272a25ff1 2266 return ADI_SENSE_WRONG_SIZE;
danodonovan 24:5a2272a25ff1 2267 }
danodonovan 24:5a2272a25ff1 2268
danodonovan 24:5a2272a25ff1 2269 /* Write the LUT data to the device */
danodonovan 24:5a2272a25ff1 2270 unsigned lutSize = sizeof(*pLutHeader) + pLutHeader->totalLength;
danodonovan 24:5a2272a25ff1 2271 WRITE_REG_U16(hDevice, 0, CORE_LUT_OFFSET);
danodonovan 24:5a2272a25ff1 2272 WRITE_REG_U8_ARRAY(hDevice, (uint8_t *)pLutData, lutSize, CORE_LUT_DATA);
danodonovan 24:5a2272a25ff1 2273
danodonovan 24:5a2272a25ff1 2274 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 2275 }
danodonovan 24:5a2272a25ff1 2276
danodonovan 24:5a2272a25ff1 2277 ADI_SENSE_RESULT adi_sense_1000_SetLutDataRaw(
danodonovan 24:5a2272a25ff1 2278 ADI_SENSE_DEVICE_HANDLE const hDevice,
danodonovan 24:5a2272a25ff1 2279 ADI_SENSE_1000_LUT_RAW * const pLutData)
danodonovan 24:5a2272a25ff1 2280 {
danodonovan 24:5a2272a25ff1 2281 return adi_sense_1000_SetLutData(hDevice,
danodonovan 24:5a2272a25ff1 2282 (ADI_SENSE_1000_LUT * const)pLutData);
danodonovan 24:5a2272a25ff1 2283 }
danodonovan 24:5a2272a25ff1 2284
danodonovan 24:5a2272a25ff1 2285 static ADI_SENSE_RESULT getLutTableSize(
danodonovan 24:5a2272a25ff1 2286 ADI_SENSE_1000_LUT_DESCRIPTOR * const pDesc,
danodonovan 24:5a2272a25ff1 2287 ADI_SENSE_1000_LUT_TABLE_DATA * const pData,
danodonovan 24:5a2272a25ff1 2288 unsigned *pLength)
danodonovan 24:5a2272a25ff1 2289 {
danodonovan 24:5a2272a25ff1 2290 switch (pDesc->geometry)
danodonovan 24:5a2272a25ff1 2291 {
danodonovan 24:5a2272a25ff1 2292 case ADI_SENSE_1000_LUT_GEOMETRY_COEFFS:
danodonovan 24:5a2272a25ff1 2293 if (pDesc->equation == ADI_SENSE_1000_LUT_EQUATION_BIVARIATE_POLYN)
danodonovan 24:5a2272a25ff1 2294 *pLength = ADI_SENSE_1000_LUT_2D_POLYN_COEFF_LIST_SIZE(pData->coeffList2d);
danodonovan 24:5a2272a25ff1 2295 else
danodonovan 24:5a2272a25ff1 2296 *pLength = ADI_SENSE_1000_LUT_COEFF_LIST_SIZE(pData->coeffList);
danodonovan 24:5a2272a25ff1 2297 break;
danodonovan 24:5a2272a25ff1 2298 case ADI_SENSE_1000_LUT_GEOMETRY_NES_1D:
danodonovan 24:5a2272a25ff1 2299 *pLength = ADI_SENSE_1000_LUT_1D_NES_SIZE(pData->lut1dNes);
danodonovan 24:5a2272a25ff1 2300 break;
danodonovan 24:5a2272a25ff1 2301 case ADI_SENSE_1000_LUT_GEOMETRY_NES_2D:
danodonovan 24:5a2272a25ff1 2302 *pLength = ADI_SENSE_1000_LUT_2D_NES_SIZE(pData->lut2dNes);
danodonovan 24:5a2272a25ff1 2303 break;
danodonovan 24:5a2272a25ff1 2304 case ADI_SENSE_1000_LUT_GEOMETRY_ES_1D:
danodonovan 24:5a2272a25ff1 2305 *pLength = ADI_SENSE_1000_LUT_1D_ES_SIZE(pData->lut1dEs);
danodonovan 24:5a2272a25ff1 2306 break;
danodonovan 24:5a2272a25ff1 2307 case ADI_SENSE_1000_LUT_GEOMETRY_ES_2D:
danodonovan 24:5a2272a25ff1 2308 *pLength = ADI_SENSE_1000_LUT_2D_ES_SIZE(pData->lut2dEs);
danodonovan 24:5a2272a25ff1 2309 break;
danodonovan 24:5a2272a25ff1 2310 default:
danodonovan 24:5a2272a25ff1 2311 ADI_SENSE_LOG_ERROR("Invalid LUT table geometry %d specified\r\n",
danodonovan 24:5a2272a25ff1 2312 pDesc->geometry);
danodonovan 24:5a2272a25ff1 2313 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 2314 }
danodonovan 24:5a2272a25ff1 2315
danodonovan 24:5a2272a25ff1 2316 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 2317 }
danodonovan 24:5a2272a25ff1 2318
danodonovan 24:5a2272a25ff1 2319 ADI_SENSE_RESULT adi_sense_1000_AssembleLutData(
danodonovan 24:5a2272a25ff1 2320 ADI_SENSE_1000_LUT * pLutBuffer,
danodonovan 24:5a2272a25ff1 2321 unsigned nLutBufferSize,
danodonovan 24:5a2272a25ff1 2322 unsigned const nNumTables,
danodonovan 24:5a2272a25ff1 2323 ADI_SENSE_1000_LUT_DESCRIPTOR * const ppDesc[],
danodonovan 24:5a2272a25ff1 2324 ADI_SENSE_1000_LUT_TABLE_DATA * const ppData[])
danodonovan 24:5a2272a25ff1 2325 {
danodonovan 24:5a2272a25ff1 2326 ADI_SENSE_1000_LUT_HEADER *pHdr = &pLutBuffer->header;
danodonovan 24:5a2272a25ff1 2327 uint8_t *pLutTableData = (uint8_t *)pLutBuffer + sizeof(*pHdr);
danodonovan 24:5a2272a25ff1 2328
danodonovan 24:5a2272a25ff1 2329 if (sizeof(*pHdr) > nLutBufferSize)
danodonovan 24:5a2272a25ff1 2330 {
danodonovan 24:5a2272a25ff1 2331 ADI_SENSE_LOG_ERROR("Insufficient LUT buffer size provided");
danodonovan 24:5a2272a25ff1 2332 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 2333 }
danodonovan 24:5a2272a25ff1 2334
danodonovan 24:5a2272a25ff1 2335 /* First initialise the top-level header */
danodonovan 24:5a2272a25ff1 2336 pHdr->signature = ADI_SENSE_LUT_SIGNATURE;
danodonovan 24:5a2272a25ff1 2337 pHdr->version.major = 1;
danodonovan 24:5a2272a25ff1 2338 pHdr->version.minor = 0;
danodonovan 24:5a2272a25ff1 2339 pHdr->numTables = 0;
danodonovan 24:5a2272a25ff1 2340 pHdr->totalLength = 0;
danodonovan 24:5a2272a25ff1 2341
danodonovan 24:5a2272a25ff1 2342 /*
danodonovan 24:5a2272a25ff1 2343 * Walk through the list of table pointers provided, appending the table
danodonovan 24:5a2272a25ff1 2344 * descriptor+data from each one to the provided LUT buffer
danodonovan 24:5a2272a25ff1 2345 */
danodonovan 24:5a2272a25ff1 2346 for (unsigned i = 0; i < nNumTables; i++)
danodonovan 24:5a2272a25ff1 2347 {
danodonovan 24:5a2272a25ff1 2348 ADI_SENSE_1000_LUT_DESCRIPTOR * const pDesc = ppDesc[i];
danodonovan 24:5a2272a25ff1 2349 ADI_SENSE_1000_LUT_TABLE_DATA * const pData = ppData[i];
danodonovan 24:5a2272a25ff1 2350 ADI_SENSE_RESULT res;
danodonovan 24:5a2272a25ff1 2351 unsigned dataLength = 0;
danodonovan 24:5a2272a25ff1 2352
danodonovan 24:5a2272a25ff1 2353 /* Calculate the length of the table data */
danodonovan 24:5a2272a25ff1 2354 res = getLutTableSize(pDesc, pData, &dataLength);
danodonovan 24:5a2272a25ff1 2355 if (res != ADI_SENSE_SUCCESS)
danodonovan 24:5a2272a25ff1 2356 return res;
danodonovan 24:5a2272a25ff1 2357
danodonovan 24:5a2272a25ff1 2358 /* Fill in the table descriptor length and CRC fields */
danodonovan 24:5a2272a25ff1 2359 pDesc->length = dataLength;
danodonovan 24:5a2272a25ff1 2360 pDesc->crc16 = crc16_ccitt(pData, dataLength);
danodonovan 24:5a2272a25ff1 2361
danodonovan 24:5a2272a25ff1 2362 if ((sizeof(*pHdr) + pHdr->totalLength + sizeof(*pDesc) + dataLength) > nLutBufferSize)
danodonovan 24:5a2272a25ff1 2363 {
danodonovan 24:5a2272a25ff1 2364 ADI_SENSE_LOG_ERROR("Insufficient LUT buffer size provided");
danodonovan 24:5a2272a25ff1 2365 return ADI_SENSE_INVALID_PARAM;
danodonovan 24:5a2272a25ff1 2366 }
danodonovan 24:5a2272a25ff1 2367
danodonovan 24:5a2272a25ff1 2368 /* Append the table to the LUT buffer (desc + data) */
danodonovan 24:5a2272a25ff1 2369 memcpy(pLutTableData + pHdr->totalLength, pDesc, sizeof(*pDesc));
danodonovan 24:5a2272a25ff1 2370 pHdr->totalLength += sizeof(*pDesc);
danodonovan 24:5a2272a25ff1 2371 memcpy(pLutTableData + pHdr->totalLength, pData, dataLength);
danodonovan 24:5a2272a25ff1 2372 pHdr->totalLength += dataLength;
danodonovan 24:5a2272a25ff1 2373
danodonovan 24:5a2272a25ff1 2374 pHdr->numTables++;
danodonovan 24:5a2272a25ff1 2375 }
danodonovan 24:5a2272a25ff1 2376
danodonovan 24:5a2272a25ff1 2377 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 2378 }
danodonovan 24:5a2272a25ff1 2379
danodonovan 24:5a2272a25ff1 2380 #define CAL_TABLE_ROWS ADI_SENSE_1000_CAL_NUM_TABLES
danodonovan 24:5a2272a25ff1 2381 #define CAL_TABLE_COLS ADI_SENSE_1000_CAL_NUM_TEMPS
danodonovan 24:5a2272a25ff1 2382 #define CAL_TABLE_SIZE (sizeof(float) * CAL_TABLE_ROWS * CAL_TABLE_COLS)
danodonovan 24:5a2272a25ff1 2383
danodonovan 24:5a2272a25ff1 2384 ADI_SENSE_RESULT adi_sense_1000_ReadCalTable(
danodonovan 24:5a2272a25ff1 2385 ADI_SENSE_DEVICE_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 2386 float *pfBuffer,
danodonovan 24:5a2272a25ff1 2387 unsigned nMaxLen,
danodonovan 24:5a2272a25ff1 2388 unsigned *pnDataLen,
danodonovan 24:5a2272a25ff1 2389 unsigned *pnRows,
danodonovan 24:5a2272a25ff1 2390 unsigned *pnColumns)
danodonovan 24:5a2272a25ff1 2391 {
danodonovan 24:5a2272a25ff1 2392 *pnDataLen = sizeof(float) * CAL_TABLE_ROWS * CAL_TABLE_COLS;
danodonovan 24:5a2272a25ff1 2393 *pnRows = CAL_TABLE_ROWS;
danodonovan 24:5a2272a25ff1 2394 *pnColumns = CAL_TABLE_COLS;
danodonovan 24:5a2272a25ff1 2395
danodonovan 24:5a2272a25ff1 2396 if (nMaxLen > *pnDataLen)
danodonovan 24:5a2272a25ff1 2397 nMaxLen = *pnDataLen;
danodonovan 24:5a2272a25ff1 2398
danodonovan 24:5a2272a25ff1 2399 WRITE_REG_U16(hDevice, 0, CORE_CAL_OFFSET);
danodonovan 24:5a2272a25ff1 2400 READ_REG_U8_ARRAY(hDevice, (uint8_t *)pfBuffer, nMaxLen, CORE_CAL_DATA);
danodonovan 24:5a2272a25ff1 2401
danodonovan 24:5a2272a25ff1 2402 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 2403 }
danodonovan 24:5a2272a25ff1 2404