Example program for EVAL-ADMX2001

Dependencies:   ADMX2001

Committer:
nsheth
Date:
Wed Oct 27 06:58:57 2021 +0000
Revision:
5:746e78113d7d
Child:
8:bd0b93e35392
Changes for measurement and calibration using different test loads

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nsheth 5:746e78113d7d 1 /* Copyright (c) 2021 Analog Devices, Inc. All rights reserved.
nsheth 5:746e78113d7d 2
nsheth 5:746e78113d7d 3 Redistribution and use in source and binary forms, with or without modification,
nsheth 5:746e78113d7d 4 are permitted provided that the following conditions are met:
nsheth 5:746e78113d7d 5 - Redistributions of source code must retain the above copyright notice,
nsheth 5:746e78113d7d 6 this list of conditions and the following disclaimer.
nsheth 5:746e78113d7d 7 - Redistributions in binary form must reproduce the above copyright notice,
nsheth 5:746e78113d7d 8 this list of conditions and the following disclaimer in the documentation
nsheth 5:746e78113d7d 9 and/or other materials provided with the distribution.
nsheth 5:746e78113d7d 10 - Modified versions of the software must be conspicuously marked as such.
nsheth 5:746e78113d7d 11 - This software is licensed solely and exclusively for use with processors/products
nsheth 5:746e78113d7d 12 manufactured by or for Analog Devices, Inc.
nsheth 5:746e78113d7d 13 - This software may not be combined or merged with other code in any manner
nsheth 5:746e78113d7d 14 that would cause the software to become subject to terms and conditions which
nsheth 5:746e78113d7d 15 differ from those listed here.
nsheth 5:746e78113d7d 16 - Neither the name of Analog Devices, Inc. nor the names of its contributors
nsheth 5:746e78113d7d 17 may be used to endorse or promote products derived from this software without
nsheth 5:746e78113d7d 18 specific prior written permission.
nsheth 5:746e78113d7d 19 - The use of this software may or may not infringe the patent rights of one or
nsheth 5:746e78113d7d 20 more patent holders. This license does not release you from the requirement
nsheth 5:746e78113d7d 21 that you obtain separate licenses from these patent holders to use this software.
nsheth 5:746e78113d7d 22
nsheth 5:746e78113d7d 23 THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND
nsheth 5:746e78113d7d 24 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
nsheth 5:746e78113d7d 25 TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
nsheth 5:746e78113d7d 26 NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
nsheth 5:746e78113d7d 27 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES
nsheth 5:746e78113d7d 28 (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL
nsheth 5:746e78113d7d 29 PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
nsheth 5:746e78113d7d 30 OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
nsheth 5:746e78113d7d 31 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
nsheth 5:746e78113d7d 32 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
nsheth 5:746e78113d7d 33 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nsheth 5:746e78113d7d 34
nsheth 5:746e78113d7d 35 2021-01-10-7CBSD SLA
nsheth 5:746e78113d7d 36 */
nsheth 5:746e78113d7d 37
nsheth 5:746e78113d7d 38 /*============= I N C L U D E S =============*/
nsheth 5:746e78113d7d 39 #include "ADMX2001.h"
nsheth 5:746e78113d7d 40 #include "ADMX2001_commands.h"
nsheth 5:746e78113d7d 41 #include "message.h"
nsheth 5:746e78113d7d 42 #include "measure.h"
nsheth 5:746e78113d7d 43 #include <stdint.h>
nsheth 5:746e78113d7d 44 #include <stdio.h>
nsheth 5:746e78113d7d 45 #include <stdlib.h>
nsheth 5:746e78113d7d 46
nsheth 5:746e78113d7d 47 /** maximum length for buffer for string operation */
nsheth 5:746e78113d7d 48 #define MAX_DISPLAY_LENGTH 128
nsheth 5:746e78113d7d 49 /** maximum length for buffer for storing measurement values */
nsheth 5:746e78113d7d 50 #define MAX_MEASUREMENT_BUFFER 512
nsheth 5:746e78113d7d 51 /** buffer for string operation */
nsheth 5:746e78113d7d 52 char displayString[MAX_DISPLAY_LENGTH];
nsheth 5:746e78113d7d 53 /** Array to store measurement values*/
nsheth 5:746e78113d7d 54 double measurementBuffer[MAX_MEASUREMENT_BUFFER];
nsheth 5:746e78113d7d 55 /** Array to store sweep points*/
nsheth 5:746e78113d7d 56 double sweepPoints[MAX_MEASUREMENT_BUFFER];
nsheth 5:746e78113d7d 57
nsheth 5:746e78113d7d 58 extern Admx200xDev admx200xDev;
nsheth 5:746e78113d7d 59
nsheth 5:746e78113d7d 60 static int32_t GetAttributeInt32(uint32_t attributeID, int32_t *pValue);
nsheth 5:746e78113d7d 61
nsheth 5:746e78113d7d 62 static int32_t ReadAndDisplay(SWEEP_TYPE sweepType);
nsheth 5:746e78113d7d 63
nsheth 5:746e78113d7d 64 static void DisplayMeasuredValue(double displayVal1, double displayVal2,
nsheth 5:746e78113d7d 65 double sweepVar);
nsheth 5:746e78113d7d 66
nsheth 5:746e78113d7d 67 int32_t GetAttributeInt32(uint32_t attributeID, int32_t *pValue)
nsheth 5:746e78113d7d 68 {
nsheth 5:746e78113d7d 69 int32_t status = ADMX_STATUS_SUCCESS;
nsheth 5:746e78113d7d 70 uint8_t cmdID;
nsheth 5:746e78113d7d 71 uint16_t addr = 0;
nsheth 5:746e78113d7d 72
nsheth 5:746e78113d7d 73 uint32_t statReg;
nsheth 5:746e78113d7d 74 uint32_t data;
nsheth 5:746e78113d7d 75 cmdID = attributeID;
nsheth 5:746e78113d7d 76 cmdID |= CMD_READ_BITM;
nsheth 5:746e78113d7d 77 status = Admx200xSendCmd(&admx200xDev, &cmdID, &addr, &data, &statReg);
nsheth 5:746e78113d7d 78 if (status == ADMX_STATUS_SUCCESS)
nsheth 5:746e78113d7d 79 {
nsheth 5:746e78113d7d 80 status = (int32_t)(statReg & ADMX200X_STATUS_CODE_BITM);
nsheth 5:746e78113d7d 81 cmdID = CMD_RESULT_READ;
nsheth 5:746e78113d7d 82 status = Admx200xReadData(&admx200xDev, cmdID, (uint32_t *)pValue);
nsheth 5:746e78113d7d 83 }
nsheth 5:746e78113d7d 84
nsheth 5:746e78113d7d 85 return status;
nsheth 5:746e78113d7d 86 }
nsheth 5:746e78113d7d 87
nsheth 5:746e78113d7d 88 /**
nsheth 5:746e78113d7d 89 * @brief Dsiplays the output value
nsheth 5:746e78113d7d 90 * \ref DisplayMeasuredValue
nsheth 5:746e78113d7d 91 */
nsheth 5:746e78113d7d 92 void DisplayMeasuredValue(double displayVal1, double displayVal2,
nsheth 5:746e78113d7d 93 double sweepVar)
nsheth 5:746e78113d7d 94 {
nsheth 5:746e78113d7d 95 snprintf(&displayString[0], MAX_DISPLAY_LENGTH,
nsheth 5:746e78113d7d 96 "%d,%0.6e,%0.6e\n\r", (int32_t)sweepVar, displayVal1,
nsheth 5:746e78113d7d 97 displayVal2);
nsheth 5:746e78113d7d 98 printf("%s", &displayString[0]);
nsheth 5:746e78113d7d 99 }
nsheth 5:746e78113d7d 100
nsheth 5:746e78113d7d 101 /**
nsheth 5:746e78113d7d 102 * @brief Function to read and display measured values
nsheth 5:746e78113d7d 103 */
nsheth 5:746e78113d7d 104 int32_t ReadAndDisplay(SWEEP_TYPE sweepType)
nsheth 5:746e78113d7d 105 {
nsheth 5:746e78113d7d 106 int32_t i;
nsheth 5:746e78113d7d 107 int32_t status = ADMX_STATUS_SUCCESS;
nsheth 5:746e78113d7d 108
nsheth 5:746e78113d7d 109 Admx200xDev *pAdmx200x = &admx200xDev;
nsheth 5:746e78113d7d 110 uint8_t cmdId = 0;
nsheth 5:746e78113d7d 111 uint16_t addr = 0;
nsheth 5:746e78113d7d 112 uint32_t statReg;
nsheth 5:746e78113d7d 113
nsheth 5:746e78113d7d 114 int32_t numValues =
nsheth 5:746e78113d7d 115 sizeof(measurementBuffer) / sizeof(measurementBuffer[0]);
nsheth 5:746e78113d7d 116
nsheth 5:746e78113d7d 117 if (status == 0)
nsheth 5:746e78113d7d 118 {
nsheth 5:746e78113d7d 119 status = Admx200xReadFifo(pAdmx200x, &measurementBuffer[0], &numValues);
nsheth 5:746e78113d7d 120 }
nsheth 5:746e78113d7d 121 // Read sweep points
nsheth 5:746e78113d7d 122 if (status == 0)
nsheth 5:746e78113d7d 123 {
nsheth 5:746e78113d7d 124 cmdId = CMD_READ_SWEEP_POINTS;
nsheth 5:746e78113d7d 125 numValues /= 2;
nsheth 5:746e78113d7d 126 status = Admx200xSendCmd(pAdmx200x, &cmdId, &addr,
nsheth 5:746e78113d7d 127 (uint32_t *)&numValues, &statReg);
nsheth 5:746e78113d7d 128 }
nsheth 5:746e78113d7d 129 // Read sweep points
nsheth 5:746e78113d7d 130 if (status == 0)
nsheth 5:746e78113d7d 131 {
nsheth 5:746e78113d7d 132 status = Admx200xReadFifo(pAdmx200x, &sweepPoints[0], &numValues);
nsheth 5:746e78113d7d 133 }
nsheth 5:746e78113d7d 134
nsheth 5:746e78113d7d 135 if (status == 0)
nsheth 5:746e78113d7d 136 {
nsheth 5:746e78113d7d 137 for (i = 0; i < numValues; i++)
nsheth 5:746e78113d7d 138 {
nsheth 5:746e78113d7d 139 DisplayMeasuredValue(measurementBuffer[2 * i],
nsheth 5:746e78113d7d 140 measurementBuffer[2 * i + 1], sweepPoints[i]);
nsheth 5:746e78113d7d 141 }
nsheth 5:746e78113d7d 142 }
nsheth 5:746e78113d7d 143
nsheth 5:746e78113d7d 144 return status;
nsheth 5:746e78113d7d 145 }
nsheth 5:746e78113d7d 146
nsheth 5:746e78113d7d 147 int32_t TriggerAndMeasure()
nsheth 5:746e78113d7d 148 {
nsheth 5:746e78113d7d 149 int32_t status = 0;
nsheth 5:746e78113d7d 150 int32_t warningStatus = 0;
nsheth 5:746e78113d7d 151 uint8_t cmdId;
nsheth 5:746e78113d7d 152 uint16_t addr;
nsheth 5:746e78113d7d 153 uint32_t data;
nsheth 5:746e78113d7d 154 uint32_t statReg;
nsheth 5:746e78113d7d 155 Admx200xDev *pAdmx200x = &admx200xDev;
nsheth 5:746e78113d7d 156 uint32_t measureStatus;
nsheth 5:746e78113d7d 157 int32_t sweepType;
nsheth 5:746e78113d7d 158 addr = 0;
nsheth 5:746e78113d7d 159 data = 0;
nsheth 5:746e78113d7d 160
nsheth 5:746e78113d7d 161 /** These are required to display the output **/
nsheth 5:746e78113d7d 162
nsheth 5:746e78113d7d 163 /*
nsheth 5:746e78113d7d 164 if (status == ADMX_STATUS_SUCCESS)
nsheth 5:746e78113d7d 165 {
nsheth 5:746e78113d7d 166 status = GetAttributeInt32((0x20 + 37), &resistanceMode);
nsheth 5:746e78113d7d 167 }
nsheth 5:746e78113d7d 168 */
nsheth 5:746e78113d7d 169
nsheth 5:746e78113d7d 170 if (status == ADMX_STATUS_SUCCESS)
nsheth 5:746e78113d7d 171 {
nsheth 5:746e78113d7d 172 cmdId = CMD_Z;
nsheth 5:746e78113d7d 173 warningStatus =
nsheth 5:746e78113d7d 174 Admx200xSendCmd(pAdmx200x, &cmdId, &addr, &data, &statReg);
nsheth 5:746e78113d7d 175 if (warningStatus == ADMX_STATUS_INVALID_CURRENT_GAIN ||
nsheth 5:746e78113d7d 176 warningStatus == ADMX_STATUS_INVALID_DISPLAY_MODE ||
nsheth 5:746e78113d7d 177 warningStatus == ADMX_STATUS_UNCOMMITED_CAL ||
nsheth 5:746e78113d7d 178 warningStatus == ADMX_STATUS_SUCCESS)
nsheth 5:746e78113d7d 179 {
nsheth 5:746e78113d7d 180 warningStatus = Admx200xWaitForStatus(
nsheth 5:746e78113d7d 181 pAdmx200x, SPI_TIMEOUT, ADMX200X_STATUS_MEASURE_DONE_BITM,
nsheth 5:746e78113d7d 182 &measureStatus);
nsheth 5:746e78113d7d 183 }
nsheth 5:746e78113d7d 184 else
nsheth 5:746e78113d7d 185 {
nsheth 5:746e78113d7d 186 status = warningStatus;
nsheth 5:746e78113d7d 187 }
nsheth 5:746e78113d7d 188 //PrintWarningMessages();
nsheth 5:746e78113d7d 189 }
nsheth 5:746e78113d7d 190
nsheth 5:746e78113d7d 191 if (warningStatus == ADMX_STATUS_INVALID_CURRENT_GAIN ||
nsheth 5:746e78113d7d 192 warningStatus == ADMX_STATUS_INVALID_DISPLAY_MODE ||
nsheth 5:746e78113d7d 193 warningStatus == ADMX_STATUS_UNCOMMITED_CAL ||
nsheth 5:746e78113d7d 194 warningStatus == ADMX_STATUS_SUCCESS)
nsheth 5:746e78113d7d 195 {
nsheth 5:746e78113d7d 196 status = ReadAndDisplay((SWEEP_TYPE)sweepType);
nsheth 5:746e78113d7d 197 }
nsheth 5:746e78113d7d 198 else
nsheth 5:746e78113d7d 199 {
nsheth 5:746e78113d7d 200 // Clear the error
nsheth 5:746e78113d7d 201 Admx200xClearSPI(pAdmx200x);
nsheth 5:746e78113d7d 202 // Send abort command to bring state machine to IDLE if it got stuck
nsheth 5:746e78113d7d 203 cmdId = CMD_ABORT;
nsheth 5:746e78113d7d 204 Admx200xSendCmd(pAdmx200x, &cmdId, &addr, &data, &statReg);
nsheth 5:746e78113d7d 205 }
nsheth 5:746e78113d7d 206
nsheth 5:746e78113d7d 207 if (status == ADMX_STATUS_SUCCESS)
nsheth 5:746e78113d7d 208 {
nsheth 5:746e78113d7d 209 status = warningStatus;
nsheth 5:746e78113d7d 210 }
nsheth 5:746e78113d7d 211
nsheth 5:746e78113d7d 212 return status;
nsheth 5:746e78113d7d 213 }
nsheth 5:746e78113d7d 214
nsheth 5:746e78113d7d 215 void PrintMeasureStatusMessage(int32_t status)
nsheth 5:746e78113d7d 216 {
nsheth 5:746e78113d7d 217 switch (status)
nsheth 5:746e78113d7d 218 {
nsheth 5:746e78113d7d 219 case ADMX_STATUS_SUCCESS:
nsheth 5:746e78113d7d 220 break;
nsheth 5:746e78113d7d 221 case ADMX_STATUS_INVALID_CURRENT_GAIN:
nsheth 5:746e78113d7d 222 WARN_MSG("DC Resistance Mode: invalid current gain");
nsheth 5:746e78113d7d 223 break;
nsheth 5:746e78113d7d 224 case ADMX_STATUS_INVALID_DISPLAY_MODE:
nsheth 5:746e78113d7d 225 /** Admittance mode is not supported.Only impedance*/
nsheth 5:746e78113d7d 226 WARN_MSG("DC Resistance Mode: invalid display type");
nsheth 5:746e78113d7d 227 break;
nsheth 5:746e78113d7d 228 case ADMX_STATUS_UNCOMMITED_CAL:
nsheth 5:746e78113d7d 229 WARN_MSG("Uncommitted calibration coefficients found for (vg, ig)");
nsheth 5:746e78113d7d 230 INFO_MSG("Use cal commit to save this to flash");
nsheth 5:746e78113d7d 231 break;
nsheth 5:746e78113d7d 232 default:
nsheth 5:746e78113d7d 233 ERROR_MSG("Measurement failed");
nsheth 5:746e78113d7d 234 break;
nsheth 5:746e78113d7d 235 }
nsheth 5:746e78113d7d 236 }
nsheth 5:746e78113d7d 237
nsheth 5:746e78113d7d 238